diff --git a/Makefile b/Makefile index ba3e2259..69abe070 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,9 @@ endif BUILD_TEMPORARY_DIRECTORY = $(BUILD_DIRECTORY)/.tmp +# See https://github.com/electron/spectron/issues/127 +ETCHER_SPECTRON_ENTRYPOINT ?= $(shell node -e 'console.log(require("electron"))') + # --------------------------------------------------------------------- # Operating system and architecture detection # --------------------------------------------------------------------- @@ -376,6 +379,7 @@ TARGETS = \ lint-cpp \ lint-html \ lint-spell \ + test-spectron \ test-gui \ test-sdk \ test \ @@ -543,18 +547,23 @@ lint-spell: lint: lint-js lint-sass lint-cpp lint-html lint-spell -ELECTRON_MOCHA_OPTIONS=--recursive --reporter spec +MOCHA_OPTIONS=--recursive --reporter spec + +test-spectron: + $(NPX) env \ + ETCHER_SPECTRON_ENTRYPOINT=$(ETCHER_SPECTRON_ENTRYPOINT) \ + mocha $(MOCHA_OPTIONS) tests/spectron test-gui: - $(NPX) electron-mocha $(ELECTRON_MOCHA_OPTIONS) --renderer tests/gui + $(NPX) electron-mocha $(MOCHA_OPTIONS) --renderer tests/gui test-sdk: - $(NPX) electron-mocha $(ELECTRON_MOCHA_OPTIONS) \ + $(NPX) electron-mocha $(MOCHA_OPTIONS) \ tests/shared \ tests/child-writer \ tests/image-stream -test: test-gui test-sdk +test: test-gui test-sdk test-spectron help: @echo "Available targets: $(TARGETS)" diff --git a/appveyor.yml b/appveyor.yml index cca07c0b..b3d4576c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,9 @@ image: Visual Studio 2015 +# See https://github.com/electron/spectron#on-appveyor +os: unstable + cache: - C:\Users\appveyor\.node-gyp - '%LOCALAPPDATA%\electron\Cache' diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 7d6edbee..4cd2d64c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -241,6 +241,18 @@ "from": "arch@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.0.tgz" }, + "archiver": { + "version": "2.1.0", + "from": "archiver@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.0.tgz", + "dev": true + }, + "archiver-utils": { + "version": "1.3.0", + "from": "archiver-utils@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "dev": true + }, "are-we-there-yet": { "version": "1.1.2", "from": "are-we-there-yet@>=1.1.2 <1.2.0", @@ -403,6 +415,12 @@ "from": "asynckit@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" }, + "atob": { + "version": "1.1.3", + "from": "atob@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", + "dev": true + }, "autolinker": { "version": "0.15.3", "from": "autolinker@>=0.15.0 <0.16.0", @@ -720,6 +738,12 @@ "from": "chalk@1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" }, + "chardet": { + "version": "0.4.2", + "from": "chardet@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "dev": true + }, "chownr": { "version": "1.0.1", "from": "chownr@>=1.0.1 <2.0.0", @@ -807,6 +831,12 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", "dev": true }, + "color-name": { + "version": "1.1.3", + "from": "color-name@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "dev": true + }, "columnify": { "version": "1.5.4", "from": "columnify@>=1.5.1 <2.0.0", @@ -878,6 +908,12 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", "dev": true }, + "compress-commons": { + "version": "1.2.2", + "from": "compress-commons@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "dev": true + }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", @@ -1001,6 +1037,32 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "dev": true }, + "css": { + "version": "2.2.1", + "from": "css@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.38 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "dev": true + } + } + }, + "css-parse": { + "version": "2.0.0", + "from": "css-parse@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "dev": true + }, + "css-value": { + "version": "0.0.1", + "from": "css-value@>=0.0.1 <0.1.0", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "dev": true + }, "ctype": { "version": "0.5.3", "from": "ctype@0.5.3", @@ -1128,6 +1190,12 @@ "from": "deep-map-keys@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/deep-map-keys/-/deep-map-keys-1.2.0.tgz" }, + "deepmerge": { + "version": "2.0.1", + "from": "deepmerge@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "dev": true + }, "defaults": { "version": "1.0.3", "from": "defaults@>=1.0.3 <2.0.0", @@ -1244,6 +1312,12 @@ "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", "dev": true }, + "dev-null": { + "version": "0.1.1", + "from": "dev-null@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", + "dev": true + }, "diff": { "version": "1.4.0", "from": "diff@1.4.0", @@ -1356,6 +1430,12 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "optional": true }, + "ejs": { + "version": "2.5.7", + "from": "ejs@>=2.5.6 <2.6.0", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "dev": true + }, "electron": { "version": "1.7.9", "from": "electron@1.7.9", @@ -1634,6 +1714,44 @@ } } }, + "electron-chromedriver": { + "version": "1.7.1", + "from": "electron-chromedriver@>=1.7.1 <1.8.0", + "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-1.7.1.tgz", + "dev": true, + "dependencies": { + "electron-download": { + "version": "4.1.0", + "from": "electron-download@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.0.tgz", + "dev": true + }, + "fs-extra": { + "version": "2.1.2", + "from": "fs-extra@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "from": "path-exists@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "dev": true + }, + "semver": { + "version": "5.4.1", + "from": "semver@>=5.3.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "from": "sumchecker@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "dev": true + } + } + }, "electron-download-tf": { "version": "4.3.1", "from": "electron-download-tf@4.3.1", @@ -2226,6 +2344,26 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "dev": true }, + "external-editor": { + "version": "2.1.0", + "from": "external-editor@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "from": "iconv-lite@>=0.4.17 <0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "from": "tmp@>=0.0.33 <0.0.34", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "dev": true + } + } + }, "extglob": { "version": "0.3.2", "from": "extglob@>=0.3.1 <0.4.0", @@ -2293,6 +2431,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-0.1.0.tgz", "dev": true }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "from": "fast-json-stable-stringify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "from": "fast-levenshtein@>=2.0.4 <2.1.0", @@ -3567,6 +3711,12 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "dev": true }, + "lazystream": { + "version": "1.0.0", + "from": "lazystream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "dev": true + }, "lcid": { "version": "1.0.0", "from": "lcid@>=1.0.0 <2.0.0", @@ -4976,6 +5126,12 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", "dev": true }, + "npm-install-package": { + "version": "2.1.0", + "from": "npm-install-package@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "dev": true + }, "npm-run-path": { "version": "1.0.0", "from": "npm-run-path@>=1.0.0 <2.0.0", @@ -8663,6 +8819,12 @@ "from": "qs@>=6.4.0 <6.5.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz" }, + "querystring": { + "version": "0.2.0", + "from": "querystring@0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "dev": true + }, "randomatic": { "version": "1.1.6", "from": "randomatic@>=1.1.3 <2.0.0", @@ -9054,11 +9216,23 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "from": "resolve-url@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "dev": true + }, "restore-cursor": { "version": "1.0.1", "from": "restore-cursor@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" }, + "rgb2hex": { + "version": "0.1.0", + "from": "rgb2hex@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.0.tgz", + "dev": true + }, "right-align": { "version": "0.1.3", "from": "right-align@>=0.1.1 <0.2.0", @@ -9080,6 +9254,12 @@ "from": "rx-lite@>=3.1.2 <4.0.0", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" }, + "rx-lite-aggregates": { + "version": "4.0.8", + "from": "rx-lite-aggregates@>=4.0.8 <5.0.0", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "dev": true + }, "safe-buffer": { "version": "5.0.1", "from": "safe-buffer@>=5.0.1 <6.0.0", @@ -9403,12 +9583,24 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "dev": true }, + "source-map-resolve": { + "version": "0.3.1", + "from": "source-map-resolve@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", + "dev": true + }, "source-map-support": { "version": "0.4.15", "from": "source-map-support@>=0.4.15 <0.5.0", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", "dev": true }, + "source-map-url": { + "version": "0.3.0", + "from": "source-map-url@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "dev": true + }, "spdx-correct": { "version": "1.0.2", "from": "spdx-correct@>=1.0.0 <1.1.0", @@ -9429,11 +9621,23 @@ "from": "spdx-license-ids@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" }, + "spectron": { + "version": "3.7.2", + "from": "spectron@latest", + "resolved": "https://registry.npmjs.org/spectron/-/spectron-3.7.2.tgz", + "dev": true + }, "speedometer": { "version": "1.0.0", "from": "speedometer@1.0.0", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz" }, + "split": { + "version": "1.0.1", + "from": "split@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "from": "sprintf-js@>=1.0.2 <1.1.0", @@ -10059,6 +10263,26 @@ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", "dev": true }, + "urix": { + "version": "0.1.0", + "from": "urix@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "dev": true + }, + "url": { + "version": "0.11.0", + "from": "url@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "dev": true, + "dependencies": { + "punycode": { + "version": "1.3.2", + "from": "punycode@1.3.2", + "resolved": "http://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "dev": true + } + } + }, "url-parse-lax": { "version": "1.0.0", "from": "url-parse-lax@>=1.0.0 <2.0.0", @@ -10121,6 +10345,12 @@ "from": "validate-npm-package-license@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" }, + "validator": { + "version": "9.1.2", + "from": "validator@>=9.1.1 <9.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-9.1.2.tgz", + "dev": true + }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", @@ -10183,6 +10413,318 @@ "from": "wcwidth@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" }, + "wdio-dot-reporter": { + "version": "0.0.9", + "from": "wdio-dot-reporter@>=0.0.8 <0.1.0", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz", + "dev": true + }, + "webdriverio": { + "version": "4.9.10", + "from": "webdriverio@>=4.8.0 <5.0.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.9.10.tgz", + "dev": true, + "dependencies": { + "ajv": { + "version": "5.5.0", + "from": "ajv@>=5.1.0 <6.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz", + "dev": true + }, + "ansi-escapes": { + "version": "3.0.0", + "from": "ansi-escapes@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "from": "ansi-regex@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "from": "ansi-styles@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "from": "aws-sign2@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "dev": true + }, + "babel-runtime": { + "version": "6.26.0", + "from": "babel-runtime@>=6.26.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "dev": true + }, + "boom": { + "version": "4.3.1", + "from": "boom@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "dev": true + }, + "chalk": { + "version": "2.3.0", + "from": "chalk@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "dev": true, + "dependencies": { + "supports-color": { + "version": "4.5.0", + "from": "supports-color@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "from": "cli-cursor@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "from": "cli-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "from": "color-convert@>=1.9.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "from": "cryptiles@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "dev": true, + "dependencies": { + "boom": { + "version": "5.2.0", + "from": "boom@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "dev": true + }, + "extend": { + "version": "3.0.1", + "from": "extend@>=3.0.1 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "from": "fast-deep-equal@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "dev": true + }, + "figures": { + "version": "2.0.0", + "from": "figures@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "dev": true + }, + "form-data": { + "version": "2.3.1", + "from": "form-data@>=2.3.1 <2.4.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "from": "har-schema@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "from": "har-validator@>=5.0.3 <5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "dev": true + }, + "hawk": { + "version": "6.0.2", + "from": "hawk@>=6.0.2 <6.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "dev": true + }, + "hoek": { + "version": "4.2.0", + "from": "hoek@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "from": "http-signature@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "from": "inquirer@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "from": "mime-db@>=1.30.0 <1.31.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "from": "mime-types@>=2.1.17 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "from": "mute-stream@0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "from": "onetime@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "from": "performance-now@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "dev": true + }, + "q": { + "version": "1.5.1", + "from": "q@>=1.5.0 <1.6.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "dev": true + }, + "qs": { + "version": "6.5.1", + "from": "qs@>=6.5.1 <6.6.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "from": "regenerator-runtime@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "dev": true + }, + "request": { + "version": "2.83.0", + "from": "request@>=2.83.0 <2.84.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "from": "restore-cursor@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "from": "run-async@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "from": "rx-lite@>=4.0.8 <5.0.0", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "from": "safe-buffer@>=5.1.1 <5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "from": "sntp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "from": "string-width@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "from": "strip-ansi@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "5.0.1", + "from": "supports-color@>=5.0.0 <5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "from": "tough-cookie@>=2.3.3 <2.4.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "from": "uuid@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "dev": true + } + } + }, + "wgxpath": { + "version": "1.0.0", + "from": "wgxpath@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", + "dev": true + }, "whatwg-fetch": { "version": "2.0.3", "from": "whatwg-fetch@>=0.10.0", @@ -10329,6 +10871,12 @@ "version": "2.6.0", "from": "yauzl@2.6.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.6.0.tgz" + }, + "zip-stream": { + "version": "1.2.0", + "from": "zip-stream@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "dev": true } } } diff --git a/package.json b/package.json index ea088829..e785cb35 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,7 @@ "eslint-plugin-standard": "3.0.1", "file-exists": "1.0.0", "html-angular-validate": "0.1.9", + "mocha": "3.2.0", "mochainon": "1.0.0", "nock": "9.0.9", "node-gyp": "3.5.0", @@ -118,6 +119,7 @@ "npx": "5.2.0", "pkg": "4.1.1", "sass-lint": "1.10.2", + "spectron": "3.7.2", "tmp": "0.0.31", "versionist": "2.8.1" } diff --git a/tests/spectron/browser-window.js b/tests/spectron/browser-window.js new file mode 100644 index 00000000..7de6d5dd --- /dev/null +++ b/tests/spectron/browser-window.js @@ -0,0 +1,35 @@ +/* + * Copyright 2017 resin.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict' + +const m = require('mochainon') + +module.exports = () => { + describe('Browser Window', function () { + it('should set a proper title', function () { + return this.app.client.getTitle().then((title) => { + m.chai.expect(title).to.equal('Etcher') + }) + }) + + it('should open a browser window', function () { + return this.app.browserWindow.isVisible().then((isVisible) => { + m.chai.expect(isVisible).to.be.true + }) + }) + }) +} diff --git a/tests/spectron/runner.spec.js b/tests/spectron/runner.spec.js new file mode 100644 index 00000000..72ff4dd3 --- /dev/null +++ b/tests/spectron/runner.spec.js @@ -0,0 +1,51 @@ +/* + * Copyright 2017 resin.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict' + +const Bluebird = require('bluebird') +const spectron = require('spectron') +const EXIT_CODES = require('../../lib/shared/exit-codes') +const entrypoint = process.env.ETCHER_SPECTRON_ENTRYPOINT + +if (!entrypoint) { + console.error('You need to properly configure ETCHER_SPECTRON_ENTRYPOINT') + process.exit(EXIT_CODES.GENERAL_ERROR) +} + +describe('Spectron', function () { + // Mainly for CI jobs + this.timeout(20000) + + beforeEach(function () { + this.app = new spectron.Application({ + path: entrypoint, + args: [ '.' ] + }) + + return this.app.start() + }) + + afterEach(function () { + if (this.app && this.app.isRunning()) { + return this.app.stop() + } + + return Bluebird.resolve() + }) + + require('./browser-window')() +})