mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 09:57:02 +01:00
Disabling network and account changes after the send flow is initiated (#18086)
This commit is contained in:
parent
135d4eaaaa
commit
643a89f24d
@ -6,10 +6,10 @@
|
|||||||
// subset of files to check against these targets.
|
// subset of files to check against these targets.
|
||||||
module.exports = {
|
module.exports = {
|
||||||
global: {
|
global: {
|
||||||
lines: 66,
|
lines: 67.8,
|
||||||
branches: 54.4,
|
branches: 55.84,
|
||||||
statements: 65,
|
statements: 67.13,
|
||||||
functions: 58.5,
|
functions: 59.66,
|
||||||
},
|
},
|
||||||
transforms: {
|
transforms: {
|
||||||
branches: 100,
|
branches: 100,
|
||||||
|
@ -2,6 +2,13 @@
|
|||||||
"DNS": {
|
"DNS": {
|
||||||
"resolution": ""
|
"resolution": ""
|
||||||
},
|
},
|
||||||
|
"activeTab": {
|
||||||
|
"id": 113,
|
||||||
|
"title": "E2E Test Dapp",
|
||||||
|
"origin": "https://metamask.github.io",
|
||||||
|
"protocol": "https:",
|
||||||
|
"url": "https://metamask.github.io/test-dapp/"
|
||||||
|
},
|
||||||
"appState": {
|
"appState": {
|
||||||
"networkDropdownOpen": false,
|
"networkDropdownOpen": false,
|
||||||
"gasIsLoading": false,
|
"gasIsLoading": false,
|
||||||
@ -16,7 +23,8 @@
|
|||||||
"name": null
|
"name": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"warning": null
|
"warning": null,
|
||||||
|
"alertOpen": false
|
||||||
},
|
},
|
||||||
"confirmTransaction": {
|
"confirmTransaction": {
|
||||||
"txData": {
|
"txData": {
|
||||||
@ -42,6 +50,10 @@
|
|||||||
"history": {
|
"history": {
|
||||||
"mostRecentOverviewPage": "/mostRecentOverviewPage"
|
"mostRecentOverviewPage": "/mostRecentOverviewPage"
|
||||||
},
|
},
|
||||||
|
"invalidCustomNetwork": {
|
||||||
|
"state": "CLOSED",
|
||||||
|
"networkName": ""
|
||||||
|
},
|
||||||
"metamask": {
|
"metamask": {
|
||||||
"ipfsGateway": "",
|
"ipfsGateway": "",
|
||||||
"dismissSeedBackUpReminder": false,
|
"dismissSeedBackUpReminder": false,
|
||||||
@ -88,6 +100,14 @@
|
|||||||
"ensResolutionsByAddress": {},
|
"ensResolutionsByAddress": {},
|
||||||
"isAccountMenuOpen": false,
|
"isAccountMenuOpen": false,
|
||||||
"isUnlocked": true,
|
"isUnlocked": true,
|
||||||
|
"completedOnboarding": true,
|
||||||
|
"usedNetworks": {
|
||||||
|
"0x1": true,
|
||||||
|
"0x5": true,
|
||||||
|
"0x539": true
|
||||||
|
},
|
||||||
|
"showTestnetMessageInDropdown": true,
|
||||||
|
"networkConfigurations": {},
|
||||||
"alertEnabledness": {
|
"alertEnabledness": {
|
||||||
"unconnectedAccount": true
|
"unconnectedAccount": true
|
||||||
},
|
},
|
||||||
@ -1358,5 +1378,8 @@
|
|||||||
"balance": "0x4563918244f40000"
|
"balance": "0x4563918244f40000"
|
||||||
},
|
},
|
||||||
"stage": "DRAFT"
|
"stage": "DRAFT"
|
||||||
|
},
|
||||||
|
"unconnectedAccount": {
|
||||||
|
"state": "CLOSED"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,7 @@ export default class AppHeader extends PureComponent {
|
|||||||
className={classnames('account-menu__icon', {
|
className={classnames('account-menu__icon', {
|
||||||
'account-menu__icon--disabled': disabled,
|
'account-menu__icon--disabled': disabled,
|
||||||
})}
|
})}
|
||||||
|
disabled={Boolean(disabled)}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (!disabled) {
|
if (!disabled) {
|
||||||
!isAccountMenuOpen &&
|
!isAccountMenuOpen &&
|
||||||
|
@ -322,7 +322,11 @@ export default class Routes extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onEditTransactionPage() {
|
onEditTransactionPage() {
|
||||||
return this.props.sendStage === SEND_STAGES.EDIT;
|
return (
|
||||||
|
this.props.sendStage === SEND_STAGES.EDIT ||
|
||||||
|
this.props.sendStage === SEND_STAGES.DRAFT ||
|
||||||
|
this.props.sendStage === SEND_STAGES.ADD_RECIPIENT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
onSwapsPage() {
|
onSwapsPage() {
|
||||||
|
122
ui/pages/routes/routes.component.test.js
Normal file
122
ui/pages/routes/routes.component.test.js
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import configureMockStore from 'redux-mock-store';
|
||||||
|
import { fireEvent } from '@testing-library/react';
|
||||||
|
|
||||||
|
import { SEND_STAGES } from '../../ducks/send';
|
||||||
|
import { renderWithProvider } from '../../../test/jest';
|
||||||
|
import mockSendState from '../../../test/data/mock-send-state.json';
|
||||||
|
import Routes from '.';
|
||||||
|
|
||||||
|
const mockShowNetworkDropdown = jest.fn();
|
||||||
|
const mockHideNetworkDropdown = jest.fn();
|
||||||
|
|
||||||
|
jest.mock('webextension-polyfill', () => ({
|
||||||
|
runtime: {
|
||||||
|
onMessage: {
|
||||||
|
addListener: jest.fn(),
|
||||||
|
removeListener: jest.fn(),
|
||||||
|
},
|
||||||
|
getManifest: () => ({ manifest_version: 2 }),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../../store/actions', () => ({
|
||||||
|
getGasFeeTimeEstimate: jest.fn().mockImplementation(() => Promise.resolve()),
|
||||||
|
getGasFeeEstimatesAndStartPolling: jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(() => Promise.resolve()),
|
||||||
|
addPollingTokenToAppState: jest.fn(),
|
||||||
|
showNetworkDropdown: () => mockShowNetworkDropdown,
|
||||||
|
hideNetworkDropdown: () => mockHideNetworkDropdown,
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('react-router-dom', () => ({
|
||||||
|
...jest.requireActual('react-router-dom'),
|
||||||
|
useHistory: () => ({
|
||||||
|
push: jest.fn(),
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../../ducks/send', () => ({
|
||||||
|
...jest.requireActual('../../ducks/send'),
|
||||||
|
resetSendState: () => ({ type: 'XXX' }),
|
||||||
|
getGasPrice: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../../ducks/domains', () => ({
|
||||||
|
...jest.requireActual('../../ducks/domains'),
|
||||||
|
initializeDomainSlice: () => ({ type: 'XXX' }),
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('Routes Component', () => {
|
||||||
|
afterEach(() => {
|
||||||
|
mockShowNetworkDropdown.mockClear();
|
||||||
|
mockHideNetworkDropdown.mockClear();
|
||||||
|
});
|
||||||
|
describe('render during send flow', () => {
|
||||||
|
it('should render with network and account change disabled while adding recipient for send flow', () => {
|
||||||
|
const store = configureMockStore()({
|
||||||
|
...mockSendState,
|
||||||
|
send: {
|
||||||
|
...mockSendState.send,
|
||||||
|
stage: SEND_STAGES.ADD_RECIPIENT,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const { getByTestId } = renderWithProvider(<Routes />, store, ['/send']);
|
||||||
|
|
||||||
|
expect(getByTestId('account-menu-icon')).toBeDisabled();
|
||||||
|
|
||||||
|
const networkDisplay = getByTestId('network-display');
|
||||||
|
fireEvent.click(networkDisplay);
|
||||||
|
expect(mockShowNetworkDropdown).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
it('should render with network and account change disabled while user is in send page', () => {
|
||||||
|
const store = configureMockStore()({
|
||||||
|
...mockSendState,
|
||||||
|
});
|
||||||
|
const { getByTestId } = renderWithProvider(<Routes />, store, ['/send']);
|
||||||
|
|
||||||
|
expect(getByTestId('account-menu-icon')).toBeDisabled();
|
||||||
|
|
||||||
|
const networkDisplay = getByTestId('network-display');
|
||||||
|
fireEvent.click(networkDisplay);
|
||||||
|
expect(mockShowNetworkDropdown).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
it('should render with network and account change disabled while editing a send transaction', () => {
|
||||||
|
const store = configureMockStore()({
|
||||||
|
...mockSendState,
|
||||||
|
send: {
|
||||||
|
...mockSendState.send,
|
||||||
|
stage: SEND_STAGES.EDIT,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const { getByTestId } = renderWithProvider(<Routes />, store, ['/send']);
|
||||||
|
|
||||||
|
expect(getByTestId('account-menu-icon')).toBeDisabled();
|
||||||
|
|
||||||
|
const networkDisplay = getByTestId('network-display');
|
||||||
|
fireEvent.click(networkDisplay);
|
||||||
|
expect(mockShowNetworkDropdown).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
it('should render when send transaction is not active', () => {
|
||||||
|
const store = configureMockStore()({
|
||||||
|
...mockSendState,
|
||||||
|
metamask: {
|
||||||
|
...mockSendState.metamask,
|
||||||
|
swapsState: {
|
||||||
|
...mockSendState.metamask.swapsState,
|
||||||
|
swapsFeatureIsLive: true,
|
||||||
|
},
|
||||||
|
pendingApprovals: {},
|
||||||
|
announcements: {},
|
||||||
|
},
|
||||||
|
send: {
|
||||||
|
...mockSendState.send,
|
||||||
|
stage: SEND_STAGES.INACTIVE,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const { getByTestId } = renderWithProvider(<Routes />, store);
|
||||||
|
expect(getByTestId('account-menu-icon')).not.toBeDisabled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user