gpii-universal
Version:
Cross platform, core components of the GPII personalization infrastructure.
232 lines (204 loc) • 9.66 kB
JavaScript
/*!
Default Settings Loader Tests
Copyright 2018 OCAD University
Licensed under the New BSD license. You may not use this file except in
compliance with this License.
You may obtain a copy of the License at
https://github.com/GPII/universal/blob/master/LICENSE.txt
*/
"use strict";
var fluid = require("infusion"),
gpii = fluid.registerNamespace("gpii"),
kettle = require("kettle"),
jqUnit = fluid.registerNamespace("jqUnit"),
fs = require("fs"),
rimraf = require("rimraf");
kettle.loadTestingSupport();
require("journal");
fluid.require("%flowManager/src/DefaultSettingsLoader.js");
fluid.registerNamespace("gpii.tests.defaultSettingsLoader");
gpii.tests.defaultSettingsLoader.testData = {
defaultSettingsUrl: "https://raw.githubusercontent.com/GPII/universal/master/testData/defaultSettings/defaultSettings.win32.json5",
gpiiSettingsDir: "%flowManager/test/data/temp",
defaultSettingsInCodeBase: "%flowManager/test/data/defaultSettings.json5",
defaultSettings: {
"solution1": "mock default settings"
},
userOwnSettings: {
"userOwnSolution": "my settings"
}
};
fluid.defaults("gpii.tests.defaultSettingsLoader", {
gradeNames: ["gpii.defaultSettingsLoader"],
members: {
// Use a temp dir to not disturb the data in the real GPII settings dir
gpiiSettingsDir: gpii.tests.defaultSettingsLoader.testData.gpiiSettingsDir
},
defaultSettingsInCodeBase: gpii.tests.defaultSettingsLoader.testData.defaultSettingsInCodeBase,
defaultSettings: gpii.tests.defaultSettingsLoader.testData.defaultSettings,
listeners: {
"onDestroy.cleanup": {
listener: "gpii.tests.defaultSettingsLoader.cleanup",
args: ["{that}.gpiiSettingsDir"]
}
}
});
// Create the initial settings file in the code base
gpii.tests.defaultSettingsLoader.prepareDefaultSettingsInCodeBase = function (gpiiSettingsDir, defaultSettingsInCodeBase, defaultSettings) {
// Create the settings dir for the test
var fullDir = fluid.module.resolvePath(gpiiSettingsDir);
if (!fs.existsSync(fullDir)) {
fs.mkdirSync(fullDir);
}
// Prepare the test by writing an initial settings file to the settings dir
var sourceSettingsFile = fluid.module.resolvePath(defaultSettingsInCodeBase);
gpii.tests.defaultSettingsLoader.createFile(sourceSettingsFile, defaultSettings);
};
gpii.tests.defaultSettingsLoader.cleanup = function (gpiiSettingsDir) {
// Remove the system settings directory
var fullDir = fluid.module.resolvePath(gpiiSettingsDir);
rimraf(fullDir, function () {
fluid.log("Cleanup: removed ", fullDir);
});
};
gpii.tests.defaultSettingsLoader.createFile = function (fileLocation, jsonContent) {
fs.writeFileSync(fileLocation, JSON.stringify(jsonContent));
};
gpii.tests.defaultSettingsLoader.verifyResultWithCopyAction = function (defaultSettingsLoader, result) {
jqUnit.assertTrue("The settings file has been copied to the settings dir", fs.existsSync(defaultSettingsLoader.defaultSettingsFile));
jqUnit.assertDeepEq("get() returns the expected settings", defaultSettingsLoader.options.defaultSettings, result);
};
// Test that the user's own settings file already exists in the settings dir
gpii.tests.defaultSettingsLoader.userOwnSettings = function (defaultSettingsLoader) {
// Create the user's own settings in the settings file at the system settings directory
fs.writeFileSync(defaultSettingsLoader.defaultSettingsFile, JSON.stringify(gpii.tests.defaultSettingsLoader.testData.userOwnSettings));
return defaultSettingsLoader.get();
};
gpii.tests.defaultSettingsLoader.verifyUserOwnSettings = function (defaultSettingsLoader, result) {
jqUnit.assertDeepNeq("The loaded settings is as expected", JSON.stringify(gpii.tests.defaultSettingsLoader.testData.userOwnSettings), result);
jqUnit.assertDeepNeq("The expected settings is different from default settings in the code base", defaultSettingsLoader.options.defaultSettings, result);
};
// ==================== Test the fetch from the remote url ====================
fluid.defaults("gpii.tests.defaultSettingsLoader.testCaseHolder.fetchRemoteUrl", {
gradeNames: ["fluid.test.testCaseHolder"],
components: {
defaultSettingsLoader: {
type: "gpii.tests.defaultSettingsLoader",
options: {
defaultSettingsUrl: gpii.tests.defaultSettingsLoader.testData.defaultSettingsUrl
}
}
},
modules: [{
name: "gpii.defaultSettingsLoader Tests - fetch default settings from the remote url",
tests: [{
expect: 1,
name: "Fetch default settings from the remote url",
task: "{defaultSettingsLoader}.get",
resolve: "jqUnit.assertNotUndefined",
resolveArgs: ["Default settings are fetched from the remote URL", "{arguments}.0"]
}]
}]
});
fluid.defaults("gpii.tests.defaultSettingsLoader.fetchRemoteUrl", {
gradeNames: ["fluid.test.testEnvironment"],
components: {
tester: {
type: "gpii.tests.defaultSettingsLoader.testCaseHolder.fetchRemoteUrl"
}
}
});
kettle.test.bootstrap("gpii.tests.defaultSettingsLoader.fetchRemoteUrl");
// ==================== Test the first fallback of reading the local default settings file ====================
fluid.defaults("gpii.tests.defaultSettingsLoader.testCaseHolder", {
gradeNames: ["fluid.test.testCaseHolder"],
components: {
defaultSettingsLoader: {
type: "gpii.tests.defaultSettingsLoader",
options: {
defaultSettingsUrl: undefined, // Cannot fetch from the remote url
listeners: {
"onCreate.prepareDefaultSettingsInCodeBase": {
listener: "gpii.tests.defaultSettingsLoader.prepareDefaultSettingsInCodeBase",
args: [
gpii.tests.defaultSettingsLoader.testData.gpiiSettingsDir,
gpii.tests.defaultSettingsLoader.testData.defaultSettingsInCodeBase,
gpii.tests.defaultSettingsLoader.testData.defaultSettings
],
priority: "before:prepareSettingsFile"
},
"onDestroy.moreCleanup": {
listener: "gpii.tests.defaultSettingsLoader.moreCleanup",
args: ["{that}.options.defaultSettingsInCodeBase"]
}
}
}
}
},
modules: [{
name: "gpii.defaultSettingsLoader Tests",
tests: [{
expect: 2,
name: "Test the fallback of reading the local default settings file - when the settings file is not initially copied to the settings dir",
task: "{defaultSettingsLoader}.get",
resolve: "gpii.tests.defaultSettingsLoader.verifyResultWithCopyAction",
resolveArgs: ["{defaultSettingsLoader}", "{arguments}.0"]
}, {
expect: 2,
name: "Test the fallback of reading the local default settings file - when users own settings file is already in the settings directory",
task: "gpii.tests.defaultSettingsLoader.userOwnSettings",
args: ["{defaultSettingsLoader}"],
resolve: "gpii.tests.defaultSettingsLoader.verifyUserOwnSettings",
resolveArgs: ["{defaultSettingsLoader}", "{arguments}.0"]
}]
}]
});
gpii.tests.defaultSettingsLoader.moreCleanup = function (defaultSettingsInCodeBase) {
// Remove the default settings file in the code base
var sourceSettingsFile = fluid.module.resolvePath(defaultSettingsInCodeBase);
fs.unlinkSync(sourceSettingsFile);
};
fluid.defaults("gpii.tests.defaultSettingsLoader.existInCodeBase", {
gradeNames: ["fluid.test.testEnvironment"],
components: {
tester: {
type: "gpii.tests.defaultSettingsLoader.testCaseHolder"
}
}
});
kettle.test.bootstrap("gpii.tests.defaultSettingsLoader.existInCodeBase");
// ==================== Test when the default settings file doesn't exist in the code base ====================
fluid.defaults("gpii.tests.defaultSettingsLoader.testCaseHolder.nonExistentInCodeBase", {
gradeNames: ["fluid.test.testCaseHolder"],
components: {
defaultSettingsLoader: {
type: "gpii.tests.defaultSettingsLoader",
options: {
defaultSettingsUrl: undefined, // Cannot fetch from the remote url
listeners: {
// Do not create the settings file either in the code base or the settings directory
"onCreate.prepareSettingsFile": "fluid.identity"
}
}
}
},
modules: [{
name: "gpii.defaultSettingsLoader Tests",
tests: [{
expect: 1,
name: "Tests when none of the remote url, the settings file in the code base and the settings directory exist",
task: "{defaultSettingsLoader}.get",
resolve: "jqUnit.assertUndefined",
resolveArgs: ["Receive undefined when the settings file in the code base does not exist", "{arguments}.0"]
}]
}]
});
fluid.defaults("gpii.tests.defaultSettingsLoader.nonExistentInCodeBase", {
gradeNames: ["fluid.test.testEnvironment"],
components: {
tester: {
type: "gpii.tests.defaultSettingsLoader.testCaseHolder.nonExistentInCodeBase"
}
}
});
kettle.test.bootstrap("gpii.tests.defaultSettingsLoader.nonExistentInCodeBase");