import { mount } from 'enzyme'; import { AccountStore, Account, Actions, React, KeyManager } from 'mailspring-exports'; import { ipcRenderer } from 'electron'; import AccountErrorNotification from '../lib/items/account-error-notif'; describe('AccountErrorNotif', function AccountErrorNotifTests() { describe('when one account is in the `invalid` state', () => { beforeEach(() => { spyOn(AccountStore, 'accounts').andReturn([ new Account({ id: 'A', syncState: Account.SYNC_STATE_AUTH_FAILED, emailAddress: '123@gmail.com', }), new Account({ id: 'B', syncState: Account.SYNC_STATE_OK, emailAddress: 'other@gmail.com' }), ]); }); it('renders an error bar that mentions the account email', () => { const notif = mount(); expect( notif .find('.title') .text() .indexOf('123@gmail.com') > 0 ).toBe(true); }); it('allows the user to refresh the account', () => { spyOn(AppEnv.mailsyncBridge, 'forceRelaunchClient').andReturn(Promise.resolve()); const notif = mount(); notif.find('#action-0').simulate('click'); // Expects first action to be the refresh action expect(AppEnv.mailsyncBridge.forceRelaunchClient).toHaveBeenCalled(); }); it('allows the user to reconnect the account', () => { const notif = mount(); spyOn(KeyManager, 'insertAccountSecrets').andCallFake(acct => acct); spyOn(ipcRenderer, 'send'); notif.find('#action-1').simulate('click'); // Expects second action to be the reconnect action waitsFor(() => { return ipcRenderer.send.callCount > 0; }); runs(() => { expect(ipcRenderer.send).toHaveBeenCalledWith('command', 'application:add-account', { existingAccountJSON: AccountStore.accounts()[0], }); }); }); }); describe('when more than one account is in the `invalid` state', () => { beforeEach(() => { spyOn(AccountStore, 'accounts').andReturn([ new Account({ id: 'A', syncState: Account.SYNC_STATE_AUTH_FAILED, emailAddress: '123@gmail.com', }), new Account({ id: 'B', syncState: Account.SYNC_STATE_AUTH_FAILED, emailAddress: 'other@gmail.com', }), ]); }); it('renders an error bar', () => { const notif = mount(); expect(notif.find('.notification').exists()).toEqual(true); }); it('allows the user to refresh the accounts', () => { spyOn(AppEnv.mailsyncBridge, 'forceRelaunchClient').andReturn(Promise.resolve()); const notif = mount(); notif.find('#action-0').simulate('click'); // Expects first action to be the refresh action expect(AppEnv.mailsyncBridge.forceRelaunchClient).toHaveBeenCalled(); }); it('allows the user to open preferences', () => { spyOn(Actions, 'switchPreferencesTab'); spyOn(Actions, 'openPreferences'); const notif = mount(); notif.find('#action-1').simulate('click'); // Expects second action to be the preferences action expect(Actions.openPreferences).toHaveBeenCalled(); expect(Actions.switchPreferencesTab).toHaveBeenCalledWith('Accounts'); }); }); describe('when all accounts are fine', () => { beforeEach(() => { spyOn(AccountStore, 'accounts').andReturn([ new Account({ id: 'A', syncState: Account.SYNC_STATE_OK, emailAddress: '123@gmail.com' }), new Account({ id: 'B', syncState: Account.SYNC_STATE_OK, emailAddress: 'other@gmail.com' }), ]); }); it('renders nothing', () => { const notif = mount(); expect(notif.find('.notification').exists()).toEqual(false); }); }); });