mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 09:57:02 +01:00
Continue converting tests from enzyme to @testing-library/react (#16458)
* Add transaction activity log component * Remove duplicate tx activity log snapshot. * Convert Advanced Tab to tlr. * Lint fix * Convert Settings Tab test to tlr. * Convert Send Amount Row test to tlr. * Convert Send Row Error Message test to tlr. * Add Mock Send State json file. * Lint fix * Use proper testid for jazz icon for settings e2e * Update Send Amount Row snapshot
This commit is contained in:
parent
33b09c94df
commit
119219b5d2
1338
test/data/mock-send-state.json
Normal file
1338
test/data/mock-send-state.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,7 @@ describe('Settings', function () {
|
|||||||
|
|
||||||
// finds the jazzicon toggle turned on
|
// finds the jazzicon toggle turned on
|
||||||
await driver.findElement(
|
await driver.findElement(
|
||||||
'[data-test-id="jazz_icon"] .settings-page__content-item__identicon__item__icon--active',
|
'[data-testid="jazz_icon"] .settings-page__content-item__identicon__item__icon--active',
|
||||||
);
|
);
|
||||||
|
|
||||||
const jazziconText = await driver.findElement({
|
const jazziconText = await driver.findElement({
|
||||||
|
@ -0,0 +1,217 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`SendAmountRow Component render Collectible Asset Type should match snapshot for token collectible type 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-row"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-label"
|
||||||
|
>
|
||||||
|
Amount:
|
||||||
|
<button
|
||||||
|
class="send-v2__amount-max"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
readonly=""
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="send-v2__amount-max__button"
|
||||||
|
>
|
||||||
|
Max
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-field-container"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-field"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input__inputs"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input__input-container"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
class="unit-input__input"
|
||||||
|
data-testid="currency-input"
|
||||||
|
dir="ltr"
|
||||||
|
placeholder="0"
|
||||||
|
style="width: 1.5ch;"
|
||||||
|
type="number"
|
||||||
|
value="0"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="unit-input__suffix"
|
||||||
|
>
|
||||||
|
ETH
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="currency-input__conversion-component"
|
||||||
|
>
|
||||||
|
No conversion rate available
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
class="currency-input__swap-component"
|
||||||
|
data-testid="currency-swap"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="fa fa-retweet fa-lg"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`SendAmountRow Component render Native Asset Type should match snapshot for native asset type 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-row"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-label"
|
||||||
|
>
|
||||||
|
Amount:
|
||||||
|
<button
|
||||||
|
class="send-v2__amount-max"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
readonly=""
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="send-v2__amount-max__button"
|
||||||
|
>
|
||||||
|
Max
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-field-container"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-field"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input__inputs"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input__input-container"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
class="unit-input__input"
|
||||||
|
data-testid="currency-input"
|
||||||
|
dir="ltr"
|
||||||
|
placeholder="0"
|
||||||
|
style="width: 1.5ch;"
|
||||||
|
type="number"
|
||||||
|
value="1"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="unit-input__suffix"
|
||||||
|
>
|
||||||
|
ETH
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="currency-input__conversion-component"
|
||||||
|
>
|
||||||
|
No conversion rate available
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
class="currency-input__swap-component"
|
||||||
|
data-testid="currency-swap"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="fa fa-retweet fa-lg"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`SendAmountRow Component render Token Asset Type should match snapshot for token asset type 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-row"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-label"
|
||||||
|
>
|
||||||
|
Amount:
|
||||||
|
<button
|
||||||
|
class="send-v2__amount-max"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
readonly=""
|
||||||
|
type="checkbox"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="send-v2__amount-max__button"
|
||||||
|
>
|
||||||
|
Max
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-field-container"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="send-v2__form-field"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input__inputs"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="unit-input__input-container"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
class="unit-input__input"
|
||||||
|
dir="ltr"
|
||||||
|
placeholder="0"
|
||||||
|
style="width: 1.5ch;"
|
||||||
|
type="number"
|
||||||
|
value="0"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="unit-input__suffix"
|
||||||
|
>
|
||||||
|
META
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="currency-input__conversion-component"
|
||||||
|
>
|
||||||
|
No conversion rate available
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
@ -1,102 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { shallow } from 'enzyme';
|
|
||||||
import sinon from 'sinon';
|
|
||||||
import SendRowWrapper from '../send-row-wrapper/send-row-wrapper.component';
|
|
||||||
import UserPreferencedTokenInput from '../../../../components/app/user-preferenced-token-input';
|
|
||||||
import { ASSET_TYPES } from '../../../../../shared/constants/transaction';
|
|
||||||
import SendAmountRow from './send-amount-row.component';
|
|
||||||
|
|
||||||
import AmountMaxButton from './amount-max-button/amount-max-button';
|
|
||||||
|
|
||||||
describe('SendAmountRow Component', () => {
|
|
||||||
describe('updateAmount', () => {
|
|
||||||
it('should call updateSendAmount', () => {
|
|
||||||
const {
|
|
||||||
instance,
|
|
||||||
propsMethodSpies: { updateSendAmount },
|
|
||||||
} = shallowRenderSendAmountRow();
|
|
||||||
|
|
||||||
expect(updateSendAmount.callCount).toStrictEqual(0);
|
|
||||||
|
|
||||||
instance.handleChange('someAmount');
|
|
||||||
|
|
||||||
expect(
|
|
||||||
updateSendAmount.calledOnceWithExactly('someAmount'),
|
|
||||||
).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('render', () => {
|
|
||||||
it('should render a SendRowWrapper component', () => {
|
|
||||||
const { wrapper } = shallowRenderSendAmountRow();
|
|
||||||
|
|
||||||
expect(wrapper.find(SendRowWrapper)).toHaveLength(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should pass the correct props to SendRowWrapper', () => {
|
|
||||||
const { wrapper } = shallowRenderSendAmountRow();
|
|
||||||
const { errorType, label, showError } = wrapper
|
|
||||||
.find(SendRowWrapper)
|
|
||||||
.props();
|
|
||||||
|
|
||||||
expect(errorType).toStrictEqual('amount');
|
|
||||||
expect(label).toStrictEqual('amount_t:');
|
|
||||||
expect(showError).toStrictEqual(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an AmountMaxButton as the first child of the SendRowWrapper', () => {
|
|
||||||
const { wrapper } = shallowRenderSendAmountRow();
|
|
||||||
|
|
||||||
expect(
|
|
||||||
wrapper.find(SendRowWrapper).childAt(0).is(AmountMaxButton),
|
|
||||||
).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render a UserPreferencedTokenInput as the second child of the SendRowWrapper', () => {
|
|
||||||
const { wrapper } = shallowRenderSendAmountRow();
|
|
||||||
|
|
||||||
expect(
|
|
||||||
wrapper.find(SendRowWrapper).childAt(1).is(UserPreferencedTokenInput),
|
|
||||||
).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render the UserPreferencedTokenInput with the correct props', () => {
|
|
||||||
const { wrapper } = shallowRenderSendAmountRow();
|
|
||||||
const { onChange, error, value } = wrapper
|
|
||||||
.find(SendRowWrapper)
|
|
||||||
.childAt(1)
|
|
||||||
.props();
|
|
||||||
|
|
||||||
expect(error).toStrictEqual(false);
|
|
||||||
expect(value).toStrictEqual('mockAmount');
|
|
||||||
|
|
||||||
onChange('mockNewAmount');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function shallowRenderSendAmountRow() {
|
|
||||||
const updateSendAmount = sinon.spy();
|
|
||||||
const wrapper = shallow(
|
|
||||||
<SendAmountRow
|
|
||||||
amount="mockAmount"
|
|
||||||
inError={false}
|
|
||||||
asset={{
|
|
||||||
type: ASSET_TYPES.TOKEN,
|
|
||||||
balance: 'mockTokenBalance',
|
|
||||||
details: { address: 'mockTokenAddress' },
|
|
||||||
}}
|
|
||||||
updateSendAmount={updateSendAmount}
|
|
||||||
/>,
|
|
||||||
{ context: { t: (str) => `${str}_t` } },
|
|
||||||
);
|
|
||||||
const instance = wrapper.instance();
|
|
||||||
|
|
||||||
return {
|
|
||||||
instance,
|
|
||||||
wrapper,
|
|
||||||
propsMethodSpies: {
|
|
||||||
updateSendAmount,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
import sinon from 'sinon';
|
|
||||||
|
|
||||||
import { updateSendAmount } from '../../../../ducks/send';
|
|
||||||
|
|
||||||
let mapDispatchToProps;
|
|
||||||
|
|
||||||
jest.mock('react-redux', () => ({
|
|
||||||
connect: (_, md) => {
|
|
||||||
mapDispatchToProps = md;
|
|
||||||
return () => ({});
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('../../../../ducks/send', () => ({
|
|
||||||
updateSendAmount: jest.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
require('./send-amount-row.container');
|
|
||||||
|
|
||||||
describe('send-amount-row container', () => {
|
|
||||||
describe('mapDispatchToProps()', () => {
|
|
||||||
let dispatchSpy;
|
|
||||||
let mapDispatchToPropsObject;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
dispatchSpy = sinon.spy();
|
|
||||||
mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('updateSendAmount()', () => {
|
|
||||||
it('should dispatch an action', () => {
|
|
||||||
mapDispatchToPropsObject.updateSendAmount('mockAmount');
|
|
||||||
expect(dispatchSpy.calledOnce).toStrictEqual(true);
|
|
||||||
expect(updateSendAmount).toHaveBeenCalled();
|
|
||||||
expect(updateSendAmount).toHaveBeenCalledWith('mockAmount');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@ -0,0 +1,110 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { fireEvent } from '@testing-library/react';
|
||||||
|
import configureMockStore from 'redux-mock-store';
|
||||||
|
import thunk from 'redux-thunk';
|
||||||
|
import mockSendState from '../../../../../test/data/mock-send-state.json';
|
||||||
|
import { renderWithProvider } from '../../../../../test/lib/render-helpers';
|
||||||
|
import { ASSET_TYPES } from '../../../../../shared/constants/transaction';
|
||||||
|
import SendAmountRow from '.';
|
||||||
|
|
||||||
|
const mockUpdateSendAmount = jest.fn();
|
||||||
|
|
||||||
|
jest.mock('../../../../ducks/send', () => ({
|
||||||
|
...jest.requireActual('../../../../ducks/send'),
|
||||||
|
updateSendAmount: () => mockUpdateSendAmount,
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('SendAmountRow Component', () => {
|
||||||
|
describe('render', () => {
|
||||||
|
describe('Native Asset Type', () => {
|
||||||
|
const mockStore = configureMockStore([thunk])(mockSendState);
|
||||||
|
|
||||||
|
it('should match snapshot for native asset type', () => {
|
||||||
|
const { container } = renderWithProvider(<SendAmountRow />, mockStore);
|
||||||
|
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Token Asset Type', () => {
|
||||||
|
const tokenState = {
|
||||||
|
...mockSendState,
|
||||||
|
send: {
|
||||||
|
currentTransactionUUID: '1-tx',
|
||||||
|
draftTransactions: {
|
||||||
|
'1-tx': {
|
||||||
|
asset: {
|
||||||
|
balance: '0x1158e460913d00000', // 20000000000000000000
|
||||||
|
details: {
|
||||||
|
address: '0x617b3f8050a0BD94b6b1da02B4384eE5B4DF13F4',
|
||||||
|
symbol: 'META',
|
||||||
|
balance: '1000000000000000000',
|
||||||
|
decimals: 18,
|
||||||
|
string: '1',
|
||||||
|
balanceError: null,
|
||||||
|
isERC721: false,
|
||||||
|
image: '',
|
||||||
|
standard: 'ERC20',
|
||||||
|
},
|
||||||
|
error: null,
|
||||||
|
type: ASSET_TYPES.TOKEN,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const mockStore = configureMockStore([thunk])(tokenState);
|
||||||
|
|
||||||
|
it('should match snapshot for token asset type', () => {
|
||||||
|
const { container } = renderWithProvider(<SendAmountRow />, mockStore);
|
||||||
|
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Collectible Asset Type', () => {
|
||||||
|
it('should match snapshot for token collectible type', () => {
|
||||||
|
const collectibleState = {
|
||||||
|
...mockSendState,
|
||||||
|
send: {
|
||||||
|
currentTransactionUUID: '1-tx',
|
||||||
|
draftTransactions: {
|
||||||
|
'1-tx': {
|
||||||
|
asset: {
|
||||||
|
balance: '',
|
||||||
|
details: null,
|
||||||
|
error: null,
|
||||||
|
type: ASSET_TYPES.COLLECTIBLE,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockStore = configureMockStore([thunk])(collectibleState);
|
||||||
|
|
||||||
|
const { container } = renderWithProvider(<SendAmountRow />, mockStore);
|
||||||
|
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('updateAmount', () => {
|
||||||
|
const mockStore = configureMockStore([thunk])(mockSendState);
|
||||||
|
|
||||||
|
it('should call updateSendAmount', () => {
|
||||||
|
const { queryByTestId } = renderWithProvider(
|
||||||
|
<SendAmountRow />,
|
||||||
|
mockStore,
|
||||||
|
);
|
||||||
|
queryByTestId('currency-input');
|
||||||
|
|
||||||
|
fireEvent.change(queryByTestId('currency-input'), {
|
||||||
|
target: { value: 0.5 },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(mockUpdateSendAmount).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,13 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`SendRowErrorMessage Component render should match snapshot with no error 1`] = `<div />`;
|
||||||
|
|
||||||
|
exports[`SendRowErrorMessage Component render should render an error message if the passed errors contain an error of errorType 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="send-v2__error send-v2__error-amount"
|
||||||
|
>
|
||||||
|
Insufficient funds.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
@ -1,32 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { shallow } from 'enzyme';
|
|
||||||
import SendRowErrorMessage from './send-row-error-message.component';
|
|
||||||
|
|
||||||
describe('SendRowErrorMessage Component', () => {
|
|
||||||
let wrapper;
|
|
||||||
|
|
||||||
describe('render', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(
|
|
||||||
<SendRowErrorMessage
|
|
||||||
errors={{ error1: 'abc', error2: 'def' }}
|
|
||||||
errorType="error3"
|
|
||||||
/>,
|
|
||||||
{ context: { t: (str) => `${str}_t` } },
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render null if the passed errors do not contain an error of errorType', () => {
|
|
||||||
expect(wrapper.find('.send-v2__error')).toHaveLength(0);
|
|
||||||
expect(wrapper.html()).toBeNull();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an error message if the passed errors contain an error of errorType', () => {
|
|
||||||
wrapper.setProps({
|
|
||||||
errors: { error1: 'abc', error2: 'def', error3: 'xyz' },
|
|
||||||
});
|
|
||||||
expect(wrapper.find('.send-v2__error')).toHaveLength(1);
|
|
||||||
expect(wrapper.find('.send-v2__error').text()).toStrictEqual('xyz_t');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,28 +0,0 @@
|
|||||||
/* eslint-disable import/unambiguous */
|
|
||||||
let mapStateToProps;
|
|
||||||
|
|
||||||
jest.mock('react-redux', () => ({
|
|
||||||
connect: (ms) => {
|
|
||||||
mapStateToProps = ms;
|
|
||||||
return () => ({});
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('../../../../../ducks/send', () => ({
|
|
||||||
getSendErrors: (s) => `mockErrors:${s}`,
|
|
||||||
}));
|
|
||||||
|
|
||||||
require('./send-row-error-message.container');
|
|
||||||
|
|
||||||
describe('send-row-error-message container', () => {
|
|
||||||
describe('mapStateToProps()', () => {
|
|
||||||
it('should map the correct properties to props', () => {
|
|
||||||
expect(
|
|
||||||
mapStateToProps('mockState', { errorType: 'someType' }),
|
|
||||||
).toStrictEqual({
|
|
||||||
errors: 'mockErrors:mockState',
|
|
||||||
errorType: 'someType',
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@ -0,0 +1,55 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import configureMockStore from 'redux-mock-store';
|
||||||
|
import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../../../helpers/constants/error-keys';
|
||||||
|
import { renderWithProvider } from '../../../../../../test/lib/render-helpers';
|
||||||
|
import SendRowErrorMessage from '.';
|
||||||
|
|
||||||
|
describe('SendRowErrorMessage Component', () => {
|
||||||
|
describe('render', () => {
|
||||||
|
it('should match snapshot with no error', () => {
|
||||||
|
const mockState = {
|
||||||
|
send: {
|
||||||
|
draftTransactions: {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockStore = configureMockStore()(mockState);
|
||||||
|
const { container } = renderWithProvider(
|
||||||
|
<SendRowErrorMessage />,
|
||||||
|
mockStore,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render an error message if the passed errors contain an error of errorType', () => {
|
||||||
|
const props = {
|
||||||
|
errorType: 'amount',
|
||||||
|
};
|
||||||
|
|
||||||
|
const sendErrorState = {
|
||||||
|
send: {
|
||||||
|
currentTransactionUUID: '1-tx',
|
||||||
|
draftTransactions: {
|
||||||
|
'1-tx': {
|
||||||
|
gas: {
|
||||||
|
error: INSUFFICIENT_FUNDS_ERROR_KEY,
|
||||||
|
},
|
||||||
|
amount: {
|
||||||
|
error: INSUFFICIENT_FUNDS_ERROR_KEY,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const mockStore = configureMockStore()(sendErrorState);
|
||||||
|
|
||||||
|
const { container } = renderWithProvider(
|
||||||
|
<SendRowErrorMessage {...props} />,
|
||||||
|
mockStore,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -100,6 +100,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
<div className="settings-page__content-item">
|
<div className="settings-page__content-item">
|
||||||
<div className="settings-page__content-item-col">
|
<div className="settings-page__content-item-col">
|
||||||
<Dropdown
|
<Dropdown
|
||||||
|
data-testid="currency-select"
|
||||||
id="select-currency"
|
id="select-currency"
|
||||||
options={currencyOptions}
|
options={currencyOptions}
|
||||||
selectedOption={currentCurrency}
|
selectedOption={currentCurrency}
|
||||||
@ -132,6 +133,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
<div className="settings-page__content-item">
|
<div className="settings-page__content-item">
|
||||||
<div className="settings-page__content-item-col">
|
<div className="settings-page__content-item-col">
|
||||||
<Dropdown
|
<Dropdown
|
||||||
|
data-testid="locale-select"
|
||||||
id="select-locale"
|
id="select-locale"
|
||||||
options={localeOptions}
|
options={localeOptions}
|
||||||
selectedOption={currentLocale}
|
selectedOption={currentLocale}
|
||||||
@ -150,6 +152,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
ref={this.settingsRefs[5]}
|
ref={this.settingsRefs[5]}
|
||||||
|
data-testid="hide-zero-balance-tokens"
|
||||||
className="settings-page__content-row"
|
className="settings-page__content-row"
|
||||||
id="toggle-zero-balance"
|
id="toggle-zero-balance"
|
||||||
>
|
>
|
||||||
@ -197,7 +200,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
</span>
|
</span>
|
||||||
<div className="settings-page__content-item__identicon">
|
<div className="settings-page__content-item__identicon">
|
||||||
<button
|
<button
|
||||||
data-test-id="jazz_icon"
|
data-testid="jazz_icon"
|
||||||
onClick={() => setUseBlockie(false)}
|
onClick={() => setUseBlockie(false)}
|
||||||
className="settings-page__content-item__identicon__item"
|
className="settings-page__content-item__identicon__item"
|
||||||
>
|
>
|
||||||
@ -230,7 +233,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
</Typography>
|
</Typography>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
data-test-id="blockie_icon"
|
data-testid="blockie_icon"
|
||||||
onClick={() => setUseBlockie(true)}
|
onClick={() => setUseBlockie(true)}
|
||||||
className="settings-page__content-item__identicon__item"
|
className="settings-page__content-item__identicon__item"
|
||||||
>
|
>
|
||||||
@ -274,7 +277,6 @@ export default class SettingsTab extends PureComponent {
|
|||||||
setUseNativeCurrencyAsPrimaryCurrencyPreference,
|
setUseNativeCurrencyAsPrimaryCurrencyPreference,
|
||||||
useNativeCurrencyAsPrimaryCurrency,
|
useNativeCurrencyAsPrimaryCurrency,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={this.settingsRefs[1]} className="settings-page__content-row">
|
<div ref={this.settingsRefs[1]} className="settings-page__content-row">
|
||||||
<div className="settings-page__content-item">
|
<div className="settings-page__content-item">
|
||||||
@ -289,6 +291,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
<div className="settings-tab__radio-button">
|
<div className="settings-tab__radio-button">
|
||||||
<input
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
|
data-testid="toggle-native-currency"
|
||||||
id="native-primary-currency"
|
id="native-primary-currency"
|
||||||
onChange={() =>
|
onChange={() =>
|
||||||
setUseNativeCurrencyAsPrimaryCurrencyPreference(true)
|
setUseNativeCurrencyAsPrimaryCurrencyPreference(true)
|
||||||
@ -305,6 +308,7 @@ export default class SettingsTab extends PureComponent {
|
|||||||
<div className="settings-tab__radio-button">
|
<div className="settings-tab__radio-button">
|
||||||
<input
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
|
data-testid="toggle-fiat-currency"
|
||||||
id="fiat-primary-currency"
|
id="fiat-primary-currency"
|
||||||
onChange={() =>
|
onChange={() =>
|
||||||
setUseNativeCurrencyAsPrimaryCurrencyPreference(false)
|
setUseNativeCurrencyAsPrimaryCurrencyPreference(false)
|
||||||
|
@ -1,142 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import sinon from 'sinon';
|
|
||||||
import { mount } from 'enzyme';
|
|
||||||
import SettingsTab from './settings-tab.container';
|
|
||||||
import 'jest-canvas-mock';
|
|
||||||
|
|
||||||
describe('Settings Tab', () => {
|
|
||||||
let wrapper;
|
|
||||||
|
|
||||||
const props = {
|
|
||||||
setCurrentCurrency: sinon.spy(),
|
|
||||||
displayWarning: sinon.spy(),
|
|
||||||
setUseBlockie: sinon.spy(),
|
|
||||||
updateCurrentLocale: sinon.spy(),
|
|
||||||
setUseNativeCurrencyAsPrimaryCurrencyPreference: sinon.spy(),
|
|
||||||
setHideZeroBalanceTokens: sinon.spy(),
|
|
||||||
warning: '',
|
|
||||||
currentLocale: 'en',
|
|
||||||
useBlockie: false,
|
|
||||||
currentCurrency: 'usd',
|
|
||||||
conversionDate: 1,
|
|
||||||
nativeCurrency: 'eth',
|
|
||||||
useNativeCurrencyAsPrimaryCurrency: true,
|
|
||||||
selectedAddress: '0x5CfE73b6021E818B776b421B1c4Db2474086a7e1',
|
|
||||||
tokenList: {
|
|
||||||
'0x6b175474e89094c44da98b954eedeac495271d0f': {
|
|
||||||
address: '0x6b175474e89094c44da98b954eedeac495271d0f',
|
|
||||||
symbol: 'META',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'metamark.svg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0xB8c77482e45F1F44dE1745F52C74426C631bDD52': {
|
|
||||||
address: '0xB8c77482e45F1F44dE1745F52C74426C631bDD52',
|
|
||||||
symbol: '0X',
|
|
||||||
decimals: 18,
|
|
||||||
image: '0x.svg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0x1f9840a85d5af5bf1d1762f925bdaddc4201f984': {
|
|
||||||
address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',
|
|
||||||
symbol: 'AST',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'ast.png',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2': {
|
|
||||||
address: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
|
|
||||||
symbol: 'BAT',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'BAT_icon.svg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1': {
|
|
||||||
address: '0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1',
|
|
||||||
symbol: 'CVL',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'CVL_token.svg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e': {
|
|
||||||
address: '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',
|
|
||||||
symbol: 'GLA',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'gladius.svg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0x467Bccd9d29f223BcE8043b84E8C8B282827790F': {
|
|
||||||
address: '0x467Bccd9d29f223BcE8043b84E8C8B282827790F',
|
|
||||||
symbol: 'GNO',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'gnosis.svg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0xff20817765cb7f73d4bde2e66e067e58d11095c2': {
|
|
||||||
address: '0xff20817765cb7f73d4bde2e66e067e58d11095c2',
|
|
||||||
symbol: 'OMG',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'omg.jpg',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
'0x8e870d67f660d95d5be530380d0ec0bd388289e1': {
|
|
||||||
address: '0x8e870d67f660d95d5be530380d0ec0bd388289e1',
|
|
||||||
symbol: 'WED',
|
|
||||||
decimals: 18,
|
|
||||||
image: 'wed.png',
|
|
||||||
unlisted: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = mount(<SettingsTab.WrappedComponent {...props} />, {
|
|
||||||
context: {
|
|
||||||
t: (str) => str,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('selects currency', async () => {
|
|
||||||
const selectCurrency = wrapper.find('#select-currency');
|
|
||||||
|
|
||||||
selectCurrency.props().onChange('eur');
|
|
||||||
expect(props.setCurrentCurrency.calledOnce).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('selects locale', async () => {
|
|
||||||
const selectLocale = wrapper.find('#select-locale');
|
|
||||||
|
|
||||||
await selectLocale.props().onChange('ja');
|
|
||||||
expect(props.updateCurrentLocale.calledOnce).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('sets fiat primary currency', () => {
|
|
||||||
const selectFiat = wrapper.find('#fiat-primary-currency');
|
|
||||||
|
|
||||||
selectFiat.simulate('change');
|
|
||||||
expect(
|
|
||||||
props.setUseNativeCurrencyAsPrimaryCurrencyPreference.calledOnce,
|
|
||||||
).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('clicks jazzicon', () => {
|
|
||||||
const toggleBlockies = wrapper.find('#jazzicon');
|
|
||||||
|
|
||||||
toggleBlockies.simulate('click');
|
|
||||||
expect(props.setUseBlockie.calledOnce).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('clicks blockies icon', () => {
|
|
||||||
const toggleBlockies = wrapper.find('#blockies');
|
|
||||||
|
|
||||||
toggleBlockies.simulate('click');
|
|
||||||
expect(props.setUseBlockie.calledOnce).toStrictEqual(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('toggles hiding zero balance', () => {
|
|
||||||
const toggleBlockies = wrapper.find('#toggle-zero-balance input');
|
|
||||||
|
|
||||||
toggleBlockies.simulate('click');
|
|
||||||
expect(props.setHideZeroBalanceTokens.calledOnce).toStrictEqual(true);
|
|
||||||
});
|
|
||||||
});
|
|
95
ui/pages/settings/settings-tab/settings-tab.test.js
Normal file
95
ui/pages/settings/settings-tab/settings-tab.test.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { fireEvent } from '@testing-library/react';
|
||||||
|
import configureMockStore from 'redux-mock-store';
|
||||||
|
import thunk from 'redux-thunk';
|
||||||
|
import { renderWithProvider } from '../../../../test/lib/render-helpers';
|
||||||
|
import mockState from '../../../../test/data/mock-state.json';
|
||||||
|
import SettingsTab from '.';
|
||||||
|
import 'jest-canvas-mock';
|
||||||
|
|
||||||
|
const mockSetCurrentCurrency = jest.fn();
|
||||||
|
const mockUpdateCurrentLocale = jest.fn();
|
||||||
|
const mockSetUseNativeCurrencyAsPrimaryCurrencyPreference = jest.fn();
|
||||||
|
const mockSetUseBlockie = jest.fn();
|
||||||
|
const mockSetHideZeroBalanceTokens = jest.fn();
|
||||||
|
|
||||||
|
jest.mock('../../../store/actions.js', () => ({
|
||||||
|
setCurrentCurrency: () => mockSetCurrentCurrency,
|
||||||
|
updateCurrentLocale: () => mockUpdateCurrentLocale,
|
||||||
|
setUseNativeCurrencyAsPrimaryCurrencyPreference: () =>
|
||||||
|
mockSetUseNativeCurrencyAsPrimaryCurrencyPreference,
|
||||||
|
setUseBlockie: () => mockSetUseBlockie,
|
||||||
|
setHideZeroBalanceTokens: () => mockSetHideZeroBalanceTokens,
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('Settings Tab', () => {
|
||||||
|
const mockStore = configureMockStore([thunk])(mockState);
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
mockSetCurrentCurrency.mockReset();
|
||||||
|
mockUpdateCurrentLocale.mockReset();
|
||||||
|
mockSetUseNativeCurrencyAsPrimaryCurrencyPreference.mockReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('selects currency', async () => {
|
||||||
|
const { queryByTestId } = renderWithProvider(<SettingsTab />, mockStore);
|
||||||
|
|
||||||
|
fireEvent.change(queryByTestId('currency-select'), {
|
||||||
|
target: { value: 'eur' },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(mockSetCurrentCurrency).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('selects locale', async () => {
|
||||||
|
const { queryByTestId } = renderWithProvider(<SettingsTab />, mockStore);
|
||||||
|
|
||||||
|
fireEvent.change(queryByTestId('locale-select'), {
|
||||||
|
target: { value: 'ja' },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(mockUpdateCurrentLocale).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('sets fiat primary currency', async () => {
|
||||||
|
const { queryByTestId } = renderWithProvider(<SettingsTab />, mockStore);
|
||||||
|
|
||||||
|
const fiatCurrencyToggle = queryByTestId('toggle-fiat-currency');
|
||||||
|
|
||||||
|
fireEvent.click(fiatCurrencyToggle);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
mockSetUseNativeCurrencyAsPrimaryCurrencyPreference,
|
||||||
|
).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('clicks jazzicon', () => {
|
||||||
|
const { queryByTestId } = renderWithProvider(<SettingsTab />, mockStore);
|
||||||
|
|
||||||
|
const jazziconToggle = queryByTestId('jazz_icon');
|
||||||
|
|
||||||
|
fireEvent.click(jazziconToggle);
|
||||||
|
|
||||||
|
expect(mockSetUseBlockie).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('clicks blockies icon', () => {
|
||||||
|
const { queryByTestId } = renderWithProvider(<SettingsTab />, mockStore);
|
||||||
|
|
||||||
|
const blockieToggle = queryByTestId('blockie_icon');
|
||||||
|
|
||||||
|
fireEvent.click(blockieToggle);
|
||||||
|
|
||||||
|
expect(mockSetUseBlockie).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('toggles hiding zero balance', () => {
|
||||||
|
const { getByRole } = renderWithProvider(<SettingsTab />, mockStore);
|
||||||
|
|
||||||
|
const hideZerBalanceTokens = getByRole('checkbox');
|
||||||
|
|
||||||
|
fireEvent.click(hideZerBalanceTokens);
|
||||||
|
|
||||||
|
expect(mockSetHideZeroBalanceTokens).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user