From 3b775eb3b48e9d848e04c6a6f752a668c63eccb4 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Fri, 23 Mar 2018 12:34:09 +0100 Subject: [PATCH 01/20] enable error collection optin --- .../components/common/NiSessionImport.vue | 82 ++++++++++------ .../components/common/NiSessionSignUp.vue | 97 ++++++++++++------- .../components/common/PageProfile.vue | 39 +++++--- app/src/renderer/vuex/modules/user.js | 26 ++++- 4 files changed, 162 insertions(+), 82 deletions(-) diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index 7cbe15b8a5..8b81daf93b 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -38,21 +38,28 @@ placeholder="Must be exactly 12 words") form-msg(name='Seed' type='required' v-if='!$v.fields.importSeed.required') + form-group(field-id="error-collection" field-label=' ') + .ni-field-checkbox + .ni-field-checkbox-input + input#sign-up-warning(type="checkbox" v-model="fields.errorCollection") + label.ni-field-checkbox-label(for="error-collection") + | I help development of Voyager by sending automatic error reports. This can be turned off at any time. + .ni-session-footer btn(icon="arrow_forward" icon-pos="right" value="Next" size="lg") diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index 547e998afa..c35ea826ae 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -52,21 +52,29 @@ label.ni-field-checkbox-label(for="sign-up-backup") | I have securely written down my seed. form-msg(name='Backup confirmation' type='required' v-if='!$v.fields.signUpBackup.required') + + form-group(field-id="error-collection" field-label=' ') + .ni-field-checkbox + .ni-field-checkbox-input + input#sign-up-warning(type="checkbox" v-model="fields.errorCollection") + label.ni-field-checkbox-label(for="error-collection") + | I help development of Voyager by sending automatic error reports. This can be turned off at any time. + .ni-session-footer btn(icon="arrow_forward" icon-pos="right" value="Next" size="lg" :disabled="creating") diff --git a/app/src/renderer/components/common/PageProfile.vue b/app/src/renderer/components/common/PageProfile.vue index a55bf2c4a5..d033816aad 100644 --- a/app/src/renderer/components/common/PageProfile.vue +++ b/app/src/renderer/components/common/PageProfile.vue @@ -5,19 +5,28 @@ page(title="My Profile") part(title='My Profile') list-item(dt="Account Name" :dd="user.account") list-item(dt="Address" :dd="user.address") + .ni-li + .ni-li-container + .ni-li-dl + .ni-li-dt Automatic error reports + .ni-li-dd + .ni-field-checkbox + .ni-field-checkbox-input + input(type="checkbox" :checked="user.errorCollection || undefined" @change="setErrorCollection") + .ni-session-footer btn(icon='exit_to_app' type='button' @click.native="signOut" value='Sign Out') diff --git a/app/src/renderer/vuex/modules/user.js b/app/src/renderer/vuex/modules/user.js index 9e25e98a86..9eb9d46b39 100644 --- a/app/src/renderer/vuex/modules/user.js +++ b/app/src/renderer/vuex/modules/user.js @@ -1,11 +1,18 @@ +import enableGoogleAnalytics from '../../google-analytics.js' +import Raven from 'raven-js' +const config = require('../../../../../config') + export default ({ commit, node }) => { + const ERROR_COLLECTION_KEY = 'voyager_error_collection' + const state = { atoms: 0, signedIn: false, accounts: [], password: null, account: null, - address: null + address: null, + errorCollection: false } const mutations = { @@ -14,6 +21,18 @@ export default ({ commit, node }) => { }, setAtoms (state, atoms) { state.atoms = atoms + }, + setErrorCollection (state, { account, optin }) { + localStorage.setItem(`${ERROR_COLLECTION_KEY}_${account}`, optin) + state.errorCollection = optin + + Raven.uninstall().config(optin ? config.sentry_dsn_public : '').install() + if (optin) { + console.log('Analytics enabled in browser') + enableGoogleAnalytics(config.google_analytics_uid) + } else { + console.log('Analytics disabled in browser') + } } } @@ -81,6 +100,7 @@ export default ({ commit, node }) => { commit('setModalSession', false) dispatch('initializeWallet', key) + dispatch('loadErrorCollection', account) }, signOut ({ state, commit, dispatch }) { state.password = null @@ -89,6 +109,10 @@ export default ({ commit, node }) => { commit('setModalSession', true) dispatch('showInitialScreen') + }, + loadErrorCollection ({ state, commit }, account) { + let errorCollection = localStorage.getItem(`${ERROR_COLLECTION_KEY}_${account}`) === 'true' + commit('setErrorCollection', { account, optin: errorCollection }) } } From 864bfe81eace80c0e0402cecfdd4a8fcaa03b97e Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Fri, 23 Mar 2018 13:40:29 +0100 Subject: [PATCH 02/20] change optin wording --- app/src/renderer/components/common/NiSessionImport.vue | 2 +- app/src/renderer/components/common/NiSessionSignUp.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index 8b81daf93b..d3c5525dec 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -43,7 +43,7 @@ .ni-field-checkbox-input input#sign-up-warning(type="checkbox" v-model="fields.errorCollection") label.ni-field-checkbox-label(for="error-collection") - | I help development of Voyager by sending automatic error reports. This can be turned off at any time. + | I'd like to opt in for remote error tracking to help improve Voyager .ni-session-footer btn(icon="arrow_forward" icon-pos="right" value="Next" size="lg") diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index c35ea826ae..0f377b04ff 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -58,7 +58,7 @@ .ni-field-checkbox-input input#sign-up-warning(type="checkbox" v-model="fields.errorCollection") label.ni-field-checkbox-label(for="error-collection") - | I help development of Voyager by sending automatic error reports. This can be turned off at any time. + | I'd like to opt in for remote error tracking to help improve Voyager .ni-session-footer btn(icon="arrow_forward" icon-pos="right" value="Next" size="lg" :disabled="creating") From 8a6f54208c0875b60d16cc9869489bfd7098020b Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Fri, 23 Mar 2018 17:55:17 +0100 Subject: [PATCH 03/20] linted --- .../components/common/NiSessionImport.vue | 74 ++++++++--------- .../components/common/NiSessionSignUp.vue | 82 +++++++++---------- .../components/common/PageProfile.vue | 30 +++---- 3 files changed, 93 insertions(+), 93 deletions(-) diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index d3c5525dec..f3ef193b1c 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -50,16 +50,16 @@ diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index 0f377b04ff..0969f461a2 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -65,16 +65,16 @@ diff --git a/app/src/renderer/components/common/PageProfile.vue b/app/src/renderer/components/common/PageProfile.vue index d033816aad..59c994f428 100644 --- a/app/src/renderer/components/common/PageProfile.vue +++ b/app/src/renderer/components/common/PageProfile.vue @@ -19,14 +19,14 @@ page(title="My Profile") From 3136a4bd1c817a05dfb849eae9eeac4833fb6478 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Fri, 23 Mar 2018 18:15:00 +0100 Subject: [PATCH 04/20] fixed nisession tests --- .../components/common/NiSessionImport.vue | 76 +++++++++---------- .../components/common/NISessionSignUp.spec.js | 41 +++++++++- .../components/common/NiSessionImport.spec.js | 39 +++++++++- .../NISessionSignUp.spec.js.snap | 21 +++++ .../NiSessionImport.spec.js.snap | 12 +++ 5 files changed, 146 insertions(+), 43 deletions(-) diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index f3ef193b1c..637c25cc9b 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -50,16 +50,16 @@ diff --git a/test/unit/specs/components/common/NISessionSignUp.spec.js b/test/unit/specs/components/common/NISessionSignUp.spec.js index 2e0576138e..9971472443 100644 --- a/test/unit/specs/components/common/NISessionSignUp.spec.js +++ b/test/unit/specs/components/common/NISessionSignUp.spec.js @@ -2,6 +2,7 @@ import setup from '../../../helpers/vuex-setup' import Vuelidate from 'vuelidate' import htmlBeautify from 'html-beautify' import NISessionSignUp from 'common/NiSessionSignUp' +jest.mock('../../../../../app/src/renderer/google-analytics.js', () => (uid) => { }) let instance = setup() instance.localVue.use(Vuelidate) @@ -57,14 +58,50 @@ describe('NISessionSignUp', () => { } }) await wrapper.vm.onSubmit() - expect(store.commit.mock.calls[1][0]).toEqual('notify') - expect(store.commit.mock.calls[1][1].title.toLowerCase()).toContain('signed up') + expect(store.commit.mock.calls.find(([action, _]) => action === 'notify')[1]).toMatchSnapshot() expect(store.dispatch).toHaveBeenCalledWith('signIn', { password: '1234567890', account: 'testaccount' }) }) + it('should set error collection opt in state', async () => { + wrapper.setData({ + fields: { + signUpPassword: '1234567890', + signUpPasswordConfirm: '1234567890', + signUpSeed: 'bar', // <-- doesn#t check for correctness of seed + signUpName: 'testaccount', + signUpWarning: true, + signUpBackup: true, + errorCollection: true + } + }) + await wrapper.vm.onSubmit() + expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + account: 'testaccount', + optin: true + }) + + wrapper.setData({ + fields: { + signUpPassword: '1234567890', + signUpPasswordConfirm: '1234567890', + signUpSeed: 'bar', // <-- doesn#t check for correctness of seed + signUpName: 'testaccount', + signUpWarning: true, + signUpBackup: true, + errorCollection: false + } + }) + store.commit.mockReset() + await wrapper.vm.onSubmit() + expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + account: 'testaccount', + optin: false + }) + }) + it('should show error if warnings not acknowledged', () => { wrapper.setData({ fields: { diff --git a/test/unit/specs/components/common/NiSessionImport.spec.js b/test/unit/specs/components/common/NiSessionImport.spec.js index b7f55df919..c1089c6c91 100644 --- a/test/unit/specs/components/common/NiSessionImport.spec.js +++ b/test/unit/specs/components/common/NiSessionImport.spec.js @@ -3,6 +3,7 @@ import Vuelidate from 'vuelidate' import { mount, createLocalVue } from '@vue/test-utils' import htmlBeautify from 'html-beautify' import NiSessionImport from 'common/NiSessionImport' +jest.mock('../../../../../app/src/renderer/google-analytics.js', () => (uid) => { }) const localVue = createLocalVue() localVue.use(Vuex) @@ -46,7 +47,7 @@ describe('NiSessionImport', () => { } }) await wrapper.vm.onSubmit() - expect(store.commit.mock.calls[0]).toEqual(['setModalSession', false]) + expect(store.commit.mock.calls.find(([action, _]) => action === 'setModalSession')[1]).toBe(false) }) it('should signal signed in state on successful login', async () => { @@ -59,14 +60,46 @@ describe('NiSessionImport', () => { } }) await wrapper.vm.onSubmit() - expect(store.commit.mock.calls[1][0]).toEqual('notify') - expect(store.commit.mock.calls[1][1].title.toLowerCase()).toContain('welcome back!') + expect(store.commit.mock.calls.find(([action, _]) => action === 'notify')[1].title.toLowerCase()).toContain('welcome back!') expect(store.dispatch).toHaveBeenCalledWith('signIn', { account: 'foo123', password: '1234567890' }) }) + it('should set error collection opt in state', async () => { + wrapper.setData({ + fields: { + importName: 'foo123', + importPassword: '1234567890', + importPasswordConfirm: '1234567890', + importSeed: 'bar', // <-- doesn#t check for correctness of seed + errorCollection: true + } + }) + await wrapper.vm.onSubmit() + expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + account: 'foo123', + optin: true + }) + + wrapper.setData({ + fields: { + importName: 'foo123', + importPassword: '1234567890', + importPasswordConfirm: '1234567890', + importSeed: 'bar', // <-- doesn#t check for correctness of seed + errorCollection: false + } + }) + store.commit.mockReset() + await wrapper.vm.onSubmit() + expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + account: 'foo123', + optin: false + }) + }) + it('should show error if seed is not filled in', async () => { wrapper.setData({ fields: { importSeed: '' } }) await wrapper.vm.onSubmit() diff --git a/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap b/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap index 770c4b74b9..f70e6f3ee9 100644 --- a/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap +++ b/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap @@ -83,6 +83,18 @@ exports[`NISessionSignUp has the expected html structure 1`] = ` Backup confirmation is required + +
+ + +
+
+
+ +
+ +
+
@@ -96,3 +108,12 @@ exports[`NISessionSignUp has the expected html structure 1`] = `
" `; + +exports[`NISessionSignUp should signal signedin state on successful login 1`] = ` +Object { + "body": "Your account has been created.", + "icon": "check_circle", + "time": 1608, + "title": "Signed Up", +} +`; diff --git a/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap b/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap index 472ae1bcba..41e1b4b76a 100644 --- a/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap +++ b/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap @@ -53,6 +53,18 @@ exports[`NiSessionImport has the expected html structure 1`] = ` Seed is required + +
+ + +
+
+
+ +
+ +
+
From 4bd5c4080ce5ff3ca7191cf9128d794f98b0fbe6 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 16:01:27 +0200 Subject: [PATCH 05/20] added tests for view error collection opt in --- .../components/common/NiSessionImport.vue | 2 +- .../components/common/NiSessionSignUp.vue | 82 +++++++++---------- app/src/renderer/vuex/modules/user.js | 34 ++++---- test/unit/specs/App-w-analytics.spec.js | 4 +- test/unit/specs/App-wo-analytics.spec.js | 4 +- .../components/common/NISessionSignUp.spec.js | 8 +- .../components/common/NiSessionImport.spec.js | 8 +- .../store/__snapshots__/user.spec.js.snap | 9 ++ test/unit/specs/store/user.spec.js | 47 ++++++++++- 9 files changed, 128 insertions(+), 70 deletions(-) create mode 100644 test/unit/specs/store/__snapshots__/user.spec.js.snap diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index 637c25cc9b..44fb93a4fd 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -94,7 +94,7 @@ export default { name: this.fields.importName }); if (key) { - this.$store.commit("setErrorCollection", { + this.$store.dispatch("setErrorCollection", { account: this.fields.importName, optin: this.fields.errorCollection }); diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index 0969f461a2..7a4d6c0652 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -65,16 +65,16 @@ diff --git a/app/src/renderer/vuex/modules/user.js b/app/src/renderer/vuex/modules/user.js index 9eb9d46b39..925917b40b 100644 --- a/app/src/renderer/vuex/modules/user.js +++ b/app/src/renderer/vuex/modules/user.js @@ -1,11 +1,12 @@ import enableGoogleAnalytics from '../../google-analytics.js' import Raven from 'raven-js' +const { ipcRenderer } = require('electron') const config = require('../../../../../config') export default ({ commit, node }) => { const ERROR_COLLECTION_KEY = 'voyager_error_collection' - const state = { + let state = { atoms: 0, signedIn: false, accounts: [], @@ -21,18 +22,6 @@ export default ({ commit, node }) => { }, setAtoms (state, atoms) { state.atoms = atoms - }, - setErrorCollection (state, { account, optin }) { - localStorage.setItem(`${ERROR_COLLECTION_KEY}_${account}`, optin) - state.errorCollection = optin - - Raven.uninstall().config(optin ? config.sentry_dsn_public : '').install() - if (optin) { - console.log('Analytics enabled in browser') - enableGoogleAnalytics(config.google_analytics_uid) - } else { - console.log('Analytics disabled in browser') - } } } @@ -110,9 +99,24 @@ export default ({ commit, node }) => { commit('setModalSession', true) dispatch('showInitialScreen') }, - loadErrorCollection ({ state, commit }, account) { + loadErrorCollection ({ state, dispatch }, account) { let errorCollection = localStorage.getItem(`${ERROR_COLLECTION_KEY}_${account}`) === 'true' - commit('setErrorCollection', { account, optin: errorCollection }) + dispatch('setErrorCollection', { account, optin: errorCollection }) + }, + setErrorCollection ({ state }, { account, optin }) { + localStorage.setItem(`${ERROR_COLLECTION_KEY}_${account}`, optin) + state.errorCollection = optin + + Raven.uninstall().config(optin ? config.sentry_dsn_public : '').install() + if (optin) { + console.log('Analytics enabled in browser') + enableGoogleAnalytics(config.google_analytics_uid) + } else { + console.log('Analytics disabled in browser') + window.analytics = null + } + + ipcRenderer.send('error-collection', optin) } } diff --git a/test/unit/specs/App-w-analytics.spec.js b/test/unit/specs/App-w-analytics.spec.js index 70f27a41fe..79d282d36a 100644 --- a/test/unit/specs/App-w-analytics.spec.js +++ b/test/unit/specs/App-w-analytics.spec.js @@ -13,7 +13,7 @@ describe('App with analytics', () => { } })) jest.mock('axios', () => ({ get () { } })) - jest.mock('../../../app/src/renderer/google-analytics.js', () => (uid) => { }) + jest.mock('renderer/google-analytics.js', () => (uid) => { }) jest.mock('electron', () => ({ remote: { getGlobal: () => ({ @@ -43,7 +43,7 @@ describe('App with analytics', () => { }) it('activates google analytics if flag is enabled', async mockDone => { - jest.mock('../../../app/src/renderer/google-analytics.js', () => (uid) => { + jest.mock('renderer/google-analytics.js', () => (uid) => { expect(uid).toBe('123') mockDone() }) diff --git a/test/unit/specs/App-wo-analytics.spec.js b/test/unit/specs/App-wo-analytics.spec.js index 3b95aa4464..41ad13a900 100644 --- a/test/unit/specs/App-wo-analytics.spec.js +++ b/test/unit/specs/App-wo-analytics.spec.js @@ -13,7 +13,7 @@ describe('App without analytics', () => { }, captureException: err => console.error(err) })) - jest.mock('../../../app/src/renderer/google-analytics.js', () => (uid) => { }) + jest.mock('renderer/google-analytics.js', () => (uid) => { }) jest.mock('electron', () => ({ remote: { getGlobal: () => ({ @@ -44,7 +44,7 @@ describe('App without analytics', () => { }) it('does not activate google analytics if analytics is disabled', async mockDone => { - jest.mock('../../../app/src/renderer/google-analytics.js', () => (uid) => { + jest.mock('renderer/google-analytics.js', () => (uid) => { mockDone.fail() }) await require('renderer/main.js') diff --git a/test/unit/specs/components/common/NISessionSignUp.spec.js b/test/unit/specs/components/common/NISessionSignUp.spec.js index 9971472443..46d26ca9f4 100644 --- a/test/unit/specs/components/common/NISessionSignUp.spec.js +++ b/test/unit/specs/components/common/NISessionSignUp.spec.js @@ -2,7 +2,7 @@ import setup from '../../../helpers/vuex-setup' import Vuelidate from 'vuelidate' import htmlBeautify from 'html-beautify' import NISessionSignUp from 'common/NiSessionSignUp' -jest.mock('../../../../../app/src/renderer/google-analytics.js', () => (uid) => { }) +jest.mock('renderer/google-analytics.js', () => (uid) => { }) let instance = setup() instance.localVue.use(Vuelidate) @@ -78,7 +78,7 @@ describe('NISessionSignUp', () => { } }) await wrapper.vm.onSubmit() - expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + expect(store.dispatch.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'testaccount', optin: true }) @@ -94,9 +94,9 @@ describe('NISessionSignUp', () => { errorCollection: false } }) - store.commit.mockReset() + store.dispatch.mockReset() await wrapper.vm.onSubmit() - expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + expect(store.dispatch.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'testaccount', optin: false }) diff --git a/test/unit/specs/components/common/NiSessionImport.spec.js b/test/unit/specs/components/common/NiSessionImport.spec.js index c1089c6c91..53cd1716d9 100644 --- a/test/unit/specs/components/common/NiSessionImport.spec.js +++ b/test/unit/specs/components/common/NiSessionImport.spec.js @@ -3,7 +3,7 @@ import Vuelidate from 'vuelidate' import { mount, createLocalVue } from '@vue/test-utils' import htmlBeautify from 'html-beautify' import NiSessionImport from 'common/NiSessionImport' -jest.mock('../../../../../app/src/renderer/google-analytics.js', () => (uid) => { }) +jest.mock('renderer/google-analytics.js', () => (uid) => { }) const localVue = createLocalVue() localVue.use(Vuex) @@ -78,7 +78,7 @@ describe('NiSessionImport', () => { } }) await wrapper.vm.onSubmit() - expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + expect(store.dispatch.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'foo123', optin: true }) @@ -92,9 +92,9 @@ describe('NiSessionImport', () => { errorCollection: false } }) - store.commit.mockReset() + store.dispatch.mockReset() await wrapper.vm.onSubmit() - expect(store.commit.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + expect(store.dispatch.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'foo123', optin: false }) diff --git a/test/unit/specs/store/__snapshots__/user.spec.js.snap b/test/unit/specs/store/__snapshots__/user.spec.js.snap new file mode 100644 index 0000000000..82aea3170f --- /dev/null +++ b/test/unit/specs/store/__snapshots__/user.spec.js.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Module: User should set the error collection opt in 1`] = ` +Array [ + Array [ + "https://4dee9f70a7d94cc0959a265c45902d84@sentry.io/288169", + ], +] +`; diff --git a/test/unit/specs/store/user.spec.js b/test/unit/specs/store/user.spec.js index 9065f240d2..f232c14ac3 100644 --- a/test/unit/specs/store/user.spec.js +++ b/test/unit/specs/store/user.spec.js @@ -1,5 +1,10 @@ import setup from '../../helpers/vuex-setup' +function mockGA (uid) { + window.analytics = { foo: 'bar' } +} +jest.mock('renderer/google-analytics.js', () => mockGA) + let instance = setup() describe('Module: User', () => { @@ -11,6 +16,8 @@ describe('Module: User', () => { }] beforeEach(() => { + jest.mock('electron', () => ({ ipcRenderer: { send: jest.fn() } })) + let test = instance.shallow() store = test.store node = test.node @@ -132,7 +139,10 @@ describe('Module: User', () => { expect(store.state.config.modals.session.active).toBe(false) }) - it('should sign out', () => { + it('should sign out', async () => { + let password = '123' + let account = 'def' + await store.dispatch('signIn', { password, account }) store.dispatch('signOut') expect(store.state.user.account).toBe(null) expect(store.state.user.password).toBe(null) @@ -141,4 +151,39 @@ describe('Module: User', () => { // hide login expect(store.state.config.modals.session.active).toBe(true) }) + + it('should set the error collection opt in', async () => { + const Raven = require('raven-js') + const ravenSpy = jest.spyOn(Raven, 'config') + store.dispatch('setErrorCollection', { account: 'abc', optin: true }) + expect(store.state.user.errorCollection).toBe(true) + expect(window.analytics).toBeTruthy() + expect(ravenSpy.mock.calls).toMatchSnapshot() + + store.dispatch('setErrorCollection', { account: 'abc', optin: false }) + expect(store.state.user.errorCollection).toBe(false) + expect(window.analytics).toBeFalsy() + expect(ravenSpy).toBeCalledWith('') + }) + + it('should persist the error collection opt in', () => { + let localStorageSpy = jest.spyOn(localStorage, 'setItem') + store.dispatch('setErrorCollection', { account: 'abc', optin: true }) + + expect(localStorageSpy).toHaveBeenCalledWith('voyager_error_collection_abc', true) + }) + + it('should load the persistet error collection opt in', () => { + let localStorageSpy = jest.spyOn(localStorage, 'getItem') + store.dispatch('setErrorCollection', { account: 'abc', optin: true }) + store.state.user.errorCollection = false + store.dispatch('loadErrorCollection', 'abc') + expect(store.state.user.errorCollection).toBe(true) + expect(localStorageSpy).toHaveBeenCalledWith('voyager_error_collection_abc') + + store.dispatch('setErrorCollection', { account: 'abc', optin: false }) + store.state.user.errorCollection = true + store.dispatch('loadErrorCollection', 'abc') + expect(store.state.user.errorCollection).toBe(false) + }) }) From 6d1e571e33973f2c862913e9dece6fe33a693051 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 16:19:32 +0200 Subject: [PATCH 06/20] added tests for error collection in main thread on/off --- app/src/main/index.js | 4 +++ .../specs/__snapshots__/main.spec.js.snap | 12 +++++++ test/unit/specs/main.spec.js | 31 +++++++++++++++++-- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 test/unit/specs/__snapshots__/main.spec.js.snap diff --git a/app/src/main/index.js b/app/src/main/index.js index f0f1fbb484..b5ac78bbcf 100644 --- a/app/src/main/index.js +++ b/app/src/main/index.js @@ -329,6 +329,10 @@ function handleIPC () { event.sender.send('connected', nodeIP) } }) + ipcMain.on('error-collection', (event, optin) => { + console.log('called') + Raven.uninstall().config(ANALYTICS && optin ? config.sentry_dsn : '', { captureUnhandledRejections: false }).install() + }) } // check if baseserver is initialized as the configs could be corrupted diff --git a/test/unit/specs/__snapshots__/main.spec.js.snap b/test/unit/specs/__snapshots__/main.spec.js.snap new file mode 100644 index 0000000000..1d49bd7cf7 --- /dev/null +++ b/test/unit/specs/__snapshots__/main.spec.js.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Startup Process IPC should set error collection according to the error collection opt in state 1`] = ` +Array [ + Array [ + "https://4dee9f70a7d94cc0959a265c45902d84:cbf160384aab4cdeafbe9a08dee3b961@sentry.io/288169", + Object { + "captureUnhandledRejections": false, + }, + ], +] +`; diff --git a/test/unit/specs/main.spec.js b/test/unit/specs/main.spec.js index 1eef4147c2..da0ff33cae 100644 --- a/test/unit/specs/main.spec.js +++ b/test/unit/specs/main.spec.js @@ -354,7 +354,7 @@ describe('Startup Process', () => { }) }) - describe('IPC', () => { + describe.only('IPC', () => { let registeredIPCListeners = {} beforeEach(async function () { @@ -428,7 +428,7 @@ describe('Startup Process', () => { // register listeners again const { ipcMain } = require('electron') ipcMain.on = (type, cb) => { - registeredIPCListeners[type] = (...args) => cb(...args) + registeredIPCListeners[type] = cb } // run main @@ -439,6 +439,33 @@ describe('Startup Process', () => { expect(event.sender.send.mock.calls[0][0]).toEqual('error') expect(event.sender.send.mock.calls[0][1]).toBeTruthy() // TODO fix seeds so we can test nodeIP output }) + + it.only('should set error collection according to the error collection opt in state', async () => { + main.shutdown() + + Object.assign(process.env, { COSMOS_ANALYTICS: true }) + prepareMain() + // register listeners again + const { ipcMain } = require('electron') + ipcMain.on = (type, cb) => { + registeredIPCListeners[type] = cb + } + + // run main + main = await require(appRoot + 'src/main/index.js') + + const Raven = require('raven') + const ravenSpy = jest.spyOn(Raven, 'config') + + registeredIPCListeners['error-collection'](null, true) + expect(ravenSpy).toHaveBeenCalled() + expect(ravenSpy.mock.calls[0]).not.toBe('') + expect(ravenSpy.mock.calls).toMatchSnapshot() + + ravenSpy.mockReset() + registeredIPCListeners['error-collection'](null, false) + expect(ravenSpy).toHaveBeenCalledWith('') + }) }) describe('Error handling', function () { From df1365a9bd33635775dae466b6b50e0461fec7a3 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 16:19:47 +0200 Subject: [PATCH 07/20] improved view error collection tests --- test/unit/specs/store/user.spec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/unit/specs/store/user.spec.js b/test/unit/specs/store/user.spec.js index f232c14ac3..0cb4ad2e66 100644 --- a/test/unit/specs/store/user.spec.js +++ b/test/unit/specs/store/user.spec.js @@ -158,12 +158,14 @@ describe('Module: User', () => { store.dispatch('setErrorCollection', { account: 'abc', optin: true }) expect(store.state.user.errorCollection).toBe(true) expect(window.analytics).toBeTruthy() + expect(ravenSpy).toHaveBeenCalled() + expect(ravenSpy).not.toHaveBeenCalled('') expect(ravenSpy.mock.calls).toMatchSnapshot() store.dispatch('setErrorCollection', { account: 'abc', optin: false }) expect(store.state.user.errorCollection).toBe(false) expect(window.analytics).toBeFalsy() - expect(ravenSpy).toBeCalledWith('') + expect(ravenSpy).toHaveBeenCalledWith('') }) it('should persist the error collection opt in', () => { From d7f87295c5e51a21c81d86f53ae1db277f4cc607 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 17:01:03 +0200 Subject: [PATCH 08/20] dault to mock electron ipc --- package.json | 3 ++- test/unit/helpers/ipc_mock.js | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 test/unit/helpers/ipc_mock.js diff --git a/package.json b/package.json index eba705f88b..58e4e6e9d6 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,8 @@ "./test/unit/helpers/setup.js", "./test/unit/helpers/console_error_throw.js", "./test/unit/helpers/genesis_mock.js", + "./test/unit/helpers/ipc_mock.js", "jest-localstorage-mock" ] } -} +} \ No newline at end of file diff --git a/test/unit/helpers/ipc_mock.js b/test/unit/helpers/ipc_mock.js new file mode 100644 index 0000000000..2208117fc3 --- /dev/null +++ b/test/unit/helpers/ipc_mock.js @@ -0,0 +1,5 @@ +// this mocks the IPC layer +jest.mock('electron', () => ({ + ipcRenderer: { send: jest.fn() }, + ipcMain: { on: jest.fn() } +})) From c7db8ac38adf4b04d84a26edcd97a14f64270b0e Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 17:01:51 +0200 Subject: [PATCH 09/20] fixed several tests --- app/src/renderer/components/common/NiSessionSignUp.vue | 1 + archive/components/ToggleBtn.spec.js | 4 ++-- test/unit/specs/components/common/NISessionSignUp.spec.js | 5 +++-- test/unit/specs/components/common/NiPage.spec.js | 2 +- test/unit/specs/components/common/NiSessionImport.spec.js | 4 ++-- test/unit/specs/main.spec.js | 4 ++-- test/unit/specs/store/user.spec.js | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index 7a4d6c0652..879f3d274b 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -111,6 +111,7 @@ export default { password: this.fields.signUpPassword, name: this.fields.signUpName }); + console.log("KEY", key); if (key) { this.$store.dispatch("setErrorCollection", { account: this.fields.signUpName, diff --git a/archive/components/ToggleBtn.spec.js b/archive/components/ToggleBtn.spec.js index 49f6a3d46f..548a56493b 100644 --- a/archive/components/ToggleBtn.spec.js +++ b/archive/components/ToggleBtn.spec.js @@ -11,7 +11,7 @@ describe('TogggleBtn', () => { store.commit = jest.fn() beforeEach(() => { - store.commit.mockReset() + store.commit.mockClear() wrapper = mount(TogggleBtn, { localVue, store, @@ -31,7 +31,7 @@ describe('TogggleBtn', () => { }) it('should show an active state if active set', () => { - wrapper.setProps({active: true}) + wrapper.setProps({ active: true }) expect(wrapper.classes()).toContain('active') }) }) diff --git a/test/unit/specs/components/common/NISessionSignUp.spec.js b/test/unit/specs/components/common/NISessionSignUp.spec.js index 46d26ca9f4..12c5f1807e 100644 --- a/test/unit/specs/components/common/NISessionSignUp.spec.js +++ b/test/unit/specs/components/common/NISessionSignUp.spec.js @@ -65,7 +65,7 @@ describe('NISessionSignUp', () => { }) }) - it('should set error collection opt in state', async () => { + it.only('should set error collection opt in state', async () => { wrapper.setData({ fields: { signUpPassword: '1234567890', @@ -94,8 +94,9 @@ describe('NISessionSignUp', () => { errorCollection: false } }) - store.dispatch.mockReset() + store.dispatch.mockClear() await wrapper.vm.onSubmit() + console.log(store.dispatch.mock.calls) expect(store.dispatch.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'testaccount', optin: false diff --git a/test/unit/specs/components/common/NiPage.spec.js b/test/unit/specs/components/common/NiPage.spec.js index e5b97a367c..c994669b78 100644 --- a/test/unit/specs/components/common/NiPage.spec.js +++ b/test/unit/specs/components/common/NiPage.spec.js @@ -16,7 +16,7 @@ describe('NiPage', () => { store.commit = jest.fn() beforeEach(() => { - store.commit.mockReset() + store.commit.mockClear() wrapper = mount(NiPage, { localVue, store, diff --git a/test/unit/specs/components/common/NiSessionImport.spec.js b/test/unit/specs/components/common/NiSessionImport.spec.js index 53cd1716d9..e7e47e5bd5 100644 --- a/test/unit/specs/components/common/NiSessionImport.spec.js +++ b/test/unit/specs/components/common/NiSessionImport.spec.js @@ -92,9 +92,9 @@ describe('NiSessionImport', () => { errorCollection: false } }) - store.dispatch.mockReset() + store.dispatch.mockClear() await wrapper.vm.onSubmit() - expect(store.dispatch.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ + expect(store.dispatch.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'foo123', optin: false }) diff --git a/test/unit/specs/main.spec.js b/test/unit/specs/main.spec.js index da0ff33cae..58fc94eb77 100644 --- a/test/unit/specs/main.spec.js +++ b/test/unit/specs/main.spec.js @@ -462,9 +462,9 @@ describe('Startup Process', () => { expect(ravenSpy.mock.calls[0]).not.toBe('') expect(ravenSpy.mock.calls).toMatchSnapshot() - ravenSpy.mockReset() + ravenSpy.mockClear() registeredIPCListeners['error-collection'](null, false) - expect(ravenSpy).toHaveBeenCalledWith('') + expect(ravenSpy).toHaveBeenCalledWith('', { 'captureUnhandledRejections': false }) }) }) diff --git a/test/unit/specs/store/user.spec.js b/test/unit/specs/store/user.spec.js index 0cb4ad2e66..63d305363a 100644 --- a/test/unit/specs/store/user.spec.js +++ b/test/unit/specs/store/user.spec.js @@ -159,7 +159,7 @@ describe('Module: User', () => { expect(store.state.user.errorCollection).toBe(true) expect(window.analytics).toBeTruthy() expect(ravenSpy).toHaveBeenCalled() - expect(ravenSpy).not.toHaveBeenCalled('') + expect(ravenSpy).not.toHaveBeenCalledWith('') expect(ravenSpy.mock.calls).toMatchSnapshot() store.dispatch('setErrorCollection', { account: 'abc', optin: false }) From 71a438ac5c146affaeac4f8ee6ad89b4cd46099e Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 28 Mar 2018 17:16:07 +0200 Subject: [PATCH 10/20] remove default analytics --- README.md | 1 - app/src/main/index.js | 21 ++------ .../components/common/NiSessionSignUp.vue | 1 - app/src/renderer/main.js | 14 ++--- test/unit/specs/App-w-analytics.spec.js | 9 +--- test/unit/specs/App-wo-analytics.spec.js | 7 +-- test/unit/specs/main.spec.js | 54 +------------------ 7 files changed, 10 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index d1dc8fca10..1e15ccda0d 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,6 @@ A list of all environment variables and their purpose: |--|--|--|--| |NODE_ENV|'production', 'development'||| |LOGGING|'true', 'false'|'true'|Disable logging| -|COSMOS_ANALYTICS|'true', 'false'|'false'|Disable code that should not run in e2e tests, like crash reporting| |COSMOS_NETWORK|{path to network configuration folder}|'../networks/gaia-1'|Network to connect to| |COSMOS_HOME|{path to config persistence folder}|'$HOME/voyager[-dev]'|| |COSMOS_NODE|{ip of a certain node}||Node to connect to| diff --git a/app/src/main/index.js b/app/src/main/index.js index b5ac78bbcf..904b57b1e4 100644 --- a/app/src/main/index.js +++ b/app/src/main/index.js @@ -39,9 +39,6 @@ const winURL = DEV : `file://${__dirname}/index.html` const LCD_PORT = DEV ? config.lcd_port : config.lcd_port_prod const NODE = process.env.COSMOS_NODE -const ANALYTICS = process.env.COSMOS_ANALYTICS ? JSON.parse(process.env.COSMOS_ANALYTICS) : (process.env.NODE_ENV === 'production' && config.analytics_networks.indexOf(config.default_network) !== -1) -// set analytics for renderer -process.env.COSMOS_ANALYTICS = ANALYTICS let SERVER_BINARY = 'gaia' + (WIN ? '.exe' : '') @@ -330,8 +327,7 @@ function handleIPC () { } }) ipcMain.on('error-collection', (event, optin) => { - console.log('called') - Raven.uninstall().config(ANALYTICS && optin ? config.sentry_dsn : '', { captureUnhandledRejections: false }).install() + Raven.uninstall().config(optin ? config.sentry_dsn : '', { captureUnhandledRejections: false }).install() }) } @@ -402,17 +398,9 @@ async function reconnect (seeds) { return nodeIP } -function setupAnalytics () { - if (ANALYTICS) { - log('Adding analytics') - } - - // only enable sending of error events in production setups and if the network is a testnet - Raven.config(ANALYTICS ? config.sentry_dsn : '', { captureUnhandledRejections: false }).install() -} - async function main () { - setupAnalytics() + // we only enable error collection after users opted in + Raven.config('', { captureUnhandledRejections: false }).install() let appVersionPath = join(root, 'app_version') let genesisPath = join(root, 'genesis.json') @@ -530,6 +518,5 @@ module.exports = main() }) .then(() => ({ shutdown, - processes: { baseserverProcess }, - analytics: ANALYTICS + processes: { baseserverProcess } })) diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index 879f3d274b..7a4d6c0652 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -111,7 +111,6 @@ export default { password: this.fields.signUpPassword, name: this.fields.signUpName }); - console.log("KEY", key); if (key) { this.$store.dispatch("setErrorCollection", { account: this.fields.signUpName, diff --git a/app/src/renderer/main.js b/app/src/renderer/main.js index 0c979be569..eb615011d6 100644 --- a/app/src/renderer/main.js +++ b/app/src/renderer/main.js @@ -5,10 +5,7 @@ import Router from 'vue-router' import Vuelidate from 'vuelidate' import shrinkStacktrace from '../helpers/shrink-stacktrace.js' import Raven from 'raven-js' -import { remote, ipcRenderer } from 'electron' -import enableGoogleAnalytics from './google-analytics.js' - -const config = require('../../../config') +import { ipcRenderer } from 'electron' import App from './App' import routes from './routes' @@ -18,13 +15,8 @@ import Store from './vuex/store' // exporting this for testing let store -// setup sentry remote error reporting and google analytics -const analyticsEnabled = JSON.parse(remote.getGlobal('process').env.COSMOS_ANALYTICS) -if (analyticsEnabled) { - console.log('Analytics enabled in browser') - enableGoogleAnalytics(config.google_analytics_uid) -} -Raven.config(analyticsEnabled ? config.sentry_dsn_public : '').install() +// Raven serves automatic error reporting. It is turned off by default +Raven.config('').install() // handle uncaught errors window.addEventListener('unhandledrejection', function (event) { diff --git a/test/unit/specs/App-w-analytics.spec.js b/test/unit/specs/App-w-analytics.spec.js index 79d282d36a..606f122712 100644 --- a/test/unit/specs/App-w-analytics.spec.js +++ b/test/unit/specs/App-w-analytics.spec.js @@ -15,14 +15,7 @@ describe('App with analytics', () => { jest.mock('axios', () => ({ get () { } })) jest.mock('renderer/google-analytics.js', () => (uid) => { }) jest.mock('electron', () => ({ - remote: { - getGlobal: () => ({ - env: { - NODE_ENV: 'test', - COSMOS_ANALYTICS: 'true' - } - }) - }, + remote: { getGlobal: () => ({ env: { NODE_ENV: 'test' } }) }, ipcRenderer: { on: (type, cb) => { if (type === 'connected') { diff --git a/test/unit/specs/App-wo-analytics.spec.js b/test/unit/specs/App-wo-analytics.spec.js index 41ad13a900..f760f653b3 100644 --- a/test/unit/specs/App-wo-analytics.spec.js +++ b/test/unit/specs/App-wo-analytics.spec.js @@ -16,12 +16,7 @@ describe('App without analytics', () => { jest.mock('renderer/google-analytics.js', () => (uid) => { }) jest.mock('electron', () => ({ remote: { - getGlobal: () => ({ - env: { - NODE_ENV: 'test', - COSMOS_ANALYTICS: 'false' - } - }), + getGlobal: () => ({ env: { NODE_ENV: 'test' } }), app: { getPath: () => { return '$HOME' } } }, ipcRenderer: { diff --git a/test/unit/specs/main.spec.js b/test/unit/specs/main.spec.js index 58fc94eb77..552c1a4059 100644 --- a/test/unit/specs/main.spec.js +++ b/test/unit/specs/main.spec.js @@ -75,7 +75,6 @@ let childProcess describe('Startup Process', () => { Object.assign(process.env, { - COSMOS_ANALYTICS: false, LOGGING: false, COSMOS_NETWORK: 'app/networks/gaia-2', COSMOS_HOME: testRoot, @@ -304,57 +303,7 @@ describe('Startup Process', () => { }) }) - describe('Enable analytics', () => { - let main - beforeEach(() => { - jest.resetModules() - }) - - afterEach(() => { - main.shutdown() - }) - - it('should enable analytics with analytics flag', async () => { - Object.assign(process.env, { COSMOS_ANALYTICS: true }) - main = await initMain() - expect(main.analytics).toBe(true) - }) - - it('should enable analytics if production and testnet', async () => { - jest.mock('../../../config.js', () => ({ - default_network: 'test-network', - analytics_networks: ['test-network'] - })) - Object.assign(process.env, { NODE_ENV: 'production' }) - main = await initMain() - expect(main.analytics).toBe(true) - }) - - it('should prefer env variable over config', async () => { - jest.mock('../../../config.js', () => ({ - default_network: 'test-network', - analytics_networks: ['test-network'] - })) - Object.assign(process.env, { - COSMOS_ANALYTICS: false, - NODE_ENV: 'production' - }) - main = await initMain() - expect(main.analytics).toBe(false) - }) - - it('should disable analytics if production and not a testnet', async () => { - jest.mock('../../../config.js', () => ({ - default_network: 'production-network', - analytics_networks: ['test-network'] - })) - Object.assign(process.env, { NODE_ENV: 'production' }) - main = await initMain() - expect(main.analytics).toBe(false) - }) - }) - - describe.only('IPC', () => { + describe('IPC', () => { let registeredIPCListeners = {} beforeEach(async function () { @@ -443,7 +392,6 @@ describe('Startup Process', () => { it.only('should set error collection according to the error collection opt in state', async () => { main.shutdown() - Object.assign(process.env, { COSMOS_ANALYTICS: true }) prepareMain() // register listeners again const { ipcMain } = require('electron') From db547de2ef84e74d4269e8197beb8bde9364f947 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 17:23:07 +0200 Subject: [PATCH 11/20] linted --- .../components/common/NiSessionImport.vue | 74 ++++++++--------- .../components/common/NiSessionSignUp.vue | 82 +++++++++---------- 2 files changed, 78 insertions(+), 78 deletions(-) diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index 44fb93a4fd..524bbb2f74 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -50,16 +50,16 @@ diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index 7a4d6c0652..f129eae509 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -65,16 +65,16 @@ From cb4ff3476506b1b3a0ba8c44e8189d56eb044bf5 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 17:23:41 +0200 Subject: [PATCH 12/20] removed automatic analytics in vue entry file --- test/unit/specs/App-w-analytics.spec.js | 59 ------------------- .../{App-wo-analytics.spec.js => App.spec.js} | 0 2 files changed, 59 deletions(-) delete mode 100644 test/unit/specs/App-w-analytics.spec.js rename test/unit/specs/{App-wo-analytics.spec.js => App.spec.js} (100%) diff --git a/test/unit/specs/App-w-analytics.spec.js b/test/unit/specs/App-w-analytics.spec.js deleted file mode 100644 index 606f122712..0000000000 --- a/test/unit/specs/App-w-analytics.spec.js +++ /dev/null @@ -1,59 +0,0 @@ -/* mocking electron differently in one file apparently didn't work so I had to split the App tests in 2 files */ - -jest.mock('renderer/connectors/node.js', () => () => require('../helpers/node_mock')) - -describe('App with analytics', () => { - jest.mock('../../../config', () => ({ - google_analytics_uid: '123', - sentry_dsn_public: '456' - })) - jest.mock('raven-js', () => ({ - config: (dsn) => { - return ({ install: () => { } }) - } - })) - jest.mock('axios', () => ({ get () { } })) - jest.mock('renderer/google-analytics.js', () => (uid) => { }) - jest.mock('electron', () => ({ - remote: { getGlobal: () => ({ env: { NODE_ENV: 'test' } }) }, - ipcRenderer: { - on: (type, cb) => { - if (type === 'connected') { - cb(null, 'localhost') - } - }, - send: () => { } - } - })) - - beforeEach(() => { - Object.defineProperty(window.location, 'search', { - writable: true, - value: '?node=localhost&relay_port=8080' - }) - document.body.innerHTML = '
' - jest.resetModules() - }) - - it('activates google analytics if flag is enabled', async mockDone => { - jest.mock('renderer/google-analytics.js', () => (uid) => { - expect(uid).toBe('123') - mockDone() - }) - require('renderer/main.js') - }) - - it('sets Raven dsn if analytics is enabled', mockDone => { - jest.mock('raven-js', () => ({ - config: (dsn) => { - expect(dsn).toBe('456') - return ({ - install: () => { - mockDone() - } - }) - } - })) - require('renderer/main.js') - }) -}) diff --git a/test/unit/specs/App-wo-analytics.spec.js b/test/unit/specs/App.spec.js similarity index 100% rename from test/unit/specs/App-wo-analytics.spec.js rename to test/unit/specs/App.spec.js From 67a4b3be093967cf040c1ec35adbbe1649d0281d Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 28 Mar 2018 18:39:32 +0200 Subject: [PATCH 13/20] minor improvements --- test/unit/specs/components/common/NISessionSignUp.spec.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/unit/specs/components/common/NISessionSignUp.spec.js b/test/unit/specs/components/common/NISessionSignUp.spec.js index 12c5f1807e..1f011f25b9 100644 --- a/test/unit/specs/components/common/NISessionSignUp.spec.js +++ b/test/unit/specs/components/common/NISessionSignUp.spec.js @@ -65,7 +65,7 @@ describe('NISessionSignUp', () => { }) }) - it.only('should set error collection opt in state', async () => { + it('should set error collection opt in state', async () => { wrapper.setData({ fields: { signUpPassword: '1234567890', @@ -96,7 +96,6 @@ describe('NISessionSignUp', () => { }) store.dispatch.mockClear() await wrapper.vm.onSubmit() - console.log(store.dispatch.mock.calls) expect(store.dispatch.mock.calls.find(([action, _]) => action === 'setErrorCollection')[1]).toMatchObject({ account: 'testaccount', optin: false @@ -115,7 +114,7 @@ describe('NISessionSignUp', () => { } }) wrapper.vm.onSubmit() - expect(store.commit.mock.calls[0]).toBeUndefined() + expect(store.commit).not.toHaveBeenCalled() expect(wrapper.find('.ni-form-msg-error')).toBeDefined() }) @@ -167,7 +166,7 @@ describe('NISessionSignUp', () => { expect(wrapper.find('.ni-form-msg-error')).toBeDefined() }) - it('should show error if account name is not 5 long', async () => { + it('should show an error if account name is not 5 long', async () => { wrapper.setData({ fields: { signUpPassword: '1234567890', From d4a50fd950bf176e5fbf7207cdc08234436f4f56 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 18:43:13 +0200 Subject: [PATCH 14/20] fixed skipped tests --- test/unit/specs/main.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/specs/main.spec.js b/test/unit/specs/main.spec.js index 552c1a4059..b40992d4cb 100644 --- a/test/unit/specs/main.spec.js +++ b/test/unit/specs/main.spec.js @@ -389,7 +389,7 @@ describe('Startup Process', () => { expect(event.sender.send.mock.calls[0][1]).toBeTruthy() // TODO fix seeds so we can test nodeIP output }) - it.only('should set error collection according to the error collection opt in state', async () => { + it('should set error collection according to the error collection opt in state', async () => { main.shutdown() prepareMain() From 838ea6ab5603819718b166e12e38aafe2cb1c585 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 19:35:18 +0200 Subject: [PATCH 15/20] added tests for pageprofile --- .../components/common/PageProfile.vue | 30 +-- .../components/common/PageProfile.spec.js | 41 +++ .../__snapshots__/PageProfile.spec.js.snap | 244 ++++++++++++++++++ 3 files changed, 300 insertions(+), 15 deletions(-) create mode 100644 test/unit/specs/components/common/PageProfile.spec.js create mode 100644 test/unit/specs/components/common/__snapshots__/PageProfile.spec.js.snap diff --git a/app/src/renderer/components/common/PageProfile.vue b/app/src/renderer/components/common/PageProfile.vue index 59c994f428..fd17d7d845 100644 --- a/app/src/renderer/components/common/PageProfile.vue +++ b/app/src/renderer/components/common/PageProfile.vue @@ -19,14 +19,14 @@ page(title="My Profile") diff --git a/test/unit/specs/components/common/PageProfile.spec.js b/test/unit/specs/components/common/PageProfile.spec.js new file mode 100644 index 0000000000..1b6f59bf42 --- /dev/null +++ b/test/unit/specs/components/common/PageProfile.spec.js @@ -0,0 +1,41 @@ +import setup from '../../../helpers/vuex-setup' +import PageProfile from 'renderer/components/common/PageProfile' +jest.mock('renderer/google-analytics.js', () => (uid) => { }) + +describe('PageProfile', () => { + let wrapper, store + let instance = setup() + + beforeEach(async () => { + let test = instance.mount(PageProfile) + wrapper = test.wrapper + store = test.store + + await store.dispatch('signIn', { + account: 'default', + password: '1234567890' + }) + }) + + it('has the expected html structure if connected', () => { + expect(wrapper.vm.$el).toMatchSnapshot() + expect(wrapper.vm.$el.outerHTML).toContain('default') + expect(wrapper.vm.$el.outerHTML).toContain('someaddress') + }) + + it('should sign the user out', async () => { + wrapper.vm.signOut() + expect(store.dispatch).toHaveBeenCalledWith('signOut') + expect(store.commit).toHaveBeenCalledWith('notifySignOut') + }) + + it('should set the error collection opt in', async () => { + let errorCollection = wrapper.vm.user.errorCollection + wrapper.vm.setErrorCollection() + expect(store.dispatch).toHaveBeenCalledWith('setErrorCollection', { + account: 'default', + optin: !errorCollection + }) + expect(wrapper.vm.user.errorCollection).not.toBe(errorCollection) + }) +}) diff --git a/test/unit/specs/components/common/__snapshots__/PageProfile.spec.js.snap b/test/unit/specs/components/common/__snapshots__/PageProfile.spec.js.snap new file mode 100644 index 0000000000..65d5cd5acc --- /dev/null +++ b/test/unit/specs/components/common/__snapshots__/PageProfile.spec.js.snap @@ -0,0 +1,244 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PageProfile has the expected html structure if connected 1`] = ` +
+
+
+
+
+

+ My Profile +

+
+
+

+ +

+
+
+ + +
+
+
+
+
+
+
+
+ My Profile +
+ +
+
+
+
+
+
+ +
+
+
+ Account Name +
+
+ default +
+
+
+
+
+
+
+ +
+
+
+ Address +
+
+ someaddress +
+
+
+
+
+
+
+
+ Automatic error reports +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+`; From 34c7454dd2fba1b01314e480ca1914a3cd8f97e9 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 19:35:25 +0200 Subject: [PATCH 16/20] removed dead code --- app/src/main/index.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/index.js b/app/src/main/index.js index 904b57b1e4..5defa5a482 100644 --- a/app/src/main/index.js +++ b/app/src/main/index.js @@ -489,12 +489,7 @@ async function main () { // pick a random seed node from config.toml // TODO: user-specified nodes, support switching? - let configText - try { - configText = fs.readFileSync(configPath, 'utf8') - } catch (e) { - throw new Error(`Can't open config.toml: ${e.message}`) - } + let configText = fs.readFileSync(configPath, 'utf8') // checked before if the file exists let configTOML = toml.parse(configText) seeds = configTOML.p2p.seeds.split(',').filter(x => x !== '') if (seeds.length === 0) { From 86579c994bcacea06276ea8c84ea2f1092a1f47d Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Wed, 28 Mar 2018 19:37:41 +0200 Subject: [PATCH 17/20] linted --- .../components/common/PageProfile.vue | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/renderer/components/common/PageProfile.vue b/app/src/renderer/components/common/PageProfile.vue index fd17d7d845..cd43edceb1 100644 --- a/app/src/renderer/components/common/PageProfile.vue +++ b/app/src/renderer/components/common/PageProfile.vue @@ -19,14 +19,14 @@ page(title="My Profile") From bb06e7de5035043cc5c82e5ae9a141f646aa892b Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 2 Apr 2018 17:07:40 +0200 Subject: [PATCH 18/20] Update NiSessionImport.vue --- app/src/renderer/components/common/NiSessionImport.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/renderer/components/common/NiSessionImport.vue b/app/src/renderer/components/common/NiSessionImport.vue index 524bbb2f74..d9c8996fe2 100644 --- a/app/src/renderer/components/common/NiSessionImport.vue +++ b/app/src/renderer/components/common/NiSessionImport.vue @@ -43,7 +43,7 @@ .ni-field-checkbox-input input#sign-up-warning(type="checkbox" v-model="fields.errorCollection") label.ni-field-checkbox-label(for="error-collection") - | I'd like to opt in for remote error tracking to help improve Voyager + | I'd like to opt in for remote error tracking to help improve Voyager. .ni-session-footer btn(icon="arrow_forward" icon-pos="right" value="Next" size="lg") From c62a0bc5f8ad3cfd7a72c7216ec1bbacb79067f1 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 2 Apr 2018 17:07:57 +0200 Subject: [PATCH 19/20] Update NiSessionSignUp.vue --- app/src/renderer/components/common/NiSessionSignUp.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/renderer/components/common/NiSessionSignUp.vue b/app/src/renderer/components/common/NiSessionSignUp.vue index f129eae509..0140707803 100644 --- a/app/src/renderer/components/common/NiSessionSignUp.vue +++ b/app/src/renderer/components/common/NiSessionSignUp.vue @@ -58,7 +58,7 @@ .ni-field-checkbox-input input#sign-up-warning(type="checkbox" v-model="fields.errorCollection") label.ni-field-checkbox-label(for="error-collection") - | I'd like to opt in for remote error tracking to help improve Voyager + | I'd like to opt in for remote error tracking to help improve Voyager. .ni-session-footer btn(icon="arrow_forward" icon-pos="right" value="Next" size="lg" :disabled="creating") From c788b5381587129cf88c7ee7f681ea648d98d9f4 Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Mon, 2 Apr 2018 17:23:21 +0200 Subject: [PATCH 20/20] updated snapshots --- .../common/__snapshots__/NISessionSignUp.spec.js.snap | 2 +- .../common/__snapshots__/NiSessionImport.spec.js.snap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap b/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap index f70e6f3ee9..341b604a77 100644 --- a/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap +++ b/test/unit/specs/components/common/__snapshots__/NISessionSignUp.spec.js.snap @@ -92,7 +92,7 @@ exports[`NISessionSignUp has the expected html structure 1`] = `
- +
diff --git a/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap b/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap index 41e1b4b76a..1650977fd9 100644 --- a/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap +++ b/test/unit/specs/components/common/__snapshots__/NiSessionImport.spec.js.snap @@ -62,7 +62,7 @@ exports[`NiSessionImport has the expected html structure 1`] = `
- +