UNPKG

gpii-universal

Version:

Cross platform, core components of the GPII personalization infrastructure.

232 lines (204 loc) 9.66 kB
/*! 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");