From 86fdd91597b7a1d46647be6ac081049f0b954f09 Mon Sep 17 00:00:00 2001 From: Sergey Morozov Date: Tue, 31 Jan 2017 10:37:03 -0800 Subject: [PATCH 1/2] Restructured Test Suite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - separated tests into e2e and unit directories - created configs directory structure to support test framework - added/modified `npm run test`, `npm run test:unit` and `npm run test:e2e` to target all, unit and e2e tests respectively - modified some of the test names to be more descriptive New structure of the Test Suite has following directory tree: ``` tests ├── configs │   ├── env.js │   └── modules │   ├── clock │   │   ├── clock_12hr.js │   │   ├── clock_24hr.js │   │   └── clock_showPeriodUpper.js │   └── helloworld │   └── helloworld.js ├── e2e │   ├── env_spec.js │   └── modules │   ├── clock_spec.js │   └── helloworld_spec.js └── unit ├── functions │   └── cmp_versions_spec.js └── global_vars └── root_path_spec.js ``` --- CHANGELOG.md | 2 + js/server.js | 2 +- package.json | 3 +- tests/{confs => configs}/env.js | 0 tests/configs/modules/clock/clock_12hr.js | 29 +++++ tests/configs/modules/clock/clock_24hr.js | 29 +++++ .../modules/clock/clock_showPeriodUpper.js | 32 ++++++ .../modules/helloworld}/helloworld.js | 0 tests/e2e/{env.js => env_spec.js} | 14 ++- tests/e2e/modules/clock_spec.js | 103 ++++++++++++++++++ .../{helloworld.js => helloworld_spec.js} | 8 +- .../functions/cmp_versions_spec.js} | 4 +- .../global_vars/root_path_spec.js} | 6 +- 13 files changed, 217 insertions(+), 15 deletions(-) rename tests/{confs => configs}/env.js (100%) create mode 100644 tests/configs/modules/clock/clock_12hr.js create mode 100644 tests/configs/modules/clock/clock_24hr.js create mode 100644 tests/configs/modules/clock/clock_showPeriodUpper.js rename tests/{confs => configs/modules/helloworld}/helloworld.js (100%) rename tests/e2e/{env.js => env_spec.js} (77%) create mode 100644 tests/e2e/modules/clock_spec.js rename tests/e2e/modules/{helloworld.js => helloworld_spec.js} (86%) rename tests/{functions/compare-version.js => unit/functions/cmp_versions_spec.js} (80%) rename tests/{global_vars/root_path.js => unit/global_vars/root_path_spec.js} (68%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bb9e8f09e..2f91f5708b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Show the splash screen image even when is reboot or halted. - Added some missing translaton strings in the sv.json file. - Run task jsonlint to check translation files. +- Restructured Test Suite ### Added - Calendar-specific support for `maximumEntries`, and ` maximumNumberOfDays` @@ -37,6 +38,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Add test e2e helloworld - Add test e2e enviroment - Add `chai-as-promised` npm module to devDependencies +- Basic set of tests for clock module ### Fixed - Update .gitignore to not ignore default modules folder. diff --git a/js/server.js b/js/server.js index e7050021d6..36cfe8d201 100644 --- a/js/server.js +++ b/js/server.js @@ -37,7 +37,7 @@ var Server = function(config, callback) { app.use("/modules", express.static(path.resolve(global.root_path + "/modules"))); app.use("/vendor", express.static(path.resolve(global.root_path + "/vendor"))); app.use("/translations", express.static(path.resolve(global.root_path + "/translations"))); - app.use("/tests/confs", express.static(path.resolve(global.root_path + "/tests/confs"))); + app.use("/tests/configs", express.static(path.resolve(global.root_path + "/tests/configs"))); app.get("/version", function(req,res) { res.send(global.version); diff --git a/package.json b/package.json index c5f6db99e1..4be053c694 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "start": "sh run-start.sh", "postinstall": "sh installers/postinstall/postinstall.sh", - "test": "./node_modules/mocha/bin/mocha $(find tests -path '*js*' ! -ipath '*e2e*')", + "test": "./node_modules/mocha/bin/mocha tests/unit --recursive", + "test:unit": "./node_modules/mocha/bin/mocha tests/unit --recursive", "test:e2e": "./node_modules/mocha/bin/mocha tests/e2e --recursive" }, "repository": { diff --git a/tests/confs/env.js b/tests/configs/env.js similarity index 100% rename from tests/confs/env.js rename to tests/configs/env.js diff --git a/tests/configs/modules/clock/clock_12hr.js b/tests/configs/modules/clock/clock_12hr.js new file mode 100644 index 0000000000..31f9e4ea2a --- /dev/null +++ b/tests/configs/modules/clock/clock_12hr.js @@ -0,0 +1,29 @@ +/* Magic Mirror Test config for default clock module + * + * By Sergey Morozov + * MIT Licensed. + */ + +var config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + + language: "en", + timeFormat: 12, + units: "metric", + electronOptions: { + webPreferences: { + nodeIntegration: true, + }, + }, + + modules: [ + { + module: "clock", + position: "middle_center" + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/configs/modules/clock/clock_24hr.js b/tests/configs/modules/clock/clock_24hr.js new file mode 100644 index 0000000000..e5dd89f6e0 --- /dev/null +++ b/tests/configs/modules/clock/clock_24hr.js @@ -0,0 +1,29 @@ +/* Magic Mirror Test config for default clock module + * + * By Sergey Morozov + * MIT Licensed. + */ + +var config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + + language: "en", + timeFormat: 24, + units: "metric", + electronOptions: { + webPreferences: { + nodeIntegration: true, + }, + }, + + modules: [ + { + module: "clock", + position: "middle_center" + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/configs/modules/clock/clock_showPeriodUpper.js b/tests/configs/modules/clock/clock_showPeriodUpper.js new file mode 100644 index 0000000000..e7ee7d0ad7 --- /dev/null +++ b/tests/configs/modules/clock/clock_showPeriodUpper.js @@ -0,0 +1,32 @@ +/* Magic Mirror Test config for default clock module + * + * By Sergey Morozov + * MIT Licensed. + */ + +var config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + + language: "en", + timeFormat: 12, + units: "metric", + electronOptions: { + webPreferences: { + nodeIntegration: true, + }, + }, + + modules: [ + { + module: "clock", + position: "middle_center", + config: { + showPeriodUpper: true + } + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/confs/helloworld.js b/tests/configs/modules/helloworld/helloworld.js similarity index 100% rename from tests/confs/helloworld.js rename to tests/configs/modules/helloworld/helloworld.js diff --git a/tests/e2e/env.js b/tests/e2e/env_spec.js similarity index 77% rename from tests/e2e/env.js rename to tests/e2e/env_spec.js index 413864993d..77cd418bd3 100644 --- a/tests/e2e/env.js +++ b/tests/e2e/env_spec.js @@ -3,9 +3,6 @@ const path = require("path"); const chai = require("chai"); const chaiAsPromised = require("chai-as-promised"); -// Set config sample for use in test -process.env.MM_CONFIG_FILE = "tests/confs/env.js"; - var electronPath = path.join(__dirname, "../../", "node_modules", ".bin", "electron"); if (process.platform === "win32") { @@ -24,9 +21,14 @@ global.before(function () { chai.use(chaiAsPromised); }); -describe("Test enviroment app electron", function () { +describe("Electron app environment", function () { this.timeout(10000); + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/env.js"; + }); + beforeEach(function (done) { app.start().then(function() { done(); } ); }); @@ -36,12 +38,12 @@ describe("Test enviroment app electron", function () { }); - it("open a window app and test if is open", function () { + it("is set to open new app window", function () { return app.client.waitUntilWindowLoaded() .getWindowCount().should.eventually.equal(1); }); - it("tests the title", function () { + it("sets correct window title", function () { return app.client.waitUntilWindowLoaded() .getTitle().should.eventually.equal("Magic Mirror"); }); diff --git a/tests/e2e/modules/clock_spec.js b/tests/e2e/modules/clock_spec.js new file mode 100644 index 0000000000..0275aec11c --- /dev/null +++ b/tests/e2e/modules/clock_spec.js @@ -0,0 +1,103 @@ +const Application = require("spectron").Application; +const path = require("path"); +const chai = require("chai"); +const chaiAsPromised = require("chai-as-promised"); + + + +var electronPath = path.join(__dirname, "../../../", "node_modules", ".bin", "electron"); + +if (process.platform === "win32") { + electronPath += ".cmd"; +} + +var appPath = path.join(__dirname, "../../../js/electron.js"); + +var app = new Application({ + path: electronPath, + args: [appPath] +}); + +global.before(function () { + chai.should(); + chai.use(chaiAsPromised); +}); + +describe("Clock module", function () { + this.timeout(10000); + + describe("with default 24hr clock config", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_24hr.js"; + }); + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + it("shows date with correct format", function () { + const dateRegex = /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}$/; + return app.client.waitUntilWindowLoaded() + .getText(".clock .date").should.eventually.match(dateRegex); + }); + + it("shows time in 24hr format", function() { + const timeRegex = /^(?:2[0-3]|[01]\d):[0-5]\d[0-5]\d$/ + return app.client.waitUntilWindowLoaded() + .getText(".clock .time").should.eventually.match(timeRegex); + }); + }); + + describe("with default 12hr clock config", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_12hr.js"; + }); + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + it("shows date with correct format", function () { + const dateRegex = /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}$/; + return app.client.waitUntilWindowLoaded() + .getText(".clock .date").should.eventually.match(dateRegex); + }); + + it("shows time in 12hr format", function() { + const timeRegex = /^(?:1[0-2]|[0]\d):[0-5]\d[0-5]\d[ap]m$/; + return app.client.waitUntilWindowLoaded() + .getText(".clock .time").should.eventually.match(timeRegex); + }); + }); + + describe("with showPeriodUpper config enabled", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_showPeriodUpper.js"; + }); + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + it("shows 12hr time with upper case AM/PM", function() { + const timeRegex = /^(?:1[0-2]|[0]\d):[0-5]\d[0-5]\d[AP]M$/; + return app.client.waitUntilWindowLoaded() + .getText(".clock .time").should.eventually.match(timeRegex); + }); + }); +}); diff --git a/tests/e2e/modules/helloworld.js b/tests/e2e/modules/helloworld_spec.js similarity index 86% rename from tests/e2e/modules/helloworld.js rename to tests/e2e/modules/helloworld_spec.js index ebf8a8d16a..7bb13381d9 100644 --- a/tests/e2e/modules/helloworld.js +++ b/tests/e2e/modules/helloworld_spec.js @@ -3,8 +3,7 @@ const path = require("path"); const chai = require("chai"); const chaiAsPromised = require("chai-as-promised"); -// Set config sample for use in test -process.env.MM_CONFIG_FILE = "tests/confs/helloworld.js"; + var electronPath = path.join(__dirname, "../../../", "node_modules", ".bin", "electron"); @@ -27,6 +26,11 @@ global.before(function () { describe("Test helloworld module", function () { this.timeout(10000); + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/helloworld/helloworld.js"; + }); + beforeEach(function (done) { app.start().then(function() { done(); } ); }); diff --git a/tests/functions/compare-version.js b/tests/unit/functions/cmp_versions_spec.js similarity index 80% rename from tests/functions/compare-version.js rename to tests/unit/functions/cmp_versions_spec.js index 8cc22101e8..9f3793c00d 100644 --- a/tests/functions/compare-version.js +++ b/tests/unit/functions/cmp_versions_spec.js @@ -1,7 +1,7 @@ var chai = require("chai"); var expect = chai.expect; -var classMM = require("../../js/class.js"); // require for load module.js -var moduleMM = require("../../js/module.js") +var classMM = require("../../../js/class.js"); // require for load module.js +var moduleMM = require("../../../js/module.js") describe("Test function cmpVersions in js/module.js", function() { diff --git a/tests/global_vars/root_path.js b/tests/unit/global_vars/root_path_spec.js similarity index 68% rename from tests/global_vars/root_path.js rename to tests/unit/global_vars/root_path_spec.js index 04edc03f45..f21d3e4434 100644 --- a/tests/global_vars/root_path.js +++ b/tests/unit/global_vars/root_path_spec.js @@ -3,8 +3,8 @@ var path = require("path"); var chai = require("chai"); var expect = chai.expect; -describe("Test global.root_path, set in js/app.js", function() { - var appMM = require("../../js/app.js") +describe("'global.root_path' set in js/app.js", function() { + var appMM = require("../../../js/app.js") var expectedSubPaths = [ "modules", @@ -17,7 +17,7 @@ describe("Test global.root_path, set in js/app.js", function() { ]; expectedSubPaths.forEach(subpath => { - it(`should contain a file/folder "${subpath}"`, function() { + it(`contains a file/folder "${subpath}"`, function() { expect(fs.existsSync(path.join(global.root_path, subpath))).to.equal(true); }); }); From fc2a554415922b61baab72f8e62743d504b1165d Mon Sep 17 00:00:00 2001 From: Sergey Morozov Date: Tue, 31 Jan 2017 12:24:11 -0800 Subject: [PATCH 2/2] fix for 12hr regex thanks to @roramirez for testing and catching it. --- tests/e2e/modules/clock_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/modules/clock_spec.js b/tests/e2e/modules/clock_spec.js index 0275aec11c..860cc6f040 100644 --- a/tests/e2e/modules/clock_spec.js +++ b/tests/e2e/modules/clock_spec.js @@ -74,7 +74,7 @@ describe("Clock module", function () { }); it("shows time in 12hr format", function() { - const timeRegex = /^(?:1[0-2]|[0]\d):[0-5]\d[0-5]\d[ap]m$/; + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[ap]m$/; return app.client.waitUntilWindowLoaded() .getText(".clock .time").should.eventually.match(timeRegex); }); @@ -95,7 +95,7 @@ describe("Clock module", function () { }); it("shows 12hr time with upper case AM/PM", function() { - const timeRegex = /^(?:1[0-2]|[0]\d):[0-5]\d[0-5]\d[AP]M$/; + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[AP]M$/; return app.client.waitUntilWindowLoaded() .getText(".clock .time").should.eventually.match(timeRegex); });