diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2018-07-16 20:54:39 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2018-07-16 20:54:39 +0200 |
| commit | 508fc0775e62f9361df2814cad5229b7706d4095 (patch) | |
| tree | 055ad745e22cb3b1cbbe91571d57a08070d4a525 | |
| parent | 8e219adbcc3523badf5a0351ca4a8e91596b4114 (diff) | |
| parent | 313d3bf47cd3cc91bc34143deaa930d4bbea14ce (diff) | |
| download | mullvadvpn-508fc0775e62f9361df2814cad5229b7706d4095.tar.xz mullvadvpn-508fc0775e62f9361df2814cad5229b7706d4095.zip | |
Merge branch 'add-eslint-promises'
| -rw-r--r-- | .eslintrc | 20 | ||||
| -rw-r--r-- | app/app.android.js | 4 | ||||
| -rw-r--r-- | app/app.js | 2 | ||||
| -rw-r--r-- | app/components/Accordion.js | 10 | ||||
| -rw-r--r-- | app/components/TransitionContainerStyles.android.js | 1 | ||||
| -rw-r--r-- | app/lib/rpc-address-file.js | 2 | ||||
| -rw-r--r-- | package.json | 12 | ||||
| -rw-r--r-- | test/jsonrpc-transport.spec.js | 97 | ||||
| -rw-r--r-- | test/setup/renderer.js | 2 | ||||
| -rw-r--r-- | yarn.lock | 12 |
10 files changed, 79 insertions, 83 deletions
@@ -2,6 +2,7 @@ "extends": [ "eslint:recommended", "plugin:react/recommended", + "plugin:promise/recommended", "prettier" ], "parser": "babel-eslint", @@ -11,23 +12,24 @@ "modules": true } }, - "plugins": [ "react", "flowtype" ], + "plugins": ["react", "flowtype", "promise"], "rules": { "prefer-const": "warn", "no-console": "off", "no-loop-func": "warn", "new-cap": "off", - "no-trailing-spaces": [ "error", { "skipBlankLines": true } ], "no-param-reassign": "warn", "func-names": "off", - "comma-dangle": "off", "comma-spacing": "warn", - "no-unused-expressions" : "error", - "no-unused-vars": ["error", { - "args": "all", - "argsIgnorePattern": "_.*", - "varsIgnorePattern": "_.*" - }], + "no-unused-expressions": "error", + "no-unused-vars": [ + "error", + { + "args": "all", + "argsIgnorePattern": "_.*", + "varsIgnorePattern": "_.*" + } + ], "block-scoped-var": "error", "react/prop-types": "off", "flowtype/define-flow-type": "warn" diff --git a/app/app.android.js b/app/app.android.js index e16c3cc6a6..0cb07a8600 100644 --- a/app/app.android.js +++ b/app/app.android.js @@ -39,7 +39,9 @@ DeviceEventEmitter.addListener('com.mullvad.daemon-connection-ready', async (_ev }); MobileAppBridge.startBackend() - .then((_response) => {}) + .then((_response) => { + return; + }) .catch((e) => { log.error('Failed starting backend:', e); }); diff --git a/app/app.js b/app/app.js index 76d92a1b55..6dc4acce58 100644 --- a/app/app.js +++ b/app/app.js @@ -440,7 +440,7 @@ export default class AppRenderer { } _requestCredentials(): Promise<RpcCredentials> { - return new Promise((resolve, _reject) => { + return new Promise((resolve) => { ipcRenderer.once('daemon-connection-ready', (_event, credentials: RpcCredentials) => { resolve(credentials); }); diff --git a/app/components/Accordion.js b/app/components/Accordion.js index f69389f6c7..8197fd0e61 100644 --- a/app/components/Accordion.js +++ b/app/components/Accordion.js @@ -2,6 +2,7 @@ import * as React from 'react'; import { Component, View, Styles, Animated, UserInterface } from 'reactxp'; +import { log } from '../lib/platform'; export type AccordionProps = { height: number | 'auto', @@ -89,7 +90,7 @@ export default class Accordion extends Component<AccordionProps, AccordionState> ); } - _animateHeightChanges() { + async _animateHeightChanges() { const containerView = this._containerView; if (!containerView) { return; @@ -100,7 +101,8 @@ export default class Accordion extends Component<AccordionProps, AccordionState> this._animation = null; } - UserInterface.measureLayoutRelativeToWindow(containerView).then((layout) => { + try { + const layout = await UserInterface.measureLayoutRelativeToWindow(containerView); const fromValue = this.state.animatedValue || Animated.createValue(layout.height); const toValue = this.props.height === 'auto' ? this._contentHeight : this.props.height; @@ -119,7 +121,9 @@ export default class Accordion extends Component<AccordionProps, AccordionState> this.setState({ animatedValue: fromValue }, () => { animation.start(this._onAnimationEnd); }); - }); + } catch (error) { + log.error(`Failed to measure the layout of Accordion: ${error.message}`); + } } _onAnimationEnd = ({ finished }) => { diff --git a/app/components/TransitionContainerStyles.android.js b/app/components/TransitionContainerStyles.android.js index b234ff4be0..c894d9fb01 100644 --- a/app/components/TransitionContainerStyles.android.js +++ b/app/components/TransitionContainerStyles.android.js @@ -9,6 +9,7 @@ let menuBarHeight; MobileAppBridge.getMenuBarHeight() .then((_response) => { menuBarHeight = _response; + return; }) .catch((e) => { log.error('Failed getting menuBarHeight:', e); diff --git a/app/lib/rpc-address-file.js b/app/lib/rpc-address-file.js index 6ff920b8df..f05cc54fdc 100644 --- a/app/lib/rpc-address-file.js +++ b/app/lib/rpc-address-file.js @@ -28,7 +28,7 @@ export class RpcAddressFile { let promise = this._pollPromise; if (!promise) { - promise = new Promise((resolve, _reject) => { + promise = new Promise((resolve) => { const timer = setInterval(() => { fs.exists(this._filePath, (exists) => { if (exists) { diff --git a/package.json b/package.json index 47b9d2c4ef..0b63b005c2 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ "license": "GPL-3.0", "dependencies": { "babel-runtime": "^6.22.0", + "chai-as-promised": "^7.1.1", "d3-geo-projection": "^2.3.2", "electron-log": "^2.2.8", + "eslint-plugin-promise": "^3.8.0", "history": "^4.6.1", "jsonrpc-lite": "^1.2.3", "mkdirp": "^0.5.1", @@ -73,19 +75,21 @@ "develop": "cross-env BABEL_ENV=electron npm run private:compile -- --source-maps true && run-p -r private:watch private:serve", "test": "cross-env BABEL_ENV=electron electron-mocha --renderer -R spec --require babel-core/register --require-main test/setup/main.js --preload test/setup/renderer.js test/*.spec.js test/**/*.spec.js", "lint": "eslint --no-ignore scripts app test *.js", - "format": "cross-env prettier --write 'app/**/*.js' 'test/**/*.js'", - "check-format": "cross-env prettier --list-different 'app/**/*.js' 'test/**/*.js'", + "format": "npm run private:format -- --write", + "check-format": "npm run private:format -- --list-different", "flow": "flow", - "pack:mac": "cross-env BABEL_ENV=electron run-s private:clean private:compile private:build:mac && rm -r ./dist/mac", + "pack:mac": "cross-env BABEL_ENV=electron run-s private:clean private:compile private:build:mac private:postbuild:mac", "pack:win": "cross-env BABEL_ENV=electron run-s private:clean private:compile private:build:win", "pack:linux": "cross-env BABEL_ENV=electron run-s private:clean private:compile private:build:linux", "private:build:mac": "npm run private:build -- --mac", + "private:postbuild:mac": "rimraf ./dist/mac", "private:build:win": "npm run private:build -- --win", "private:build:linux": "npm run private:build -- --linux", "private:build": "electron-builder", "private:watch": "cross-env BABEL_ENV=electron npm run private:compile -- --source-maps true --watch --skip-initial-build", "private:serve": "cross-env BABEL_ENV=electron babel-node scripts/serve.js", "private:compile": "babel app/ --copy-files --out-dir build", - "private:clean": "rimraf build" + "private:clean": "rimraf build", + "private:format": "cross-env prettier 'app/**/*.js' 'test/**/*.js'" } } diff --git a/test/jsonrpc-transport.spec.js b/test/jsonrpc-transport.spec.js index 124bba8f00..1f36be83a6 100644 --- a/test/jsonrpc-transport.spec.js +++ b/test/jsonrpc-transport.spec.js @@ -19,7 +19,7 @@ describe('JSON RPC transport', () => { server.close(); }); - it('should send as soon as the websocket connects', (done) => { + it('should send as soon as the websocket connects', () => { server.on('message', (msg) => { const { payload } = jsonrpc.parse(msg); @@ -28,19 +28,14 @@ describe('JSON RPC transport', () => { } }); - transport - .send('hello') - .then(() => { - done(); - }) - .catch((error) => { - done(error); - }); + const sendPromise = transport.send('hello'); transport.connect(WEBSOCKET_URL); + + return expect(sendPromise).to.eventually.be.fulfilled; }); - it('should reject failed jsonrpc requests', (done) => { + it('should reject failed jsonrpc requests', () => { server.on('message', (msg) => { const { payload } = jsonrpc.parse(msg); @@ -53,17 +48,11 @@ describe('JSON RPC transport', () => { } }); - transport.send('invalid-method').catch((error) => { - try { - expect(error.code).to.equal(-32601); - expect(error.message).to.contain('Method not found'); - done(); - } catch (error) { - done(error); - } - }); + const sendPromise = transport.send('invalid-method'); transport.connect(WEBSOCKET_URL); + + return expect(sendPromise).to.eventually.be.rejectedWith('Method not found'); }); it('should route reply to correct promise', () => { @@ -75,44 +64,29 @@ describe('JSON RPC transport', () => { } }); - const decoy = transport - .send('a decoy', [], 100) - .then(() => { - throw new Error('Should not be called'); - }) - .catch((error) => { - expect(error).to.be.an.instanceof(JsonRpcTransportTimeOutError); - }); - - const message = transport.send('a message', [], 100).then((reply) => { - expect(reply).to.equal('a reply'); - }); + const decoyPromise = transport.send('a decoy', [], 100); + const messagePromise = transport.send('a message', [], 100); transport.connect(WEBSOCKET_URL); - return Promise.all([message, decoy]); + return Promise.all([ + expect(messagePromise).to.eventually.be.equal('a reply'), + expect(decoyPromise).to.eventually.be.rejectedWith(JsonRpcTransportTimeOutError), + ]); }); - it('should timeout if no response is returned', (done) => { - transport - .send('timeout-message', {}, 1) - .then(() => { - done(new Error('Should not be called')); - }) - .catch((error) => { - try { - expect(error).to.be.an.instanceof(JsonRpcTransportTimeOutError); - expect(error.message).to.contain('Request timed out'); - done(); - } catch (error) { - done(error); - } - }); + it('should timeout if no response is returned', () => { + const sendPromise = transport.send('timeout-message', {}, 1); transport.connect(WEBSOCKET_URL); + + return expect(sendPromise).to.eventually.be.rejectedWith( + JsonRpcTransportTimeOutError, + 'Request timed out', + ); }); - it('should route notifications', (done) => { + it('should route notifications', () => { server.on('message', (msg) => { const { payload } = jsonrpc.parse(msg); @@ -121,24 +95,21 @@ describe('JSON RPC transport', () => { } }); - transport - .subscribe('event', (event) => { - try { - expect(event).to.equal('an event!'); - done(); - } catch (error) { - done(error); - } - }) - .then(() => { + transport.connect(WEBSOCKET_URL); + + let subscribePromise; + const eventPromise = new Promise((resolve) => { + subscribePromise = transport.subscribe('event', resolve).then((value) => { server.send( - JSON.stringify(jsonrpc.notification('event', { subscription: 1, result: 'an event!' })), + JSON.stringify(jsonrpc.notification('event', { subscription: 1, result: 'beacon' })), ); - }) - .catch((error) => { - done(error); + return value; }); + }); - transport.connect(WEBSOCKET_URL); + return Promise.all([ + expect(subscribePromise).to.eventually.be.fulfilled, + expect(eventPromise).to.eventually.be.equal('beacon'), + ]); }); }); diff --git a/test/setup/renderer.js b/test/setup/renderer.js index acfa87b7ed..a1bd11a4d8 100644 --- a/test/setup/renderer.js +++ b/test/setup/renderer.js @@ -2,8 +2,10 @@ const Enzyme = require('enzyme'); const Adapter = require('enzyme-adapter-react-16'); const chai = require('chai'); const spies = require('chai-spies'); +const chaiAsPromised = require('chai-as-promised'); chai.use(spies); +chai.use(chaiAsPromised); Enzyme.configure({ adapter: new Adapter(), @@ -1585,6 +1585,12 @@ caw@^1.0.1: object-assign "^3.0.0" tunnel-agent "^0.4.0" +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + dependencies: + check-error "^1.0.2" + chai-spies@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chai-spies/-/chai-spies-1.0.0.tgz#d16b39336fb316d03abf8c375feb23c0c8bb163d" @@ -1648,7 +1654,7 @@ charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" -check-error@^1.0.1: +check-error@^1.0.1, check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -2910,6 +2916,10 @@ eslint-plugin-flowtype@^2.49.3: dependencies: lodash "^4.17.10" +eslint-plugin-promise@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" + eslint-plugin-react@^7.9.1: version "7.9.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.9.1.tgz#101aadd15e7c7b431ed025303ac7b421a8e3dc15" |
