summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-07-16 20:54:39 +0200
committerAndrej Mihajlov <and@mullvad.net>2018-07-16 20:54:39 +0200
commit508fc0775e62f9361df2814cad5229b7706d4095 (patch)
tree055ad745e22cb3b1cbbe91571d57a08070d4a525
parent8e219adbcc3523badf5a0351ca4a8e91596b4114 (diff)
parent313d3bf47cd3cc91bc34143deaa930d4bbea14ce (diff)
downloadmullvadvpn-508fc0775e62f9361df2814cad5229b7706d4095.tar.xz
mullvadvpn-508fc0775e62f9361df2814cad5229b7706d4095.zip
Merge branch 'add-eslint-promises'
-rw-r--r--.eslintrc20
-rw-r--r--app/app.android.js4
-rw-r--r--app/app.js2
-rw-r--r--app/components/Accordion.js10
-rw-r--r--app/components/TransitionContainerStyles.android.js1
-rw-r--r--app/lib/rpc-address-file.js2
-rw-r--r--package.json12
-rw-r--r--test/jsonrpc-transport.spec.js97
-rw-r--r--test/setup/renderer.js2
-rw-r--r--yarn.lock12
10 files changed, 79 insertions, 83 deletions
diff --git a/.eslintrc b/.eslintrc
index cb65306d20..c562aceddd 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -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(),
diff --git a/yarn.lock b/yarn.lock
index f3c1fc4b0c..9fda780257 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -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"