diff --git a/index.js b/index.js index dd4cbb4..9e2c55c 100644 --- a/index.js +++ b/index.js @@ -205,7 +205,7 @@ module.exports = function(RED) { address: req.hostname, username: req.params.username, date: new Date().toISOString().split('.').shift(), - uniqueid: function () { + uniqueid: function() { return hueUniqueId(this.id); } } @@ -225,7 +225,7 @@ module.exports = function(RED) { var data = { lights: getDevicesAttributes(hubNode.context()), date: new Date().toISOString().split('.').shift(), - uniqueid: function () { + uniqueid: function() { return hueUniqueId(this.id); } } @@ -340,7 +340,7 @@ module.exports = function(RED) { } function hueUniqueId(id) { - return (id + '0000').replace(/(.{2})/g,"$1:").substring(0, 23) + '-00'; + return (id + '0000').replace(/(.{2})/g, "$1:").substring(0, 23) + '-00'; } function getHueHubId(config) { diff --git a/package-lock.json b/package-lock.json index 913c6ad..2c2c185 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,41 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -18,6 +53,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", @@ -26,6 +67,18 @@ "lodash": "^4.17.10" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "bluebird": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", @@ -48,11 +101,54 @@ "type-is": "~1.6.16" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -73,6 +169,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -81,6 +189,12 @@ "ms": "2.0.0" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -91,6 +205,12 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -101,11 +221,26 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -181,6 +316,23 @@ } } }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -191,6 +343,42 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.7.tgz", + "integrity": "sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -203,9 +391,9 @@ } }, "hue-colors": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hue-colors/-/hue-colors-0.5.2.tgz", - "integrity": "sha512-3wDLYgXnjAtGzcWP+VTlnxVbh7Vc4RC56ubOS9X0Skv55sjhUtrG6fF7WKDezXPAdmprR5MbQK0fPSjezMA9iQ==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/hue-colors/-/hue-colors-0.5.3.tgz", + "integrity": "sha512-8Fh+qbaHUuEep/tGDvxu2CnE0SyblMQRD67mKNkuageY+8caYp0UA8BP6CwnVM66hS+aWKluUdQvBQvvyLjRdA==" }, "iconv-lite": { "version": "0.4.23", @@ -215,6 +403,16 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -230,11 +428,65 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "just-extend": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -268,6 +520,15 @@ "mime-db": "~1.37.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", @@ -281,6 +542,59 @@ "minimist": "0.0.8" } }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -296,6 +610,49 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, "node-persist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-3.0.3.tgz", @@ -304,6 +661,368 @@ "mkdirp": "~0.5.1" } }, + "node-red-node-test-helper": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/node-red-node-test-helper/-/node-red-node-test-helper-0.2.3.tgz", + "integrity": "sha512-N9/Fcrmbco3TSJNyLriM3L7tRd14nSjMQAseo2sgMaJi1rS+2+wXc8ka2RFYYH8EqI2MEeYbS2GPa+kfXEdrUg==", + "dev": true, + "requires": { + "express": "4.17.1", + "read-pkg-up": "3.0.0", + "semver": "6.2.0", + "should": "^13.2.3", + "should-sinon": "0.0.6", + "sinon": "5.0.3", + "stoppable": "1.1.0", + "supertest": "3.0.0" + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "requires": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + } + } + }, "node-ssdp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/node-ssdp/-/node-ssdp-4.0.0.tgz", @@ -331,6 +1050,18 @@ } } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -339,16 +1070,67 @@ "ee-first": "1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", @@ -379,6 +1161,38 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -389,6 +1203,18 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -432,6 +1258,137 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "should": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/should/-/should-8.4.0.tgz", + "integrity": "sha1-XmCInT5kS73Tl6MM00+tKPz5C8A=", + "dev": true, + "requires": { + "should-equal": "0.8.0", + "should-format": "0.3.2", + "should-type": "0.2.0" + }, + "dependencies": { + "should-equal": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-0.8.0.tgz", + "integrity": "sha1-o/BXMv9FusG3ukEvhAiFaBlkEpk=", + "dev": true, + "requires": { + "should-type": "0.2.0" + } + }, + "should-format": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-0.3.2.tgz", + "integrity": "sha1-pZgx4Bot3uFJkRvHFIvlyAMZ4f8=", + "dev": true, + "requires": { + "should-type": "0.2.0" + } + }, + "should-type": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-0.2.0.tgz", + "integrity": "sha1-ZwfvlVKdmJ3MCY/gdTqx+RNrt/Y=", + "dev": true + } + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "requires": { + "should-type": "^1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "should-sinon": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/should-sinon/-/should-sinon-0.0.6.tgz", + "integrity": "sha512-ScBOH5uW5QVFaONmUnIXANSR6z5B8IKzEmBP3HE5sPOCDuZ88oTMdUdnKoCVQdLcCIrRrhRLPS5YT+7H40a04g==", + "dev": true + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "dev": true + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true + }, + "sinon": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.3.tgz", + "integrity": "sha512-kzBkET1Hf0r0J4uVnlicuAEiq9nnhPrEHZWS0mds+5EaB9rA0XoliIkLaqkBNU9lwPuJACo/velUQQOmTRJtUw==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -442,6 +1399,81 @@ "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "supertest": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", + "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", + "dev": true, + "requires": { + "methods": "~1.1.2", + "superagent": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -456,15 +1488,37 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true } } } diff --git a/package.json b/package.json index 6a1d671..3c4ffe2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "url": "git+https://github.com/datech/node-red-contrib-amazon-echo.git" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "mocha \"test/**/index.js\"" }, "keywords": [ "node-red", @@ -35,6 +35,11 @@ "mustache": "^3.0.1", "express": "^4.16.4", "body-parser": "^1.18.3", - "hue-colors": "^0.5.2" + "hue-colors": "^0.5.3" + }, + "devDependencies": { + "mocha": "^5.2.0", + "should": "^8.4.0", + "node-red-node-test-helper": "^0.2.3" } } diff --git a/test/api/hue.js b/test/api/hue.js new file mode 100644 index 0000000..1b03fd6 --- /dev/null +++ b/test/api/hue.js @@ -0,0 +1,467 @@ +var common = require("../common.js"); + +var helper = common.helper; +var request = common.request; +var amazonEcho = common.amazonEcho; +var flow = common.flow; + +var apiURL = "http://localhost:" + flow[1].port; + +describe('Philips Hue REST API ', function() { + + it('description', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + request(apiURL) + .get('/description.xml') + .set('Accept', 'application/xml') + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + res.text.should.not.be.empty().and.match(/Philips hue bridge 2012/); + + done(); + }); + } catch (e) { + done(e); + } + }); + }); + + it('registration', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + request(apiURL) + .post('/api') + .set('Accept', 'application/json') + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + res.body.should.be.deepEqual([{ + success: { + username: 'c6260f982b43a226b5542b967f612ce' + } + }]); + + done(); + }); + } catch (e) { + done(e); + } + }); + }); + + it('get state', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + request(apiURL) + .get('/api/c6260f982b43a226b5542b967f612ce') + .set('Accept', 'application/json') + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + res.body.lights['00000000000002'].state.should.have.property("on", false); + + done(); + }); + } catch (e) { + done(e); + } + }); + }); + + it('get lights', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + request(apiURL) + .get('/api/c6260f982b43a226b5542b967f612ce/lights') + .set('Accept', 'application/json') + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + res.body['00000000000002'].state.should.have.property("on", false); + + done(); + }); + } catch (e) { + done(e); + } + }); + }); + + it('get light state', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + request(apiURL) + .get('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002') + .set('Accept', 'application/json') + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + res.body.state.should.have.property("on", false); + + done(); + }); + } catch (e) { + done(e); + } + }); + }); + + it('switch off', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("000000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("payload", "off"); + msg.should.have.property("on", false); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "on": false + }, + "changes": {} + }); + + done(); + + } catch (e) { + done(e); + } + }); + + request(apiURL) + .put('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002/state') + .set('Accept', 'application/json') + .send({ + on: false + }) + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + ({ + success: { + '/lights/1/state/on': false + } + }).should.be.oneOf(res.body); + }); + + } catch (e) { + done(e); + } + }); + }); + + it('switch on', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("000000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("payload", "on"); + msg.should.have.property("on", true); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "on": true + }, + "changes": { + "on": false + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + request(apiURL) + .put('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002/state') + .set('Accept', 'application/json') + .send({ + on: true + }) + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + ({ + success: { + '/lights/1/state/on': true + } + }).should.be.oneOf(res.body); + }); + + } catch (e) { + done(e); + } + }); + }); + + it('brightness to 10%', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("000000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("bri", 26); + msg.should.have.property("percentage", 10); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "bri": 26 + }, + "changes": { + "bri": 254, + "percentage": 100 + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + request(apiURL) + .put('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002/state') + .set('Accept', 'application/json') + .send({ + bri: 26 + }) + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + ({ + success: { + '/lights/1/state/bri': 26 + } + }).should.be.oneOf(res.body); + }); + + + } catch (e) { + done(e); + } + }); + }); + + it('color to warm white', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("000000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("colormode", "ct"); + msg.should.have.property("ct", 383); + msg.should.have.property("hue", 0); + msg.should.have.property("sat", 254); + msg.should.have.property("xy").and.eql([0.6484272236872118, 0.33085610147277794]); + msg.should.have.property("rgb").and.eql([254, 0, 0]); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "ct": 383 + }, + "changes": { + "ct": 199 + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + request(apiURL) + .put('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002/state') + .set('Accept', 'application/json') + .send({ + ct: 383 + }) + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + ({ + success: { + '/lights/1/state/ct': 383 + } + }).should.be.oneOf(res.body); + }); + + } catch (e) { + done(e); + } + }); + }); + + it('HS color to cyan', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("000000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("colormode", "hs"); + msg.should.have.property("hue", 32768); + msg.should.have.property("sat", 254); + msg.should.have.property("xy").and.eql([0.31363952617905655, 0.3295237237240357]); + msg.should.have.property("rgb").and.eql([0, 254, 254]); + msg.should.have.property("ct", 199); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "hue": 32768, + "sat": 254 + }, + "changes": { + "hue": 0, + "xy": [0.6484272236872118, 0.33085610147277794], + "rgb": [254, 0, 0], + "colormode": "ct" + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + request(apiURL) + .put('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002/state') + .set('Accept', 'application/json') + .send({ + hue: 32768, + sat: 254 + }) + .end(function(err, res) { + + // Status + res.status.should.equal(200); + // Body + ({ + success: { + '/lights/1/state/hue': 32768 + } + }).should.be.oneOf(res.body); + ({ + success: { + '/lights/1/state/sat': 254 + } + }).should.be.oneOf(res.body); + }); + + } catch (e) { + done(e); + } + }); + }); + + it('meta details', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("000000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("payload", "off"); + msg.should.have.property("on", false); + + msg.meta.insert.details.date.should.be.instanceOf(Date); + + delete msg.meta.insert.details["date"]; + + msg.meta.insert.should.have.property("by", "alexa"); + msg.meta.insert.should.have.property("details").which.is.deepEqual({ + "ip": "::ffff:127.0.0.1", + "user_agent": "Dalvik/2.1.0 (Linux; U; Android 7.1.2; AEODN Build/NS6533)" + }); + + done(); + + } catch (e) { + done(e); + } + }); + + request(apiURL) + .put('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002/state') + .set('User-Agent', 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; AEODN Build/NS6533)') + .set('Accept', 'application/json') + .send({ + on: false + }) + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + ({ + success: { + '/lights/1/state/on': false + } + }).should.be.oneOf(res.body); + }); + + } catch (e) { + done(e); + } + }); + }); + +}); diff --git a/test/common.js b/test/common.js new file mode 100644 index 0000000..082e9a6 --- /dev/null +++ b/test/common.js @@ -0,0 +1,43 @@ +const helper = require("node-red-node-test-helper"); +const request = require('supertest'); +const amazonEcho = require("../index.js"); + +var flow = [{ + "id": "00000000.000000", + "type": "tab", + "label": "Flow 1", + "disabled": false, + "info": "" + }, + { + "id": "00000000.000001", + "type": "amazon-echo-hub", + "z": "00000000.000000", + "port": "8080", + "processinput": 2, + "discovery": true, + "wires": [ + ["00000000.000002"] + ] + }, + { + "id": "00000000.000002", + "type": "amazon-echo-device", + "z": "00000000.000000", + "name": "Bulb", + "topic": "", + "wires": [ + ["00000000.0000f0"] + ] + }, + { + "id": "00000000.0000f0", + "type": "helper", + "z": "00000000.000000" + } +]; + +exports.helper = helper; +exports.request = request; +exports.amazonEcho = amazonEcho; +exports.flow = flow; diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..424d911 --- /dev/null +++ b/test/index.js @@ -0,0 +1,27 @@ +var common = require("./common.js"); + +var helper = common.helper; +var request = common.request; +var amazonEcho = common.amazonEcho; + +helper.init(require.resolve('node-red')); + +describe('Amazon Echo Hub Node', function() { + + before(function(done) { + helper.startServer(done); + }); + + after(function(done) { + helper.stopServer(done); + }); + + afterEach(function() { + helper.unload(); + }); + + require('./api/hue.js'); + require('./input/hub.js'); + + +}); diff --git a/test/input/hub.js b/test/input/hub.js new file mode 100644 index 0000000..e5e6429 --- /dev/null +++ b/test/input/hub.js @@ -0,0 +1,527 @@ +var common = require("../common.js"); + +var helper = common.helper; +var request = common.request; +var amazonEcho = common.amazonEcho; +var flow = common.flow; + +var apiURL = "http://localhost:" + flow[1].port; + +describe('Amazon Echo Hub', function() { + + it('switch off', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("payload", "off"); + msg.should.have.property("on", false); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "on": false + }, + "changes": {} + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: false + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('switch on', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("payload", "on"); + msg.should.have.property("on", true); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "on": true + }, + "changes": { + "on": false + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: true + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('brightness to 10%', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("bri", 26); + msg.should.have.property("percentage", 10); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "bri": 26 + }, + "changes": { + "bri": 254, + "percentage": 100 + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + bri: 26 + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('color to warm white', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + + bulb.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("colormode", "ct"); + msg.should.have.property("ct", 383); + msg.should.have.property("hue", 0); + msg.should.have.property("sat", 254); + msg.should.have.property("xy").and.eql([0.6484272236872118, 0.33085610147277794]); + msg.should.have.property("rgb").and.eql([254, 0, 0]); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "ct": 383 + }, + "changes": { + "ct": 199 + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + ct: 383 + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('HS color to cyan', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("colormode", "hs"); + msg.should.have.property("hue", 7282); + msg.should.have.property("sat", 96); + msg.should.have.property("xy").and.eql([0.41095573566484234, 0.4163837804141732]); + msg.should.have.property("rgb").and.eql([254, 222, 158]); + msg.should.have.property("ct", 199); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "hue": 7282, + "sat": 96 + }, + "changes": { + "hue": 0, + "sat": 254, + "xy": [0.6484272236872118, 0.33085610147277794], + "rgb": [254, 0, 0], + "colormode": "ct" + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + hue: 7282, + sat: 96 + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('XY color to cyan', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("colormode", "hs"); + msg.should.have.property("hue", 7282); + msg.should.have.property("sat", 96); + msg.should.have.property("xy").and.eql([0.4, 0.4]); + msg.should.have.property("rgb").and.eql([255, 223, 159]); + msg.should.have.property("ct", 199); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "xy": [0.4, 0.4] + }, + "changes": { + "hue": 0, + "sat": 254, + "xy": [0.6484272236872118, 0.33085610147277794], + "rgb": [254, 0, 0], + "colormode": "ct" + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + xy: [0.4, 0.4] + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('RGB color to cyan', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("on", false); + msg.should.have.property("colormode", "hs"); + msg.should.have.property("hue", 7282); + msg.should.have.property("sat", 96); + msg.should.have.property("xy").and.eql([0.4106395702541955, 0.41618602485898437]); + msg.should.have.property("rgb").and.eql([255, 223, 159]); + msg.should.have.property("ct", 199); + + delete msg.meta["insert"]; + + msg.should.have.property("meta").which.is.deepEqual({ + "input": { + "rgb": [255, 223, 159] + }, + "changes": { + "hue": 0, + "sat": 254, + "xy": [0.6484272236872118, 0.33085610147277794], + "rgb": [254, 0, 0], + "colormode": "ct" + } + }); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + rgb: [255, 223, 159] + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('meta details', function(done) { + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msg.should.have.property("payload", "off"); + msg.should.have.property("on", false); + + msg.meta.insert.details.date.should.be.instanceOf(Date); + + delete msg.meta.insert.details["date"]; + + msg.meta.insert.should.have.property("by", "input"); + msg.meta.insert.details.should.not.have.property("ip"); + msg.meta.insert.details.should.not.have.property("user_agent"); + + done(); + + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: false + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('should not process input', function(done) { + + flow[1].processinput = 0; + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + setTimeout(function() { + done(); + }, 50); + + hn.on("input", function(msg) { + done("Unexpected message for the configured process input state"); + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: true + } + }); + + } catch (e) { + done(e); + } + }); + }); + + it('should process input', function(done) { + + flow[1].processinput = 1; + + helper.load(amazonEcho, flow, function() { + try { + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + done("Unexpected message for the configured process input state"); + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: true + } + }); + + request(apiURL) + .get('/api/c6260f982b43a226b5542b967f612ce/lights/00000000000002') + .set('Accept', 'application/json') + .end(function(err, res) { + // Status + res.status.should.equal(200); + // Body + res.body.state.should.have.property("on", true); + + done(); + }); + + } catch (e) { + done(e); + } + }); + }); + + it('should process and output on state change', function(done) { + + flow[1].processinput = 3; + + helper.load(amazonEcho, flow, function() { + try { + var msgCount = 0; + var hub = helper.getNode("00000000.000001"); + var bulb = helper.getNode("00000000.000002"); + var hn = helper.getNode("00000000.0000f0"); + + hn.on("input", function(msg) { + try { + msgCount++; + + if (msgCount == 1) { + msg.should.have.property("on", true); + msg.should.have.property("bri", 254); + } + if (msgCount == 2) { + msg.should.have.property("on", true); + msg.should.have.property("bri", 100); + done(); + } + } catch (e) { + done(e); + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: false + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: true + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + on: true + } + }); + + hub.receive({ + payload: { + nodeid: "00000000.000002", + bri: 100 + } + }); + + } catch (e) { + done(e); + } + }); + }); + +});