From 1e3b866c8b6b40752efc85ffc9d98930eb43cc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Sun, 5 Mar 2017 22:20:35 -0300 Subject: [PATCH 01/11] Use color red for error when the configuration file is not found. --- js/app.js | 6 +++--- js/utils.js | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/js/app.js b/js/app.js index f8825f7e..138fec70 100644 --- a/js/app.js +++ b/js/app.js @@ -68,11 +68,11 @@ var App = function() { callback(config); } catch (e) { if (e.code == "ENOENT") { - console.error("WARNING! Could not find config file. Please create one. Starting with default configuration."); + console.error(Utils.colors.error("WARNING! Could not find config file. Please create one. Starting with default configuration.")); } else if (e instanceof ReferenceError || e instanceof SyntaxError) { - console.error("WARNING! Could not validate config file. Please correct syntax errors. Starting with default configuration."); + console.error(Utils.colors.error("WARNING! Could not validate config file. Please correct syntax errors. Starting with default configuration.")); } else { - console.error("WARNING! Could not load config file. Starting with default configuration. Error found: " + e); + console.error(Utils.colors.error("WARNING! Could not load config file. Starting with default configuration. Error found: " + e)); } callback(defaults); } diff --git a/js/utils.js b/js/utils.js index 7f548afa..76eb2703 100644 --- a/js/utils.js +++ b/js/utils.js @@ -10,7 +10,8 @@ var colors = require("colors/safe"); var Utils = { colors: { - warn: colors.yellow + warn: colors.yellow, + error: colors.red } }; From afe2b934def61a633f29ebaa140364c37fb5391d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Wed, 8 Mar 2017 10:36:08 -0300 Subject: [PATCH 02/11] test env requst http://localhost:8080 This test expect get 200 HTTP code on get request to http://localhost:8080 --- tests/e2e/env_spec.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 99a7f657..04bb5542 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -1,5 +1,8 @@ const globalSetup = require("./global-setup"); const app = globalSetup.app; +const request = require("request"); +const chai = require("chai"); +const expect = chai.expect; describe("Electron app environment", function () { this.timeout(20000); @@ -17,7 +20,6 @@ describe("Electron app environment", function () { app.stop().then(function() { done(); }); }); - it("is set to open new app window", function () { return app.client.waitUntilWindowLoaded() .getWindowCount().should.eventually.equal(1); @@ -28,4 +30,11 @@ describe("Electron app environment", function () { .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(); + }); + }); + }); From 5770b9dc0e07749c6e64596cb0673f4e37b1f970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Thu, 9 Mar 2017 17:10:32 -0300 Subject: [PATCH 03/11] Test env 404 not found request http://localhost:8080/nothing This test expect gets 404 HTTP code on get request to http://localhost:8080/nothing --- tests/e2e/env_spec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 04bb5542..202bd5e4 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -37,4 +37,11 @@ describe("Electron app environment", function () { }); }); + 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(); + }); + }); + }); From 4fdd12bc48d95a562b92fa297c7a11cd41a0066d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Thu, 9 Mar 2017 21:12:19 -0300 Subject: [PATCH 04/11] Test change port configuration This test change to 8090 port on configuration and check if system response there. --- tests/configs/port_8090.js | 25 +++++++++++++++++++++++++ tests/e2e/port_config.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 tests/configs/port_8090.js create mode 100644 tests/e2e/port_config.js diff --git a/tests/configs/port_8090.js b/tests/configs/port_8090.js new file mode 100644 index 00000000..6646dff7 --- /dev/null +++ b/tests/configs/port_8090.js @@ -0,0 +1,25 @@ +/* Magic Mirror Test config sample enviroment set por 8090 + * + * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com + * MIT Licensed. + */ + +var config = { + port: 8090, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + + language: "en", + timeFormat: 24, + units: "metric", + electronOptions: { + webPreferences: { + nodeIntegration: true, + }, + }, + + modules: [ + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/e2e/port_config.js b/tests/e2e/port_config.js new file mode 100644 index 00000000..c0806e85 --- /dev/null +++ b/tests/e2e/port_config.js @@ -0,0 +1,32 @@ +const globalSetup = require("./global-setup"); +const app = globalSetup.app; +const request = require("request"); +const chai = require("chai"); +const expect = chai.expect; + + +describe("port directive configuration", function () { + + this.timeout(20000); + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + 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(); + }); + }); + }); +}); From aa1f515fcf5f83750b211aa3a3d28c046645d17d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Fri, 10 Mar 2017 00:27:47 -0300 Subject: [PATCH 05/11] Remote extra space main.js --- js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/main.js b/js/main.js index e1a13d8a..604dd410 100644 --- a/js/main.js +++ b/js/main.js @@ -66,7 +66,7 @@ var MM = (function() { var classes = position.replace("_"," "); var parentWrapper = document.getElementsByClassName(classes); if (parentWrapper.length > 0) { - var wrapper = parentWrapper[0].getElementsByClassName("container"); + var wrapper = parentWrapper[0].getElementsByClassName("container"); if (wrapper.length > 0) { return wrapper[0]; } From 6802873cd18235a8a4aa129817d85388ab4aa7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Fri, 10 Mar 2017 16:45:45 -0300 Subject: [PATCH 06/11] Add test module calendar fail basic auth --- .../modules/calendar/fail-basic-auth.js | 44 +++++++++++++++++++ tests/e2e/modules/calendar_spec.js | 11 +++++ 2 files changed, 55 insertions(+) create mode 100644 tests/configs/modules/calendar/fail-basic-auth.js diff --git a/tests/configs/modules/calendar/fail-basic-auth.js b/tests/configs/modules/calendar/fail-basic-auth.js new file mode 100644 index 00000000..ad22046a --- /dev/null +++ b/tests/configs/modules/calendar/fail-basic-auth.js @@ -0,0 +1,44 @@ +/* Magic Mirror Test calendar calendar + * + * This configuration is a wrong authentication + * + * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com + * 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: "calendar", + position: "bottom_bar", + config: { + calendars: [ + { + maximumNumberOfDays: 10000, + url: "http://localhost:8020/tests/configs/data/calendar_test.ics", + auth: { + user: "MagicMirror", + pass: "StairwayToHeaven", + method: "basic" + } + } + ] + } + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/e2e/modules/calendar_spec.js b/tests/e2e/modules/calendar_spec.js index 21939f06..c701ed3c 100644 --- a/tests/e2e/modules/calendar_spec.js +++ b/tests/e2e/modules/calendar_spec.js @@ -65,6 +65,17 @@ describe("Calendar module", function () { }); }); + 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"; + }); + + it("Should return No upcoming events", function () { + return app.client.waitUntilTextExists(".calendar", "No upcoming events.", 10000); + }); + }); }); From 72d18fd7e1e52f237dbafba17358cd65170e2a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Fri, 10 Mar 2017 17:52:40 -0300 Subject: [PATCH 07/11] Add test module position using helloworld Also is using a configuration with "exotic content" --- tests/configs/modules/positions.js | 43 ++++++++++++++++++++++++++++++ tests/e2e/modules_position_spec.js | 42 +++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 tests/configs/modules/positions.js create mode 100644 tests/e2e/modules_position_spec.js diff --git a/tests/configs/modules/positions.js b/tests/configs/modules/positions.js new file mode 100644 index 00000000..7d0188c2 --- /dev/null +++ b/tests/configs/modules/positions.js @@ -0,0 +1,43 @@ +/* Magic Mirror Test config for position setters module + * + * For this case is using helloworld module + * + * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com + * MIT Licensed. + */ + + +var config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + ipWhitelist: [], + + language: "en", + timeFormat: 24, + units: "metric", + electronOptions: { + webPreferences: { + nodeIntegration: true, + }, + }, + modules: + // Using exotic content. This is why dont accept go to JSON configuration file + (function() { + 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 modules = Array(); + for (idx in positions) { + modules.push({ + module: "helloworld", + position: positions[idx], + config: { + text: "Text in " + positions[idx] + } + }); + } + return modules; + })(), +}; +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/e2e/modules_position_spec.js b/tests/e2e/modules_position_spec.js new file mode 100644 index 00000000..a781388a --- /dev/null +++ b/tests/e2e/modules_position_spec.js @@ -0,0 +1,42 @@ +const globalSetup = require("./global-setup"); +const app = globalSetup.app; +const chai = require("chai"); +const expect = chai.expect; + +describe("Position of modules", function () { + this.timeout(20000); + + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + + 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); + }); + } + }); + +}); From f2ea701d34ec524b635260df0a1ae1a217cf2e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Tue, 14 Mar 2017 22:53:37 -0300 Subject: [PATCH 08/11] Fix eslintignore for vendor/vendor.js and fix the eslint validation --- .eslintignore | 4 ++-- Gruntfile.js | 2 +- vendor/vendor.js | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.eslintignore b/.eslintignore index 2e1f92d3..ee60c2ea 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,6 @@ -vendor/ +vendor/* !/vendor/vendor.js !/modules/default/** !/modules/node_helper !/modules/node_helper/** -!/modules/default/defaultmodules.js \ No newline at end of file +!/modules/default/defaultmodules.js diff --git a/Gruntfile.js b/Gruntfile.js index 73836ba4..06fed2d5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -10,7 +10,7 @@ module.exports = function(grunt) { "serveronly/*.js", "*.js", "tests/*/*.js", "!modules/default/alert/notificationFx.js", "!modules/default/alert/modernizr.custom.js", "!modules/default/alert/classie.js", "config/*", - "translations/translations.js" + "translations/translations.js", "vendor/vendor.js" ] }, diff --git a/vendor/vendor.js b/vendor/vendor.js index 32eab950..7076cc45 100644 --- a/vendor/vendor.js +++ b/vendor/vendor.js @@ -8,9 +8,9 @@ */ var vendor = { - 'moment.js' : 'node_modules/moment/min/moment-with-locales.js', - 'moment-timezone.js' : 'node_modules/moment-timezone/moment-timezone.js', - 'weather-icons.css': 'node_modules/weathericons/css/weather-icons.css', - 'weather-icons-wind.css': 'node_modules/weathericons/css/weather-icons-wind.css', - 'font-awesome.css': 'node_modules/font-awesome/css/font-awesome.min.css' + "moment.js" : "node_modules/moment/min/moment-with-locales.js", + "moment-timezone.js" : "node_modules/moment-timezone/moment-timezone.js", + "weather-icons.css": "node_modules/weathericons/css/weather-icons.css", + "weather-icons-wind.css": "node_modules/weathericons/css/weather-icons-wind.css", + "font-awesome.css": "node_modules/font-awesome/css/font-awesome.min.css" }; From b23e47464882290b43a4b3fb2e18d1095f13c8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Sat, 18 Mar 2017 09:36:50 -0300 Subject: [PATCH 09/11] Format changelog for 2.1.1 --- CHANGELOG.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fe62971..f5d33af8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,13 +23,13 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Restructured Test Suite ### Added -- Added Docker support (Pull Request [#673](https://github.com/MichMich/MagicMirror/pull/673)) -- Calendar-specific support for `maximumEntries`, and ` maximumNumberOfDays` +- Added Docker support (Pull Request [#673](https://github.com/MichMich/MagicMirror/pull/673)). +- Calendar-specific support for `maximumEntries`, and ` maximumNumberOfDays`. - Add loaded function to modules, providing an async callback. - Made default newsfeed module aware of gesture events from [MMM-Gestures](https://github.com/thobach/MMM-Gestures) -- Add use pm2 for manager process into Installer RaspberryPi script -- Russian Translation -- Afrikaans Translation +- Add use pm2 for manager process into Installer RaspberryPi script. +- Russian Translation. +- Afrikaans Translation. - Add postinstall script to notify user that MagicMirror installed successfully despite warnings from NPM. - Init tests using mocha. - Option to use RegExp in Calendar's titleReplace. @@ -37,22 +37,22 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Icelandic Translation. - Add use a script to prevent when is run by SSH session set DISPLAY enviroment. - Enable ability to set configuration file by the enviroment variable called MM_CONFIG_FILE. -- Option to give each calendar a different color -- Option for colored min-temp and max-temp -- Add test e2e helloworld -- Add test e2e enviroment -- Add `chai-as-promised` npm module to devDependencies -- Basic set of tests for clock module -- Run e2e test in Travis +- Option to give each calendar a different color. +- Option for colored min-temp and max-temp. +- Add test e2e helloworld. +- Add test e2e enviroment. +- Add `chai-as-promised` npm module to devDependencies. +- Basic set of tests for clock module. +- Run e2e test in Travis. - Estonian Translation. -- Add test for compliments module for parts of day +- Add test for compliments module for parts of day. - Korean Translation. -- Added console warning on startup when deprecated config options are used -- Add option to display temperature unit label to the current weather module -- Added ability to disable wrapping of news items +- Added console warning on startup when deprecated config options are used. +- Add option to display temperature unit label to the current weather module. +- Added ability to disable wrapping of news items. - Added in the ability to hide events in the calendar module based on simple string filters. - Updated Norwegian translation. -- Added hideLoading option for News Feed module +- Added hideLoading option for News Feed module. - Added configurable dateFormat to clock module. - Added multiple calendar icon support. @@ -63,7 +63,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fix an issue where the analog clock looked scrambled. ([#611](https://github.com/MichMich/MagicMirror/issues/611)) - If units is set to imperial, the showRainAmount option of weatherforecast will show the correct unit. - Module currentWeather: check if temperature received from api is defined. -- Fix an issue with module hidden status changing to `true` although lock string prevented showing it +- Fix an issue with module hidden status changing to `true` although lock string prevented showing it. - Fix newsfeed module bug (removeStartTags) - Fixed missing animation on `this.show(speed)` when module is alone in a region. From 4fb86bd6996f819399fb9077074dd46df793f39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Sun, 19 Mar 2017 16:54:36 -0300 Subject: [PATCH 10/11] change description package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7a1e7641..a190f12d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "magicmirror", "version": "2.1.1", - "description": "A modular interface for smart mirrors.", + "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": { "start": "sh run-start.sh", From f0db135b1d5e17ed96550a2999792144bd5486af Mon Sep 17 00:00:00 2001 From: 42SK <42SK@github.com> Date: Tue, 21 Mar 2017 19:39:51 +0100 Subject: [PATCH 11/11] Added option to ignore old items in the news feed module Outdated news items can be omitted via the ignoreOldItems and the ignoreOlderThan option. --- CHANGELOG.md | 1 + modules/default/newsfeed/README.md | 2 ++ modules/default/newsfeed/newsfeed.js | 6 +++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fe62971..39ecfa6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Added hideLoading option for News Feed module - Added configurable dateFormat to clock module. - Added multiple calendar icon support. +- Added `ignoreOldItems` and `ignoreOlderThan` options to the News Feed module ### Fixed - Update .gitignore to not ignore default modules folder. diff --git a/modules/default/newsfeed/README.md b/modules/default/newsfeed/README.md index 9f7b2e7d..7c4ad48d 100644 --- a/modules/default/newsfeed/README.md +++ b/modules/default/newsfeed/README.md @@ -70,6 +70,8 @@ The following properties can be configured: | `updateInterval` | How often do you want to display a new headline? (Milliseconds)

**Possible values:**`1000` - `60000`
**Default value:** `10000` (10 seconds) | `animationSpeed` | Speed of the update animation. (Milliseconds)

**Possible values:**`0` - `5000`
**Default value:** `2500` (2.5 seconds) | `maxNewsItems` | Total amount of news items to cycle through. (0 for unlimited)

**Possible values:**`0` - `...`
**Default value:** `0` +| `ignoreOldItems` | Ignore news items that are outdated.

**Possible values:**`true` or `false
**Default value:** `false` +| `ignoreOlderThan` | How old should news items be before they are considered outdated? (Milliseconds)

**Possible values:**`1` - `...`
**Default value:** `86400000` (1 day) | `removeStartTags` | Some newsfeeds feature tags at the **beginning** of their titles or descriptions, such as _[VIDEO]_. This setting allows for the removal of specified tags from the beginning of an item's description and/or title.

**Possible values:**`'title'`, `'description'`, `'both'` | `startTags` | List the tags you would like to have removed at the beginning of the feed item

**Possible values:** `['TAG']` or `['TAG1','TAG2',...]` | `removeEndTags` | Remove specified tags from the **end** of an item's description and/or title.

**Possible values:**`'title'`, `'description'`, `'both'` diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 5094355e..b7ec2f58 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -28,6 +28,8 @@ Module.register("newsfeed",{ updateInterval: 10 * 1000, animationSpeed: 2.5 * 1000, maxNewsItems: 0, // 0 for unlimited + ignoreOldItems: false, + ignoreOlderThan: 24 * 60 * 60 * 1000, // 1 day removeStartTags: "", removeEndTags: "", startTags: [], @@ -226,7 +228,9 @@ Module.register("newsfeed",{ for (var i in feedItems) { var item = feedItems[i]; item.sourceTitle = this.titleForFeed(feed); - newsItems.push(item); + if (!(this.config.ignoreOldItems && ((Date.now() - new Date(item.pubdate)) > this.config.ignoreOlderThan))) { + newsItems.push(item); + } } } }