From b06e4d0349a1a93e54dadb20dbd44e688ab179ad Mon Sep 17 00:00:00 2001 From: Kasper Markus Date: Tue, 20 Sep 2016 17:55:27 +0200 Subject: [PATCH 1/2] GPII-2006: Now doesn't explode on reading non-existing file --- .../src/settingsHandlerUtilities.js | 11 +- .../settingsHandlers/test/data/basic.json | 3 + .../test/settingsHandlerUtilitiesTests.js | 108 ++++++++++++++++++ 3 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 gpii/node_modules/settingsHandlers/test/data/basic.json create mode 100644 gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js diff --git a/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js b/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js index eb6f12c57..dc9bb85be 100644 --- a/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js +++ b/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js @@ -321,7 +321,12 @@ gpii.settingsHandlers.setSettings = function (solutionEntry, currentSettings) { gpii.settingsHandlers.readFile = function (options) { if (!options || !options.filename) { fluid.fail("readFile: expected an options block defining filename and encoding"); + } else if (!fs.existsSync(options.filename)) { + fluid.log("readFile: No settingsfile '", options.filename, "'' exists. reporting " + + "'undefined' as current settings"); + return undefined; } + // TODO check for and handle read errors var content = fs.readFileSync(options.filename, options.encoding || "utf-8"); return content; @@ -345,9 +350,11 @@ gpii.settingsHandlers.handleFileSolutionEntry = function (solutionEntry, modifie var options = solutionEntry.options; if (options && (options.path || options.filename)) { - // read file + // read file - returns undefined if it doesn't exist var content = gpii.settingsHandlers.readFile(options); - var currentSettings = parser.parse(content, options); + // if the file is non-existing, current settings are {}, else they're the parsed content of the file + var currentSettings = (content === undefined) ? {} : parser.parse(content, options); + // modification of the entry var settings = modifier(solutionEntry, currentSettings); if (isWrite) { diff --git a/gpii/node_modules/settingsHandlers/test/data/basic.json b/gpii/node_modules/settingsHandlers/test/data/basic.json new file mode 100644 index 000000000..b46464448 --- /dev/null +++ b/gpii/node_modules/settingsHandlers/test/data/basic.json @@ -0,0 +1,3 @@ +{ + "Hello": "World" +} \ No newline at end of file diff --git a/gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js b/gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js new file mode 100644 index 000000000..5ba4427e9 --- /dev/null +++ b/gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js @@ -0,0 +1,108 @@ +/* + * Settings Handler Utilities Tests + * + * Copyright 2016 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * The research leading to these results has received funding from the European Union's + * Seventh Framework Programme (FP7/2007-2013) + * under grant agreement no. 289016. + * + * 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"), + jqUnit = fluid.registerNamespace("jqUnit"), + kettle = require("kettle"); + +fluid.registerNamespace("gpii.tests.settingsHandlers"); + +kettle.loadTestingSupport(); + +require("settingsHandlers"); + +gpii.tests.settingsHandlers.readFile = function () { + // check that we're able to read existing file: + var result = gpii.settingsHandlers.readFile({ + filename: __dirname + "/data/basic.json" + }); + jqUnit.assertDeepEq("Expecting to have read the file properly", { Hello: "World" }, JSON.parse(result)); + + // check reading non-existing file + var result = gpii.settingsHandlers.readFile({ + filename: __dirname + "/data/bogus.json" + }); + jqUnit.assertEquals("Expecting undefined on reading non-existing file", undefined, result); +}; + +var handleFileSolutionEntryData = { + existingFileSolutionEntry: { + options: { + "filename": __dirname + "/data/basic.json" + }, + settings: { + "Hello": "Mars" + } + }, + missingFileSolutionEntry: { + options: { + "filename": __dirname + "/data/bogus.json" + }, + settings: { + "Hello": "Mars" + } + } +}; + +gpii.tests.settingsHandlers.handleFileSolutionEntry = function () { + // an existing file should be parsed and the current value returned: + var result = gpii.settingsHandlers.handleFileSolutionEntry(handleFileSolutionEntryData.existingFileSolutionEntry, + gpii.settingsHandlers.getSettings, gpii.settingsHandlers.JSONSettingsHandler.parser, false); + jqUnit.assertDeepEq("Expecting to have read the file properly", { + "settings": { + "Hello": "World" + } + }, result); + + // a non-existing file should return undefined for the requested settings: + result = gpii.settingsHandlers.handleFileSolutionEntry(handleFileSolutionEntryData.missingFileSolutionEntry, + gpii.settingsHandlers.getSettings, gpii.settingsHandlers.JSONSettingsHandler.parser, false); + jqUnit.assertDeepEq("Expecting to get 'undefined' values for settings requested", { + "settings": { + "Hello": undefined + } + }, result); +}; + +fluid.defaults("gpii.tests.settingsHandlers.env", { + gradeNames: ["fluid.test.testEnvironment"], + components: { + tester: { + type: "gpii.tests.settingsHandlers.caseHolder" + } + } +}); + +fluid.defaults("gpii.tests.settingsHandlers.caseHolder", { + gradeNames: ["fluid.test.testCaseHolder"], + modules: [{ + name: "File Dependency Methods tests", + tests: [{ + expect: 2, + name: "gpii.settingsHandlers.readFile tests", + func: "gpii.tests.settingsHandlers.readFile" + }, { + expect: 2, + name: "gpii.settingsHandlers.handleFileSolutionEntry tests", + func: "gpii.tests.settingsHandlers.handleFileSolutionEntry" + }] + }] +}); + +module.exports = kettle.test.bootstrap("gpii.tests.settingsHandlers.env"); From c42a9bd0ef4933837dadeef4b5126ab88e4bdd41 Mon Sep 17 00:00:00 2001 From: Kasper Markus Date: Tue, 20 Sep 2016 17:55:27 +0200 Subject: [PATCH 2/2] GPII-2006: Now doesn't explode on reading non-existing file --- .../src/settingsHandlerUtilities.js | 11 +- .../settingsHandlers/test/data/basic.json | 3 + .../test/settingsHandlerUtilitiesTests.js | 108 ++++++++++++++++++ tests/all-tests.js | 1 + 4 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 gpii/node_modules/settingsHandlers/test/data/basic.json create mode 100644 gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js diff --git a/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js b/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js index eb6f12c57..dc9bb85be 100644 --- a/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js +++ b/gpii/node_modules/settingsHandlers/src/settingsHandlerUtilities.js @@ -321,7 +321,12 @@ gpii.settingsHandlers.setSettings = function (solutionEntry, currentSettings) { gpii.settingsHandlers.readFile = function (options) { if (!options || !options.filename) { fluid.fail("readFile: expected an options block defining filename and encoding"); + } else if (!fs.existsSync(options.filename)) { + fluid.log("readFile: No settingsfile '", options.filename, "'' exists. reporting " + + "'undefined' as current settings"); + return undefined; } + // TODO check for and handle read errors var content = fs.readFileSync(options.filename, options.encoding || "utf-8"); return content; @@ -345,9 +350,11 @@ gpii.settingsHandlers.handleFileSolutionEntry = function (solutionEntry, modifie var options = solutionEntry.options; if (options && (options.path || options.filename)) { - // read file + // read file - returns undefined if it doesn't exist var content = gpii.settingsHandlers.readFile(options); - var currentSettings = parser.parse(content, options); + // if the file is non-existing, current settings are {}, else they're the parsed content of the file + var currentSettings = (content === undefined) ? {} : parser.parse(content, options); + // modification of the entry var settings = modifier(solutionEntry, currentSettings); if (isWrite) { diff --git a/gpii/node_modules/settingsHandlers/test/data/basic.json b/gpii/node_modules/settingsHandlers/test/data/basic.json new file mode 100644 index 000000000..b46464448 --- /dev/null +++ b/gpii/node_modules/settingsHandlers/test/data/basic.json @@ -0,0 +1,3 @@ +{ + "Hello": "World" +} \ No newline at end of file diff --git a/gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js b/gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js new file mode 100644 index 000000000..5ba4427e9 --- /dev/null +++ b/gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js @@ -0,0 +1,108 @@ +/* + * Settings Handler Utilities Tests + * + * Copyright 2016 Raising the Floor - International + * + * Licensed under the New BSD license. You may not use this file except in + * compliance with this License. + * + * The research leading to these results has received funding from the European Union's + * Seventh Framework Programme (FP7/2007-2013) + * under grant agreement no. 289016. + * + * 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"), + jqUnit = fluid.registerNamespace("jqUnit"), + kettle = require("kettle"); + +fluid.registerNamespace("gpii.tests.settingsHandlers"); + +kettle.loadTestingSupport(); + +require("settingsHandlers"); + +gpii.tests.settingsHandlers.readFile = function () { + // check that we're able to read existing file: + var result = gpii.settingsHandlers.readFile({ + filename: __dirname + "/data/basic.json" + }); + jqUnit.assertDeepEq("Expecting to have read the file properly", { Hello: "World" }, JSON.parse(result)); + + // check reading non-existing file + var result = gpii.settingsHandlers.readFile({ + filename: __dirname + "/data/bogus.json" + }); + jqUnit.assertEquals("Expecting undefined on reading non-existing file", undefined, result); +}; + +var handleFileSolutionEntryData = { + existingFileSolutionEntry: { + options: { + "filename": __dirname + "/data/basic.json" + }, + settings: { + "Hello": "Mars" + } + }, + missingFileSolutionEntry: { + options: { + "filename": __dirname + "/data/bogus.json" + }, + settings: { + "Hello": "Mars" + } + } +}; + +gpii.tests.settingsHandlers.handleFileSolutionEntry = function () { + // an existing file should be parsed and the current value returned: + var result = gpii.settingsHandlers.handleFileSolutionEntry(handleFileSolutionEntryData.existingFileSolutionEntry, + gpii.settingsHandlers.getSettings, gpii.settingsHandlers.JSONSettingsHandler.parser, false); + jqUnit.assertDeepEq("Expecting to have read the file properly", { + "settings": { + "Hello": "World" + } + }, result); + + // a non-existing file should return undefined for the requested settings: + result = gpii.settingsHandlers.handleFileSolutionEntry(handleFileSolutionEntryData.missingFileSolutionEntry, + gpii.settingsHandlers.getSettings, gpii.settingsHandlers.JSONSettingsHandler.parser, false); + jqUnit.assertDeepEq("Expecting to get 'undefined' values for settings requested", { + "settings": { + "Hello": undefined + } + }, result); +}; + +fluid.defaults("gpii.tests.settingsHandlers.env", { + gradeNames: ["fluid.test.testEnvironment"], + components: { + tester: { + type: "gpii.tests.settingsHandlers.caseHolder" + } + } +}); + +fluid.defaults("gpii.tests.settingsHandlers.caseHolder", { + gradeNames: ["fluid.test.testCaseHolder"], + modules: [{ + name: "File Dependency Methods tests", + tests: [{ + expect: 2, + name: "gpii.settingsHandlers.readFile tests", + func: "gpii.tests.settingsHandlers.readFile" + }, { + expect: 2, + name: "gpii.settingsHandlers.handleFileSolutionEntry tests", + func: "gpii.tests.settingsHandlers.handleFileSolutionEntry" + }] + }] +}); + +module.exports = kettle.test.bootstrap("gpii.tests.settingsHandlers.env"); diff --git a/tests/all-tests.js b/tests/all-tests.js index bb78d2baa..0198103a5 100644 --- a/tests/all-tests.js +++ b/tests/all-tests.js @@ -59,6 +59,7 @@ var testIncludes = [ "../gpii/node_modules/settingsHandlers/test/XMLSettingsHandlerTests.js", "../gpii/node_modules/settingsHandlers/test/INISettingsHandlerTests.js", "../gpii/node_modules/settingsHandlers/test/WebSocketsSettingsHandlerTests.js", + "../gpii/node_modules/settingsHandlers/test/settingsHandlerUtilitiesTests.js", "../gpii/node_modules/preferencesServer/test/preferencesServerTests.js", "../gpii/node_modules/rawPreferencesServer/test/RawPreferencesTest.js", "../gpii/node_modules/ontologyHandler/test/node/OntologyHandlerTests.js",