import assert from 'assert'; import reduceApp from '../../../../../ui/app/ducks/app/app'; import * as actionConstants from '../../../../../ui/app/store/actionConstants'; const actions = actionConstants; describe('App State', function () { const metamaskState = { selectedAddress: '0xAddress', identities: { '0xAddress': { name: 'account 1', address: '0xAddress', }, }, }; it('App init state', function () { const initState = reduceApp(metamaskState, {}); assert(initState); }); it('sets networkDropdownOpen dropdown to true', function () { const state = reduceApp(metamaskState, { type: actions.NETWORK_DROPDOWN_OPEN, }); assert.equal(state.networkDropdownOpen, true); }); it('sets networkDropdownOpen dropdown to false', function () { const dropdown = { networkDropdowopen: true }; const state = { ...metamaskState, ...dropdown }; const newState = reduceApp(state, { type: actions.NETWORK_DROPDOWN_CLOSE, }); assert.equal(newState.networkDropdownOpen, false); }); it('opens sidebar', function () { const value = { transitionName: 'sidebar-right', type: 'wallet-view', isOpen: true, }; const state = reduceApp(metamaskState, { type: actions.SIDEBAR_OPEN, value, }); assert.deepEqual(state.sidebar, value); }); it('closes sidebar', function () { const openSidebar = { sidebar: { isOpen: true } }; const state = { ...metamaskState, ...openSidebar }; const newState = reduceApp(state, { type: actions.SIDEBAR_CLOSE, }); assert.equal(newState.sidebar.isOpen, false); }); it('opens alert', function () { const state = reduceApp(metamaskState, { type: actions.ALERT_OPEN, value: 'test message', }); assert.equal(state.alertOpen, true); assert.equal(state.alertMessage, 'test message'); }); it('closes alert', function () { const alert = { alertOpen: true, alertMessage: 'test message' }; const state = { ...metamaskState, ...alert }; const newState = reduceApp(state, { type: actions.ALERT_CLOSE, }); assert.equal(newState.alertOpen, false); assert.equal(newState.alertMessage, null); }); it('detects qr code data', function () { const state = reduceApp(metamaskState, { type: actions.QR_CODE_DETECTED, value: 'qr data', }); assert.equal(state.qrCodeData, 'qr data'); }); it('opens modal', function () { const state = reduceApp(metamaskState, { type: actions.MODAL_OPEN, payload: { name: 'test', }, }); assert.equal(state.modal.open, true); assert.equal(state.modal.modalState.name, 'test'); }); it('closes modal, but moves open modal state to previous modal state', function () { const opensModal = { modal: { open: true, modalState: { name: 'test', }, }, }; const state = { ...metamaskState, appState: { ...opensModal } }; const newState = reduceApp(state, { type: actions.MODAL_CLOSE, }); assert.equal(newState.modal.open, false); assert.equal(newState.modal.modalState.name, null); }); it('shows send token page', function () { const state = reduceApp(metamaskState, { type: actions.SHOW_SEND_TOKEN_PAGE, }); assert.equal(state.warning, null); }); it('locks Metamask', function () { const state = reduceApp(metamaskState, { type: actions.LOCK_METAMASK, }); assert.equal(state.warning, null); }); it('goes home', function () { const state = reduceApp(metamaskState, { type: actions.GO_HOME, }); assert.equal(state.accountDetail.subview, 'transactions'); assert.equal(state.accountDetail.accountExport, 'none'); assert.equal(state.accountDetail.privateKey, ''); assert.equal(state.warning, null); }); it('shows account detail', function () { const state = reduceApp(metamaskState, { type: actions.SHOW_ACCOUNT_DETAIL, value: 'context address', }); assert.equal(state.forgottenPassword, null); // default assert.equal(state.accountDetail.subview, 'transactions'); // default assert.equal(state.accountDetail.accountExport, 'none'); // default assert.equal(state.accountDetail.privateKey, ''); // default }); it('clears account details', function () { const exportPrivKeyModal = { accountDetail: { subview: 'export', accountExport: 'completed', privateKey: 'a-priv-key', }, }; const state = { ...metamaskState, appState: { ...exportPrivKeyModal } }; const newState = reduceApp(state, { type: actions.CLEAR_ACCOUNT_DETAILS, }); assert.deepStrictEqual(newState.accountDetail, {}); }); it('shoes account page', function () { const state = reduceApp(metamaskState, { type: actions.SHOW_ACCOUNTS_PAGE, }); assert.equal(state.isLoading, false); assert.equal(state.warning, null); assert.equal(state.scrollToBottom, false); assert.equal(state.forgottenPassword, false); }); it('shows confirm tx page', function () { const txs = { unapprovedTxs: { 1: { id: 1, }, 2: { id: 2, }, }, }; const oldState = { ...metamaskState, ...txs }; const state = reduceApp(oldState, { type: actions.SHOW_CONF_TX_PAGE, id: 2, }); assert.equal(state.txId, 2); assert.equal(state.warning, null); assert.equal(state.isLoading, false); }); it('completes tx continues to show pending txs current view context', function () { const txs = { unapprovedTxs: { 1: { id: 1, }, 2: { id: 2, }, }, }; const oldState = { ...metamaskState, ...txs }; const state = reduceApp(oldState, { type: actions.COMPLETED_TX, value: { id: 1, }, }); assert.equal(state.txId, null); assert.equal(state.warning, null); }); it('returns to account detail page when no unconf actions completed tx', function () { const state = reduceApp(metamaskState, { type: actions.COMPLETED_TX, value: { unconfirmedActionsCount: 0, }, }); assert.equal(state.warning, null); assert.equal(state.accountDetail.subview, 'transactions'); }); it('sets default warning when unlock fails', function () { const state = reduceApp(metamaskState, { type: actions.UNLOCK_FAILED, }); assert.equal(state.warning, 'Incorrect password. Try again.'); }); it('sets errors when unlock fails', function () { const state = reduceApp(metamaskState, { type: actions.UNLOCK_FAILED, value: 'errors', }); assert.equal(state.warning, 'errors'); }); it('sets warning to empty string when unlock succeeds', function () { const errorState = { warning: 'errors' }; const oldState = { ...metamaskState, ...errorState }; const state = reduceApp(oldState, { type: actions.UNLOCK_SUCCEEDED, }); assert.equal(state.warning, ''); }); it('sets hardware wallet default hd path', function () { const hdPaths = { trezor: "m/44'/60'/0'/0", ledger: "m/44'/60'/0'", }; const state = reduceApp(metamaskState, { type: actions.SET_HARDWARE_WALLET_DEFAULT_HD_PATH, value: { device: 'ledger', path: "m/44'/60'/0'", }, }); assert.deepEqual(state.defaultHdPaths, hdPaths); }); it('shows loading message', function () { const state = reduceApp(metamaskState, { type: actions.SHOW_LOADING, value: 'loading', }); assert.equal(state.isLoading, true); assert.equal(state.loadingMessage, 'loading'); }); it('hides loading message', function () { const loadingState = { isLoading: true }; const oldState = { ...metamaskState, ...loadingState }; const state = reduceApp(oldState, { type: actions.HIDE_LOADING, }); assert.equal(state.isLoading, false); }); it('displays warning', function () { const state = reduceApp(metamaskState, { type: actions.DISPLAY_WARNING, value: 'warning', }); assert.equal(state.isLoading, false); assert.equal(state.warning, 'warning'); }); it('hides warning', function () { const displayWarningState = { warning: 'warning' }; const oldState = { ...metamaskState, ...displayWarningState }; const state = reduceApp(oldState, { type: actions.HIDE_WARNING, }); assert.equal(state.warning, undefined); }); it('shows private key', function () { const state = reduceApp(metamaskState, { type: actions.SHOW_PRIVATE_KEY, value: 'private key', }); assert.equal(state.accountDetail.subview, 'export'); assert.equal(state.accountDetail.accountExport, 'completed'); assert.equal(state.accountDetail.privateKey, 'private key'); }); it('set mouse user state', function () { const state = reduceApp(metamaskState, { type: actions.SET_MOUSE_USER_STATE, value: true, }); assert.equal(state.isMouseUser, true); }); it('sets gas loading', function () { const state = reduceApp(metamaskState, { type: actions.GAS_LOADING_STARTED, }); assert.equal(state.gasIsLoading, true); }); it('unsets gas loading', function () { const gasLoadingState = { gasIsLoading: true }; const oldState = { ...metamaskState, ...gasLoadingState }; const state = reduceApp(oldState, { type: actions.GAS_LOADING_FINISHED, }); assert.equal(state.gasIsLoading, false); }); });