From 318c8c68b0195f5deacbcd3389da1401c2b6d6d4 Mon Sep 17 00:00:00 2001 From: Bas van Wetten Date: Sat, 22 Jul 2017 15:40:35 +0200 Subject: [PATCH] Change suggestion for e2e testing - Changed global-setup.js to allow for easier test creation - Changed each e2e test suite to work with new global-setup.js - All tests (except for dev_console.js) now work with Travis CI --- .travis.yml | 3 +- js/electron.js | 7 +- package.json | 2 +- tests/e2e_new/dev_console.js | 66 +++++++++++++ tests/e2e_new/env_spec.js | 69 ++++++++++++++ tests/e2e_new/global-setup.js | 62 +++++++++++++ tests/e2e_new/ipWhistlist_spec.js | 53 +++++++++++ tests/e2e_new/modules/calendar_spec.js | 106 +++++++++++++++++++++ tests/e2e_new/modules/clock_es_spec.js | 76 +++++++++++++++ tests/e2e_new/modules/clock_spec.js | 108 ++++++++++++++++++++++ tests/e2e_new/modules/compliments_spec.js | 95 +++++++++++++++++++ tests/e2e_new/modules/helloworld_spec.js | 39 ++++++++ tests/e2e_new/modules/newsfeed_spec.js | 40 ++++++++ tests/e2e_new/modules_position_spec.js | 50 ++++++++++ tests/e2e_new/port_config.js | 60 ++++++++++++ tests/e2e_new/vendor_spec.js | 43 +++++++++ tests/e2e_new/without_modules.js | 43 +++++++++ tests/servers/basic-auth.js | 31 ++++--- 18 files changed, 934 insertions(+), 19 deletions(-) create mode 100644 tests/e2e_new/dev_console.js create mode 100644 tests/e2e_new/env_spec.js create mode 100644 tests/e2e_new/global-setup.js create mode 100644 tests/e2e_new/ipWhistlist_spec.js create mode 100644 tests/e2e_new/modules/calendar_spec.js create mode 100644 tests/e2e_new/modules/clock_es_spec.js create mode 100644 tests/e2e_new/modules/clock_spec.js create mode 100644 tests/e2e_new/modules/compliments_spec.js create mode 100644 tests/e2e_new/modules/helloworld_spec.js create mode 100644 tests/e2e_new/modules/newsfeed_spec.js create mode 100644 tests/e2e_new/modules_position_spec.js create mode 100644 tests/e2e_new/port_config.js create mode 100644 tests/e2e_new/vendor_spec.js create mode 100644 tests/e2e_new/without_modules.js diff --git a/.travis.yml b/.travis.yml index daf0ff88..1e3b6a9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,8 @@ before_script: - sleep 5 script: - grunt -- npm run test +- npm run test:unit +- npm run test:e2e cache: directories: - node_modules diff --git a/js/electron.js b/js/electron.js index 7003218a..84842ed2 100644 --- a/js/electron.js +++ b/js/electron.js @@ -17,7 +17,6 @@ const BrowserWindow = electron.BrowserWindow; let mainWindow; function createWindow() { - var electronOptionsDefaults = { width: 800, height: 600, @@ -47,7 +46,7 @@ function createWindow() { // and load the index.html of the app. // If config.address is not defined or is an empty string (listening on all interfaces), connect to localhost - var address = config.address === void 0 | config.address === "" ? config.address = "localhost" : config.address; + var address = (config.address === void 0) | (config.address === "") ? (config.address = "localhost") : config.address; mainWindow.loadURL(`http://${address}:${config.port}`); // Open the DevTools if run with "npm start dev" @@ -100,7 +99,7 @@ app.on("activate", function() { // Start the core application if server is run on localhost // This starts all node helpers and starts the webserver. if (["localhost", "127.0.0.1", "::1", "::ffff:127.0.0.1", undefined].indexOf(config.address) > -1) { - core.start(function (c) { + core.start(function(c) { config = c; }); -} \ No newline at end of file +} diff --git a/package.json b/package.json index fe64cc41..b184f92e 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "postinstall": "sh installers/postinstall/postinstall.sh", "test": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests --recursive", "test:unit": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/unit --recursive", - "test:e2e": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/e2e --recursive", + "test:e2e": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/e2e_new --recursive", "config:check": "node tests/configs/check_config.js" }, "repository": { diff --git a/tests/e2e_new/dev_console.js b/tests/e2e_new/dev_console.js new file mode 100644 index 00000000..42530a38 --- /dev/null +++ b/tests/e2e_new/dev_console.js @@ -0,0 +1,66 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Development console tests", function() { + // This tests fail and crash another tests + // Suspect problem with window focus + // FIXME + return false; + + helpers.setupTimeout(this); + + var app = null; + + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/env.js"; + }); + + describe("Without 'dev' commandline argument", function() { + before(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + after(function() { + return helpers.stopApplication(app); + }); + + it("should not open dev console when absent", function() { + return expect(app.browserWindow.isDevToolsOpened()).to.eventually.equal(false); + }); + }); + + describe("With 'dev' commandline argument", function() { + before(function() { + return helpers + .startApplication({ + args: ["js/electron.js", "dev"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + after(function() { + return helpers.stopApplication(app); + }); + + it("should open dev console when provided", function() { + return expect(app.browserWindow.isDevToolsOpened()).to.eventually.equal(true); + }); + }); +}); diff --git a/tests/e2e_new/env_spec.js b/tests/e2e_new/env_spec.js new file mode 100644 index 00000000..50be0825 --- /dev/null +++ b/tests/e2e_new/env_spec.js @@ -0,0 +1,69 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Electron app environment", function() { + helpers.setupTimeout(this); + + var app = null; + + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/env.js"; + }); + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + it("should open a browserwindow", function() { + return app.client + .waitUntilWindowLoaded() + .browserWindow.focus() + .getWindowCount() + .should.eventually.equal(1) + .browserWindow.isMinimized() + .should.eventually.be.false.browserWindow.isDevToolsOpened() + .should.eventually.be.false.browserWindow.isVisible() + .should.eventually.be.true.browserWindow.isFocused() + .should.eventually.be.true.browserWindow.getBounds() + .should.eventually.have.property("width") + .and.be.above(0) + .browserWindow.getBounds() + .should.eventually.have.property("height") + .and.be.above(0) + .browserWindow.getTitle() + .should.eventually.equal("Magic Mirror"); + }); + + it("get request from http://localhost:8080 should return 200", function(done) { + request.get("http://localhost:8080", function(err, res, body) { + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it("get request from http://localhost:8080/nothing should return 404", function(done) { + request.get("http://localhost:8080/nothing", function(err, res, body) { + expect(res.statusCode).to.equal(404); + done(); + }); + }); +}); diff --git a/tests/e2e_new/global-setup.js b/tests/e2e_new/global-setup.js new file mode 100644 index 00000000..6bfe11d0 --- /dev/null +++ b/tests/e2e_new/global-setup.js @@ -0,0 +1,62 @@ +/* + * Magic Mirror + * + * Global Setup Test Suite + * + * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com + * MIT Licensed. + * +*/ + +const Application = require("spectron").Application; +const assert = require("assert"); +const chai = require("chai"); +const chaiAsPromised = require("chai-as-promised"); + +const path = require("path"); + +global.before(function() { + chai.should(); + chai.use(chaiAsPromised); +}); + +exports.getElectronPath = function() { + var electronPath = path.join(__dirname, "..", "..", "node_modules", ".bin", "electron"); + if (process.platform === "win32") { + electronPath += ".cmd"; + } + return electronPath; +}; + +// Set timeout - if this is run within Travis, increase timeout +exports.setupTimeout = function(test) { + if (process.env.CI) { + test.timeout(30000); + } else { + test.timeout(10000); + } +}; + +exports.startApplication = function(options) { + options.path = exports.getElectronPath(); + if (process.env.CI) { + options.startTimeout = 30000; + } + + var app = new Application(options); + return app.start().then(function() { + assert.equal(app.isRunning(), true); + chaiAsPromised.transferPromiseness = app.transferPromiseness; + return app; + }); +}; + +exports.stopApplication = function(app) { + if (!app || !app.isRunning()) { + return; + } + + return app.stop().then(function() { + assert.equal(app.isRunning(), false); + }); +}; diff --git a/tests/e2e_new/ipWhistlist_spec.js b/tests/e2e_new/ipWhistlist_spec.js new file mode 100644 index 00000000..ef89aa24 --- /dev/null +++ b/tests/e2e_new/ipWhistlist_spec.js @@ -0,0 +1,53 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("ipWhitelist directive configuration", function () { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function () { + return helpers.startApplication({ + args: ["js/electron.js"] + }).then(function (startedApp) { app = startedApp; }) + }); + + afterEach(function () { + return helpers.stopApplication(app); + }); + + describe("Set ipWhitelist without access", function () { + before(function () { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/noIpWhiteList.js"; + }); + it("should return 403", function (done) { + request.get("http://localhost:8080", function (err, res, body) { + expect(res.statusCode).to.equal(403); + done(); + }); + }); + }); + + describe("Set ipWhitelist []", function () { + before(function () { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/empty_ipWhiteList.js"; + }); + it("should return 200", function (done) { + request.get("http://localhost:8080", function (err, res, body) { + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + +}); diff --git a/tests/e2e_new/modules/calendar_spec.js b/tests/e2e_new/modules/calendar_spec.js new file mode 100644 index 00000000..a1fe8503 --- /dev/null +++ b/tests/e2e_new/modules/calendar_spec.js @@ -0,0 +1,106 @@ +const helpers = require("../global-setup"); +const path = require("path"); +const request = require("request"); +const serverBasicAuth = require("../../servers/basic-auth.js"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Calendar module", function() { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + describe("Default configuration", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/calendar/default.js"; + }); + + it("Should return TestEvents", function() { + return app.client.waitUntilTextExists(".calendar", "TestEvent", 10000); + }); + }); + + describe("Basic auth", function() { + before(function() { + serverBasicAuth.listen(8010); + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/calendar/basic-auth.js"; + }); + + after(function(done) { + serverBasicAuth.close(done()); + }); + + it("Should return TestEvents", function() { + return app.client.waitUntilTextExists(".calendar", "TestEvent", 10000); + }); + }); + + describe("Basic auth by default", function() { + before(function() { + serverBasicAuth.listen(8011); + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/calendar/auth-default.js"; + }); + + after(function(done) { + serverBasicAuth.close(done()); + }); + + it("Should return TestEvents", function() { + return app.client.waitUntilTextExists(".calendar", "TestEvent", 10000); + }); + }); + + describe("Basic auth backward compatibilty configuration", function() { + before(function() { + serverBasicAuth.listen(8012); + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/calendar/old-basic-auth.js"; + }); + + after(function(done) { + serverBasicAuth.close(done()); + }); + + it("Should return TestEvents", function() { + return app.client.waitUntilTextExists(".calendar", "TestEvent", 10000); + }); + }); + + describe("Fail Basic auth", function() { + before(function() { + serverBasicAuth.listen(8020); + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/calendar/fail-basic-auth.js"; + }); + + after(function(done) { + serverBasicAuth.close(done()); + }); + + it("Should return No upcoming events", function() { + return app.client.waitUntilTextExists(".calendar", "No upcoming events.", 10000); + }); + }); +}); diff --git a/tests/e2e_new/modules/clock_es_spec.js b/tests/e2e_new/modules/clock_es_spec.js new file mode 100644 index 00000000..5f17fd9d --- /dev/null +++ b/tests/e2e_new/modules/clock_es_spec.js @@ -0,0 +1,76 @@ +const helpers = require("../global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Clock set to spanish language module", function() { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + 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/es/clock_24hr.js"; + }); + + it("shows date with correct format", function() { + const dateRegex = /^(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo), \d{1,2} de (?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) de \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/es/clock_12hr.js"; + }); + + it("shows date with correct format", function() { + const dateRegex = /^(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo), \d{1,2} de (?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) de \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]|[1-9]):[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/es/clock_showPeriodUpper.js"; + }); + + it("shows 12hr time with upper case AM/PM", function() { + 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); + }); + }); +}); diff --git a/tests/e2e_new/modules/clock_spec.js b/tests/e2e_new/modules/clock_spec.js new file mode 100644 index 00000000..e342242c --- /dev/null +++ b/tests/e2e_new/modules/clock_spec.js @@ -0,0 +1,108 @@ +const helpers = require("../global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Clock module", function() { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + 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"; + }); + + 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"; + }); + + 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]|[1-9]):[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"; + }); + + it("shows 12hr time with upper case AM/PM", function() { + 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); + }); + }); + + describe("with displaySeconds config disabled", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_displaySeconds_false.js"; + }); + + it("shows 12hr time without seconds am/pm", function() { + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[ap]m$/; + return app.client.waitUntilWindowLoaded().getText(".clock .time").should.eventually.match(timeRegex); + }); + }); + + describe("with showWeek config enabled", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_showWeek.js"; + }); + + it("shows week with correct format", function() { + const weekRegex = /^Week [0-9]{1,2}$/; + return app.client.waitUntilWindowLoaded().getText(".clock .week").should.eventually.match(weekRegex); + }); + + it("shows week with correct number of week of year", function() { + it("FIXME: if the day is a sunday this not match"); + // const currentWeekNumber = require("current-week-number")(); + // const weekToShow = "Week " + currentWeekNumber; + // return app.client.waitUntilWindowLoaded() + // .getText(".clock .week").should.eventually.equal(weekToShow); + }); + }); +}); diff --git a/tests/e2e_new/modules/compliments_spec.js b/tests/e2e_new/modules/compliments_spec.js new file mode 100644 index 00000000..a840981e --- /dev/null +++ b/tests/e2e_new/modules/compliments_spec.js @@ -0,0 +1,95 @@ +const helpers = require("../global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Compliments module", function() { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + describe("parts of days", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_parts_day.js"; + }); + + it("if Morning compliments for that part of day", function() { + var hour = new Date().getHours(); + if (hour >= 3 && hour < 12) { + // if morning check + return app.client.waitUntilWindowLoaded().getText(".compliments").then(function(text) { + expect(text).to.be.oneOf(["Hi", "Good Morning", "Morning test"]); + }); + } + }); + + it("if Afternoon show Compliments for that part of day", function() { + var hour = new Date().getHours(); + if (hour >= 12 && hour < 17) { + // if morning check + return app.client.waitUntilWindowLoaded().getText(".compliments").then(function(text) { + expect(text).to.be.oneOf(["Hello", "Good Afternoon", "Afternoon test"]); + }); + } + }); + + it("if Evening show Compliments for that part of day", function() { + var hour = new Date().getHours(); + if (!(hour >= 3 && hour < 12) && !(hour >= 12 && hour < 17)) { + // if evening check + return app.client.waitUntilWindowLoaded().getText(".compliments").then(function(text) { + expect(text).to.be.oneOf(["Hello There", "Good Evening", "Evening test"]); + }); + } + }); + }); + + describe("Feature anytime in compliments module", function() { + describe("Set anytime and empty compliments for morning, evening and afternoon ", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_anytime.js"; + }); + + it("Show anytime because if configure empty parts of day compliments and set anytime compliments", function() { + return app.client.waitUntilWindowLoaded().getText(".compliments").then(function(text) { + expect(text).to.be.oneOf(["Anytime here"]); + }); + }); + }); + + describe("Only anytime present in configuration compliments", function() { + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_only_anytime.js"; + }); + + it("Show anytime compliments", function() { + return app.client.waitUntilWindowLoaded().getText(".compliments").then(function(text) { + expect(text).to.be.oneOf(["Anytime here"]); + }); + }); + }); + }); +}); diff --git a/tests/e2e_new/modules/helloworld_spec.js b/tests/e2e_new/modules/helloworld_spec.js new file mode 100644 index 00000000..ee10685a --- /dev/null +++ b/tests/e2e_new/modules/helloworld_spec.js @@ -0,0 +1,39 @@ +const helpers = require("../global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Test helloworld module", function() { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/helloworld/helloworld.js"; + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + it("Test message helloworld module", function() { + return app.client.waitUntilWindowLoaded().getText(".helloworld").should.eventually.equal("Test HelloWorld Module"); + }); +}); diff --git a/tests/e2e_new/modules/newsfeed_spec.js b/tests/e2e_new/modules/newsfeed_spec.js new file mode 100644 index 00000000..e062121c --- /dev/null +++ b/tests/e2e_new/modules/newsfeed_spec.js @@ -0,0 +1,40 @@ +const helpers = require("../global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Newsfeed module", function() { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function() { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function(startedApp) { + app = startedApp; + }); + }); + + afterEach(function() { + return helpers.stopApplication(app); + }); + + describe("Default configuration", function() { + before(function() { + process.env.MM_CONFIG_FILE = "tests/configs/modules/newsfeed/default.js"; + }); + + it("show title newsfeed", function() { + return app.client.waitUntilTextExists(".newsfeed .small", "Rodrigo Ramirez Blog", 10000).should.be.fulfilled; + }); + }); +}); diff --git a/tests/e2e_new/modules_position_spec.js b/tests/e2e_new/modules_position_spec.js new file mode 100644 index 00000000..d3091cad --- /dev/null +++ b/tests/e2e_new/modules_position_spec.js @@ -0,0 +1,50 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Position of modules", function () { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function () { + return helpers.startApplication({ + args: ["js/electron.js"] + }).then(function (startedApp) { app = startedApp; }) + }); + + afterEach(function () { + return helpers.stopApplication(app); + }); + + describe("Using helloworld", function () { + + before(function () { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/modules/positions.js"; + }); + + var positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third", + "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right", + "bottom_bar", "fullscreen_above", "fullscreen_below"]; + + var position; + var className; + for (idx in positions) { + position = positions[idx]; + className = position.replace("_", "."); + it("show text in " + position, function () { + return app.client.waitUntilWindowLoaded() + .getText("." + className).should.eventually.equal("Text in " + position); + }); + } + }); + +}); diff --git a/tests/e2e_new/port_config.js b/tests/e2e_new/port_config.js new file mode 100644 index 00000000..00964d53 --- /dev/null +++ b/tests/e2e_new/port_config.js @@ -0,0 +1,60 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("port directive configuration", function () { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function () { + return helpers.startApplication({ + args: ["js/electron.js"] + }).then(function (startedApp) { app = startedApp; }) + }); + + afterEach(function () { + return helpers.stopApplication(app); + }); + + describe("Set port 8090", function () { + before(function () { + // Set config sample for use in this test + process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js"; + }); + + it("should return 200", function (done) { + request.get("http://localhost:8090", function (err, res, body) { + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + + describe("Set port 8100 on enviroment variable MM_PORT", function () { + before(function () { + process.env.MM_PORT = 8100; + // Set config sample for use in this test + process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js"; + }); + + after(function () { + delete process.env.MM_PORT; + }); + + it("should return 200", function (done) { + request.get("http://localhost:8100", function (err, res, body) { + expect(res.statusCode).to.equal(200); + done(); + }); + }); + }); + +}); diff --git a/tests/e2e_new/vendor_spec.js b/tests/e2e_new/vendor_spec.js new file mode 100644 index 00000000..5d9ba603 --- /dev/null +++ b/tests/e2e_new/vendor_spec.js @@ -0,0 +1,43 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Vendors", function () { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function () { + return helpers.startApplication({ + args: ["js/electron.js"] + }).then(function (startedApp) { app = startedApp; }) + }); + + afterEach(function () { + return helpers.stopApplication(app); + }); + + describe("Get list vendors", function () { + + before(function () { + process.env.MM_CONFIG_FILE = "tests/configs/env.js"; + }); + + var vendors = require(__dirname + "/../../vendor/vendor.js"); + Object.keys(vendors).forEach(vendor => { + it(`should return 200 HTTP code for vendor "${vendor}"`, function () { + urlVendor = "http://localhost:8080/vendor/" + vendors[vendor]; + request.get(urlVendor, function (err, res, body) { + expect(res.statusCode).to.equal(200); + }); + }); + }); + }); +}); diff --git a/tests/e2e_new/without_modules.js b/tests/e2e_new/without_modules.js new file mode 100644 index 00000000..e0eda168 --- /dev/null +++ b/tests/e2e_new/without_modules.js @@ -0,0 +1,43 @@ +const helpers = require("./global-setup"); +const path = require("path"); +const request = require("request"); + +const expect = require("chai").expect; + +const describe = global.describe; +const it = global.it; +const beforeEach = global.beforeEach; +const afterEach = global.afterEach; + +describe("Check configuration without modules", function () { + helpers.setupTimeout(this); + + var app = null; + + beforeEach(function () { + return helpers.startApplication({ + args: ["js/electron.js"] + }).then(function (startedApp) { app = startedApp; }) + }); + + afterEach(function () { + return helpers.stopApplication(app); + }); + + before(function () { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/without_modules.js"; + }); + + it("Show the message MagicMirror title", function () { + return app.client.waitUntilWindowLoaded() + .getText("#module_1_helloworld .module-content").should.eventually.equal("Magic Mirror2") + }); + + it("Show the text Michael's website", function () { + return app.client.waitUntilWindowLoaded() + .getText("#module_5_helloworld .module-content").should.eventually.equal("www.michaelteeuw.nl"); + }); + +}); + diff --git a/tests/servers/basic-auth.js b/tests/servers/basic-auth.js index 238bdc26..c409ad2d 100644 --- a/tests/servers/basic-auth.js +++ b/tests/servers/basic-auth.js @@ -1,16 +1,21 @@ var http = require("http"); var path = require("path"); var auth = require("http-auth"); -var express = require("express") +var express = require("express"); +var app = express(); -var basic = auth.basic({ - realm: "MagicMirror Area restricted." -}, (username, password, callback) => { - callback(username === "MagicMirror" && password === "CallMeADog"); -}); +var server; -this.server = express(); -this.server.use(auth.connect(basic)); +var basic = auth.basic( + { + realm: "MagicMirror Area restricted." + }, + (username, password, callback) => { + callback(username === "MagicMirror" && password === "CallMeADog"); + } +); + +app.use(auth.connect(basic)); // Set directories availables var directories = ["/tests/configs"]; @@ -18,13 +23,13 @@ var directory; rootPath = path.resolve(__dirname + "/../../"); for (i in directories) { directory = directories[i]; - this.server.use(directory, express.static(path.resolve(rootPath + directory))); + app.use(directory, express.static(path.resolve(rootPath + directory))); } -exports.listen = function () { - this.server.listen.apply(this.server, arguments); +exports.listen = function() { + server = app.listen.apply(app, arguments); }; -exports.close = function (callback) { - this.server.close(callback); +exports.close = function(callback) { + server.close(callback); };