diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bb9e8f0..2f91f570 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 e7050021..36cfe8d2 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 c5f6db99..4be053c6 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 00000000..31f9e4ea --- /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 00000000..e5dd89f6 --- /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 00000000..e7ee7d0a --- /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 41386499..77cd418b 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 00000000..0275aec1 --- /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 ebf8a8d1..7bb13381 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 8cc22101..9f3793c0 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 04edc03f..f21d3e44 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); }); });