diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100755 new mode 100644 index 3d22fe82..2e928a28 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,7 +48,6 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Add test for compliments module for parts of day - Korean Translation. - Added console warning on startup when deprecated config options are used -- Added `DAYAFTERTOMORROW`, `UPDATE_NOTIFICATION`, `UPDATE_NOTIFICATION_MODULE`, `UPDATE_INFO` to Norwegian translations (`nn` and `nb`). - Added ability to disable wrapping of news items ### Fixed @@ -60,7 +59,6 @@ This project adheres to [Semantic Versioning](http://semver.org/). - 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 newsfeed module bug (removeStartTags) -- Fixed missing animation on `this.show(speed)` when module is alone in a region. ## [2.1.0] - 2016-12-31 diff --git a/config/config.js.sample b/config/config.js.sample index eab22972..d50b6428 100644 --- a/config/config.js.sample +++ b/config/config.js.sample @@ -46,7 +46,7 @@ var config = { position: "top_right", config: { location: "New York", - locationID: "", //ID from http://www.openweathermap.org + locationID: "", //ID from http://www.openweathermap.org/help/city_list.txt appid: "YOUR_OPENWEATHER_API_KEY" } }, @@ -56,7 +56,7 @@ var config = { header: "Weather Forecast", config: { location: "New York", - locationID: "5128581", //ID from http://www.openweathermap.org + locationID: "5128581", //ID from http://www.openweathermap.org/help/city_list.txt appid: "YOUR_OPENWEATHER_API_KEY" } }, diff --git a/js/app.js b/js/app.js index f8825f7e..6c1f6ea2 100644 --- a/js/app.js +++ b/js/app.js @@ -69,12 +69,14 @@ var App = function() { } catch (e) { if (e.code == "ENOENT") { console.error("WARNING! Could not find config file. Please create one. Starting with default configuration."); + callback(defaults); } else if (e instanceof ReferenceError || e instanceof SyntaxError) { console.error("WARNING! Could not validate config file. Please correct syntax errors. Starting with default configuration."); + callback(defaults); } else { console.error("WARNING! Could not load config file. Starting with default configuration. Error found: " + e); + callback(defaults); } - callback(defaults); } }; diff --git a/js/main.js b/js/main.js old mode 100755 new mode 100644 index ad1486ca..e1a13d8a --- a/js/main.js +++ b/js/main.js @@ -245,18 +245,15 @@ var MM = (function() { moduleWrapper.style.transition = "opacity " + speed / 1000 + "s"; // Restore the postition. See hideModule() for more info. moduleWrapper.style.position = "static"; + moduleWrapper.style.opacity = 1; updateWrapperStates(); - // Waiting for DOM-changes done in updateWrapperStates before we can start the animation. - var dummy = moduleWrapper.parentElement.parentElement.offsetHeight; - - moduleWrapper.style.opacity = 1; - clearTimeout(module.showHideTimer); module.showHideTimer = setTimeout(function() { if (typeof callback === "function") { callback(); } }, speed); + } }; diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index bc2e9771..655ab89c 100644 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -53,25 +53,36 @@ The `colored` property gives the option for an individual color for each calenda #### Default value: ````javascript config: { - colored: false, + colored: false, calendars: [ { url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics', symbol: 'calendar', + auth: { + user: 'username', + pass: 'superstrongpassword', + method: 'basic' + } }, ], } ```` - #### Calendar configuration options: | Option | Description | --------------------- | ----------- | `url` | The url of the calendar .ical. This property is required.

**Possible values:** Any public accessble .ical calendar. | `symbol` | The symbol to show in front of an event. This property is optional.

**Possible values:** See [Font Awesome](http://fontawesome.io/icons/) website. -| `color` | The font color of an event from this calendar. This property should be set if the config is set to colored: true.

**Possible values:** HEX, RGB or RGBA values (#efefef, rgb(242,242,242), rgba(242,242,242,0.5)). +| `color` | The font color of an event from this calendar. This property should be set if the config is set to colored: true.

**Possible values:** HEX, RGB or RGBA values (#efefef, rgb(242,242,242), rgba(242,242,242,0.5)). | `repeatingCountTitle` | The count title for yearly repating events in this calendar.

**Example:** `'Birthday'` -| `user` | The username for HTTP Basic authentication. -| `pass` | The password for HTTP Basic authentication. | `maximumEntries` | The maximum number of events shown. Overrides global setting. **Possible values:** `0` - `100` | `maximumNumberOfDays` | The maximum number of days in the future. Overrides global setting +| `auth` | The object containing options for authentication against the calendar. + + +#### Calendar authentication options: +| Option | Description +| --------------------- | ----------- +| `user` | The username for HTTP authentication. +| `pass` | The password for HTTP authentication. (If you use Bearer authentication, this should be your BearerToken.) +| `method` | Which authentication method should be used. HTTP Basic, Digest and Bearer authentication methods are supported. Basic authentication is used by default if this option is omitted. **Possible values:** `digest`, `basic`, `bearer` **Default value:** `basic` diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 644fc1f6..79e9edca 100644 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -72,10 +72,18 @@ Module.register("calendar", { var calendarConfig = { maximumEntries: calendar.maximumEntries, - maximumNumberOfDays: calendar.maximumNumberOfDays, + maximumNumberOfDays: calendar.maximumNumberOfDays }; - this.addCalendar(calendar.url, calendar.user, calendar.pass, calendarConfig); + // we check user and password here for backwards compatibility with old configs + if(calendar.user && calendar.pass){ + calendar.auth = { + user: calendar.user, + pass: calendar.pass + } + } + + this.addCalendar(calendar.url, calendar.auth, calendarConfig); } this.calendarData = {}; @@ -313,14 +321,13 @@ Module.register("calendar", { * * argument url string - Url to add. */ - addCalendar: function (url, user, pass, calendarConfig) { + addCalendar: function (url, auth, calendarConfig) { this.sendSocketNotification("ADD_CALENDAR", { url: url, maximumEntries: calendarConfig.maximumEntries || this.config.maximumEntries, maximumNumberOfDays: calendarConfig.maximumNumberOfDays || this.config.maximumNumberOfDays, fetchInterval: this.config.fetchInterval, - user: user, - pass: pass + auth: auth }); }, diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index d5ca075e..9655f21e 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -8,7 +8,7 @@ var ical = require("./vendor/ical.js"); var moment = require("moment"); -var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays, user, pass) { +var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays, auth) { var self = this; var reloadTimer = null; @@ -32,11 +32,23 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe } }; - if (user && pass) { - opts.auth = { - user: user, - pass: pass, - sendImmediately: true + if (auth) { + if(auth.method === "bearer"){ + opts.auth = { + bearer: auth.pass + } + + }else{ + opts.auth = { + user: auth.user, + pass: auth.pass + }; + + if(auth.method === "digest"){ + opts.auth.sendImmediately = false; + }else{ + opts.auth.sendImmediately = true; + } } } @@ -47,7 +59,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe return; } - //console.log(data); + // console.log(data); newEvents = []; var limitFunction = function(date, i) {return i < maximumEntries;}; diff --git a/modules/default/calendar/debug.js b/modules/default/calendar/debug.js index 9b72d51d..ddf0fb42 100644 --- a/modules/default/calendar/debug.js +++ b/modules/default/calendar/debug.js @@ -8,14 +8,22 @@ var CalendarFetcher = require("./calendarfetcher.js"); -var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; +var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; // Standard test URL +// var url = "https://www.googleapis.com/calendar/v3/calendars/primary/events/"; // URL for Bearer auth (must be configured in Google OAuth2 first) var fetchInterval = 60 * 60 * 1000; var maximumEntries = 10; var maximumNumberOfDays = 365; +var user = "magicmirror"; +var pass = "MyStrongPass"; + +var auth = { + user: user, + pass: pass +}; console.log("Create fetcher ..."); -fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays); +fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth); fetcher.onReceive(function(fetcher) { console.log(fetcher.events()); @@ -29,4 +37,4 @@ fetcher.onError(function(fetcher, error) { fetcher.startFetch(); -console.log("Create fetcher done! "); +console.log("Create fetcher done! "); \ No newline at end of file diff --git a/modules/default/calendar/node_helper.js b/modules/default/calendar/node_helper.js index cc511659..90c286c8 100644 --- a/modules/default/calendar/node_helper.js +++ b/modules/default/calendar/node_helper.js @@ -24,7 +24,7 @@ module.exports = NodeHelper.create({ socketNotificationReceived: function(notification, payload) { if (notification === "ADD_CALENDAR") { //console.log('ADD_CALENDAR: '); - this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays, payload.user, payload.pass); + this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays, payload.auth); } }, @@ -36,7 +36,7 @@ module.exports = NodeHelper.create({ * attribute reloadInterval number - Reload interval in milliseconds. */ - createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass) { + createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth) { var self = this; if (!validUrl.isUri(url)) { @@ -47,7 +47,7 @@ module.exports = NodeHelper.create({ var fetcher; if (typeof self.fetchers[url] === "undefined") { console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval); - fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass); + fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth); fetcher.onReceive(function(fetcher) { //console.log('Broadcast events.'); diff --git a/package.json b/package.json index 704f8394..66886cad 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "grunt-markdownlint": "^1.0.13", "grunt-stylelint": "latest", "grunt-yamllint": "latest", + "http-auth": "^3.1.3", "mocha": "^3.2.0", "spectron": "^3.4.1", "stylelint-config-standard": "latest", diff --git a/tests/configs/data/calendar_test.ics b/tests/configs/data/calendar_test.ics new file mode 100644 index 00000000..63e001ce --- /dev/null +++ b/tests/configs/data/calendar_test.ics @@ -0,0 +1,190 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:MagicMirrorTest +X-WR-TIMEZONE:America/Santiago +X-WR-CALDESC:Testing propose MagicMirror +BEGIN:VTIMEZONE +TZID:America/Santiago +X-LIC-LOCATION:America/Santiago +BEGIN:STANDARD +TZOFFSETFROM:-0300 +TZOFFSETTO:-0400 +TZNAME:-04 +DTSTART:19700510T000000 +RDATE:19700510T030000 +RDATE:19710509T030000 +RDATE:19720514T030000 +RDATE:19730513T030000 +RDATE:19740512T030000 +RDATE:19750511T030000 +RDATE:19760509T030000 +RDATE:19770515T030000 +RDATE:19780514T030000 +RDATE:19790513T030000 +RDATE:19800511T030000 +RDATE:19810510T030000 +RDATE:19820509T030000 +RDATE:19830515T030000 +RDATE:19840513T030000 +RDATE:19850512T030000 +RDATE:19860511T030000 +RDATE:19870510T030000 +RDATE:19880515T030000 +RDATE:19890514T030000 +RDATE:19900513T030000 +RDATE:19910512T030000 +RDATE:19920510T030000 +RDATE:19930509T030000 +RDATE:19940515T030000 +RDATE:19950514T030000 +RDATE:19960512T030000 +RDATE:19970511T030000 +RDATE:19980510T030000 +RDATE:19990509T030000 +RDATE:20000514T030000 +RDATE:20010513T030000 +RDATE:20020512T030000 +RDATE:20030511T030000 +RDATE:20040509T030000 +RDATE:20050515T030000 +RDATE:20060514T030000 +RDATE:20070513T030000 +RDATE:20080511T030000 +RDATE:20090510T030000 +RDATE:20100509T030000 +RDATE:20110515T030000 +RDATE:20120513T030000 +RDATE:20130512T030000 +RDATE:20140511T030000 +RDATE:20150510T030000 +RDATE:20160515T030000 +RDATE:20170514T030000 +RDATE:20180513T030000 +RDATE:20190512T030000 +RDATE:20200510T030000 +RDATE:20210509T030000 +RDATE:20220515T030000 +RDATE:20230514T030000 +RDATE:20240512T030000 +RDATE:20250511T030000 +RDATE:20260510T030000 +RDATE:20270509T030000 +RDATE:20280514T030000 +RDATE:20290513T030000 +RDATE:20300512T030000 +RDATE:20310511T030000 +RDATE:20320509T030000 +RDATE:20330515T030000 +RDATE:20340514T030000 +RDATE:20350513T030000 +RDATE:20360511T030000 +RDATE:20370510T030000 +END:STANDARD +BEGIN:STANDARD +TZOFFSETFROM:-0300 +TZOFFSETTO:-0400 +TZNAME:-04 +DTSTART:20380509T000000 +RRULE:FREQ=YEARLY;BYMONTH=5;BYDAY=2SU +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:-0400 +TZOFFSETTO:-0300 +TZNAME:-03 +DTSTART:19700809T000000 +RDATE:19700809T040000 +RDATE:19710815T040000 +RDATE:19720813T040000 +RDATE:19730812T040000 +RDATE:19740811T040000 +RDATE:19750810T040000 +RDATE:19760815T040000 +RDATE:19770814T040000 +RDATE:19780813T040000 +RDATE:19790812T040000 +RDATE:19800810T040000 +RDATE:19810809T040000 +RDATE:19820815T040000 +RDATE:19830814T040000 +RDATE:19840812T040000 +RDATE:19850811T040000 +RDATE:19860810T040000 +RDATE:19870809T040000 +RDATE:19880814T040000 +RDATE:19890813T040000 +RDATE:19900812T040000 +RDATE:19910811T040000 +RDATE:19920809T040000 +RDATE:19930815T040000 +RDATE:19940814T040000 +RDATE:19950813T040000 +RDATE:19960811T040000 +RDATE:19970810T040000 +RDATE:19980809T040000 +RDATE:19990815T040000 +RDATE:20000813T040000 +RDATE:20010812T040000 +RDATE:20020811T040000 +RDATE:20030810T040000 +RDATE:20040815T040000 +RDATE:20050814T040000 +RDATE:20060813T040000 +RDATE:20070812T040000 +RDATE:20080810T040000 +RDATE:20090809T040000 +RDATE:20100815T040000 +RDATE:20110814T040000 +RDATE:20120812T040000 +RDATE:20130811T040000 +RDATE:20140810T040000 +RDATE:20150809T040000 +RDATE:20160814T040000 +RDATE:20170813T040000 +RDATE:20180812T040000 +RDATE:20190811T040000 +RDATE:20200809T040000 +RDATE:20210815T040000 +RDATE:20220814T040000 +RDATE:20230813T040000 +RDATE:20240811T040000 +RDATE:20250810T040000 +RDATE:20260809T040000 +RDATE:20270815T040000 +RDATE:20280813T040000 +RDATE:20290812T040000 +RDATE:20300811T040000 +RDATE:20310810T040000 +RDATE:20320815T040000 +RDATE:20330814T040000 +RDATE:20340813T040000 +RDATE:20350812T040000 +RDATE:20360810T040000 +RDATE:20370809T040000 +END:DAYLIGHT +BEGIN:DAYLIGHT +TZOFFSETFROM:-0400 +TZOFFSETTO:-0300 +TZNAME:-03 +DTSTART:20380815T000000 +RRULE:FREQ=YEARLY;BYMONTH=8;BYDAY=2SU +END:DAYLIGHT +END:VTIMEZONE +BEGIN:VEVENT +DTSTART;TZID=America/Santiago:20170309T100000 +DTEND;TZID=America/Santiago:20170309T110000 +RRULE:FREQ=MONTHLY;INTERVAL=30;BYMONTHDAY=9 +DTSTAMP:20170310T172720Z +UID:80rl9kuu5bq49gme99eklov27k@google.com +CREATED:20170310T172400Z +DESCRIPTION: +LAST-MODIFIED:20170310T172400Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:TestEvent +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR diff --git a/tests/configs/modules/calendar/auth-default.js b/tests/configs/modules/calendar/auth-default.js new file mode 100644 index 00000000..3fee5015 --- /dev/null +++ b/tests/configs/modules/calendar/auth-default.js @@ -0,0 +1,41 @@ +/* Magic Mirror Test config default calendar with auth by default + * + * 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:8011/tests/configs/data/calendar_test.ics", + auth: { + user: "MagicMirror", + pass: "CallMeADog" + } + } + ] + } + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/configs/modules/calendar/basic-auth.js b/tests/configs/modules/calendar/basic-auth.js new file mode 100644 index 00000000..1b210102 --- /dev/null +++ b/tests/configs/modules/calendar/basic-auth.js @@ -0,0 +1,42 @@ +/* Magic Mirror Test config default calendar + * + * 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:8010/tests/configs/data/calendar_test.ics", + auth: { + user: "MagicMirror", + pass: "CallMeADog", + method: "basic" + } + } + ] + } + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/configs/modules/calendar/default.js b/tests/configs/modules/calendar/default.js new file mode 100644 index 00000000..3f70d930 --- /dev/null +++ b/tests/configs/modules/calendar/default.js @@ -0,0 +1,37 @@ +/* Magic Mirror Test config default calendar + * + * 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:8080/tests/configs/data/calendar_test.ics" + } + ] + } + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/configs/modules/calendar/old-basic-auth.js b/tests/configs/modules/calendar/old-basic-auth.js new file mode 100644 index 00000000..76e2df3a --- /dev/null +++ b/tests/configs/modules/calendar/old-basic-auth.js @@ -0,0 +1,39 @@ +/* Magic Mirror Test config default calendar + * with authenticacion old config + * 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:8012/tests/configs/data/calendar_test.ics", + user: "MagicMirror", + pass: "CallMeADog" + } + ] + } + } + ] +}; + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== "undefined") {module.exports = config;} diff --git a/tests/configs/noIpWhiteList.js b/tests/configs/noIpWhiteList.js new file mode 100644 index 00000000..79366e09 --- /dev/null +++ b/tests/configs/noIpWhiteList.js @@ -0,0 +1,25 @@ +/* Magic Mirror Test config sample ipWhitelist + * + * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com + * MIT Licensed. + */ + +var config = { + port: 8080, + ipWhitelist: ["x.x.x.x"], + + 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/ipWhistlist_spec.js b/tests/e2e/ipWhistlist_spec.js new file mode 100644 index 00000000..01ab6787 --- /dev/null +++ b/tests/e2e/ipWhistlist_spec.js @@ -0,0 +1,30 @@ +const globalSetup = require("./global-setup"); +const app = globalSetup.app; +const request = require("request"); +const chai = require("chai"); +const expect = chai.expect; + +describe("Set ipWhitelist without access", function () { + + this.timeout(20000); + + before(function() { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/noIpWhiteList.js"; + }); + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + it("should return 403", function (done) { + request.get("http://localhost:8080", function (err, res, body) { + expect(res.statusCode).to.equal(403); + done(); + }); + }); +}); diff --git a/tests/e2e/modules/calendar_spec.js b/tests/e2e/modules/calendar_spec.js new file mode 100644 index 00000000..21939f06 --- /dev/null +++ b/tests/e2e/modules/calendar_spec.js @@ -0,0 +1,70 @@ +const globalSetup = require("../global-setup"); +const serverBasicAuth = require("../../servers/basic-auth.js"); +const app = globalSetup.app; +const chai = require("chai"); +const expect = chai.expect; + +describe("Calendar module", function () { + + this.timeout(20000); + + beforeEach(function (done) { + app.start().then(function() { done(); } ); + }); + + afterEach(function (done) { + app.stop().then(function() { done(); }); + }); + + 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"; + }); + + 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"; + }); + + 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"; + }); + + it("Should return TestEvents", function () { + return app.client.waitUntilTextExists(".calendar", "TestEvent", 10000); + }); + }); + + + +}); diff --git a/tests/servers/basic-auth.js b/tests/servers/basic-auth.js new file mode 100644 index 00000000..238bdc26 --- /dev/null +++ b/tests/servers/basic-auth.js @@ -0,0 +1,30 @@ +var http = require("http"); +var path = require("path"); +var auth = require("http-auth"); +var express = require("express") + +var basic = auth.basic({ + realm: "MagicMirror Area restricted." +}, (username, password, callback) => { + callback(username === "MagicMirror" && password === "CallMeADog"); +}); + +this.server = express(); +this.server.use(auth.connect(basic)); + +// Set directories availables +var directories = ["/tests/configs"]; +var directory; +rootPath = path.resolve(__dirname + "/../../"); +for (i in directories) { + directory = directories[i]; + this.server.use(directory, express.static(path.resolve(rootPath + directory))); +} + +exports.listen = function () { + this.server.listen.apply(this.server, arguments); +}; + +exports.close = function (callback) { + this.server.close(callback); +}; diff --git a/translations/hu.json b/translations/hu.json index 4723fe9a..de18d82e 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -24,7 +24,7 @@ "NW": "ÉNy", "NNW": "ÉÉNy", - "UPDATE_NOTIFICATION": "Elérhető MagicMirror² frissítés.", - "UPDATE_NOTIFICATION_MODULE": "Frissítés érhető el a MODULE_NAME modulhoz.", - "UPDATE_INFO": "A jelenlegi telepített verzió COMMIT_COUNT commit-al régebbi a BRANCH_NAME branch-en." + "UPDATE_NOTIFICATION": "MagicMirror² elérhető egy frissítés!", + "UPDATE_NOTIFICATION_MODULE": "A frissítés MODULE_NAME modul néven érhető el.", + "UPDATE_INFO": "A jelenlegi telepítés COMMIT_COUNT mögött BRANCH_NAME ágon található." } diff --git a/translations/id.json b/translations/id.json deleted file mode 100644 index a311f960..00000000 --- a/translations/id.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "LOADING": "Memuat …", - - "TODAY": "Hari ini", - "TOMORROW": "Besok", - "DAYAFTERTOMORROW": "Lusa", - "RUNNING": "Berakhir dalam", - "EMPTY": "Tidak ada agenda", - - "N": "U", - "NNE": "UUT", - "NE": "NE", - "ENE": "TUT", - "E": "T", - "ESE": "TST", - "SE": "ST", - "SSE": "SST", - "S": "S", - "SSW": "SSB", - "SW": "SB", - "WSW": "BSB", - "W": "B", - "WNW": "BUB", - "NW": "UB", - "NNW": "UUB", - - "UPDATE_NOTIFICATION": "Update MagicMirror² tersedia.", - "UPDATE_NOTIFICATION_MODULE": "Update tersedia untuk modul MODULE_NAME.", - "UPDATE_INFO": "Instalasi saat ini tertinggal COMMIT_COUNT pada cabang BRANCH_NAME." -} diff --git a/translations/nb.json b/translations/nb.json old mode 100755 new mode 100644 index 9a3060be..1b57a5fa --- a/translations/nb.json +++ b/translations/nb.json @@ -3,7 +3,6 @@ "TODAY": "I dag", "TOMORROW": "I morgen", - "DAYAFTERTOMORROW": "I overmorgen", "RUNNING": "Slutter om", "EMPTY": "Ingen kommende arrangementer.", @@ -22,9 +21,5 @@ "W": "V", "WNW": "VNV", "NW": "NV", - "NNW": "NNV", - - "UPDATE_NOTIFICATION": "MagicMirror² oppdatering er tilgjengelig.", - "UPDATE_NOTIFICATION_MODULE": "Oppdatering tilgjengelig for modulen MODULE_NAME.", - "UPDATE_INFO": "Nåværende installasjon er COMMIT_COUNT bak BRANCH_NAME grenen." + "NNW": "NNV" } diff --git a/translations/nn.json b/translations/nn.json old mode 100755 new mode 100644 index ebe4cee7..107bec9d --- a/translations/nn.json +++ b/translations/nn.json @@ -3,7 +3,6 @@ "TODAY": "I dag", "TOMORROW": "I morgon", - "DAYAFTERTOMORROW": "I overmorgon", "RUNNING": "Sluttar om", "EMPTY": "Ingen komande hendingar.", @@ -22,9 +21,5 @@ "W": "V", "WNW": "VNV", "NW": "NV", - "NNW": "NNV", - - "UPDATE_NOTIFICATION": "MagicMirror² oppdatering er tilgjengeleg.", - "UPDATE_NOTIFICATION_MODULE": "Oppdatering tilgjengeleg for modulen MODULE_NAME.", - "UPDATE_INFO": "noverande installasjon er COMMIT_COUNT bak BRANCH_NAME greinen." + "NNW": "NNV" } diff --git a/translations/translations.js b/translations/translations.js index 61701ab9..0d12a604 100644 --- a/translations/translations.js +++ b/translations/translations.js @@ -18,7 +18,6 @@ var translations = { "pt" : "translations/pt.json", // Português "pt_br" : "translations/pt_br.json", // Português Brasileiro "sv" : "translations/sv.json", // Svenska - "id" : "translations/id.json", // Indonesian "it" : "translations/it.json", // Italian "zh_cn" : "translations/zh_cn.json", // Simplified Chinese "zh_tw" : "translations/zh_tw.json", // Traditional Chinese