mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 01:47:00 +01:00
parent
72cc669ef6
commit
840eb632c6
61
test/e2e/tests/import-tokens.spec.js
Normal file
61
test/e2e/tests/import-tokens.spec.js
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
const { strict: assert } = require('assert');
|
||||||
|
const {
|
||||||
|
withFixtures,
|
||||||
|
convertToHexValue,
|
||||||
|
regularDelayMs,
|
||||||
|
unlockWallet,
|
||||||
|
} = require('../helpers');
|
||||||
|
const FixtureBuilder = require('../fixture-builder');
|
||||||
|
|
||||||
|
describe('Import flow', function () {
|
||||||
|
const ganacheOptions = {
|
||||||
|
accounts: [
|
||||||
|
{
|
||||||
|
secretKey:
|
||||||
|
'0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC',
|
||||||
|
balance: convertToHexValue(25000000000000000000),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
it('allows importing multiple tokens from search', async function () {
|
||||||
|
await withFixtures(
|
||||||
|
{
|
||||||
|
fixtures: new FixtureBuilder().build(),
|
||||||
|
ganacheOptions,
|
||||||
|
title: this.test.title,
|
||||||
|
},
|
||||||
|
async ({ driver }) => {
|
||||||
|
await driver.navigate();
|
||||||
|
await unlockWallet(driver);
|
||||||
|
|
||||||
|
// Token list is only on mainnet
|
||||||
|
await driver.clickElement('[data-testid="network-display"]');
|
||||||
|
await driver.clickElement({ text: 'Ethereum Mainnet', tag: 'button' });
|
||||||
|
|
||||||
|
// Wait for network to change and token list to load from state
|
||||||
|
await driver.delay(regularDelayMs);
|
||||||
|
|
||||||
|
await driver.clickElement('[data-testid="import-token-button"]');
|
||||||
|
await driver.fill('input[placeholder="Search tokens"]', 'cha');
|
||||||
|
|
||||||
|
await driver.clickElement('.token-list__token');
|
||||||
|
await driver.clickElement('.token-list__token:nth-of-type(2)');
|
||||||
|
await driver.clickElement('.token-list__token:nth-of-type(3)');
|
||||||
|
|
||||||
|
await driver.clickElement({ css: 'button', text: 'Next' });
|
||||||
|
await driver.clickElement({ css: 'button', text: 'Import' });
|
||||||
|
|
||||||
|
await driver.clickElement('.asset-breadcrumb');
|
||||||
|
|
||||||
|
// Wait for "loading tokens" to be gone
|
||||||
|
await driver.waitForElementNotPresent(
|
||||||
|
'[data-testid="token-list-loading-message"]',
|
||||||
|
);
|
||||||
|
|
||||||
|
const items = await driver.findElements('.multichain-token-list-item');
|
||||||
|
assert.equal(items.length, 4);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@ -36,6 +36,7 @@ export default function TokenList({ onTokenClick }) {
|
|||||||
alignItems={AlignItems.center}
|
alignItems={AlignItems.center}
|
||||||
justifyContent={JustifyContent.center}
|
justifyContent={JustifyContent.center}
|
||||||
padding={7}
|
padding={7}
|
||||||
|
data-testid="token-list-loading-message"
|
||||||
>
|
>
|
||||||
{t('loadingTokens')}
|
{t('loadingTokens')}
|
||||||
</Box>
|
</Box>
|
||||||
|
@ -12,7 +12,7 @@ import { I18nContext } from '../../contexts/i18n';
|
|||||||
import { MetaMetricsContext } from '../../contexts/metametrics';
|
import { MetaMetricsContext } from '../../contexts/metametrics';
|
||||||
import { getMostRecentOverviewPage } from '../../ducks/history/history';
|
import { getMostRecentOverviewPage } from '../../ducks/history/history';
|
||||||
import { getPendingTokens } from '../../ducks/metamask/metamask';
|
import { getPendingTokens } from '../../ducks/metamask/metamask';
|
||||||
import { addTokens, clearPendingTokens } from '../../store/actions';
|
import { addImportedTokens, clearPendingTokens } from '../../store/actions';
|
||||||
import {
|
import {
|
||||||
MetaMetricsEventCategory,
|
MetaMetricsEventCategory,
|
||||||
MetaMetricsEventName,
|
MetaMetricsEventName,
|
||||||
@ -37,9 +37,9 @@ const ConfirmImportToken = () => {
|
|||||||
const pendingTokens = useSelector(getPendingTokens);
|
const pendingTokens = useSelector(getPendingTokens);
|
||||||
|
|
||||||
const handleAddTokens = useCallback(async () => {
|
const handleAddTokens = useCallback(async () => {
|
||||||
await dispatch(addTokens(pendingTokens));
|
|
||||||
|
|
||||||
const addedTokenValues = Object.values(pendingTokens);
|
const addedTokenValues = Object.values(pendingTokens);
|
||||||
|
await dispatch(addImportedTokens(addedTokenValues));
|
||||||
|
|
||||||
const firstTokenAddress = addedTokenValues?.[0].address?.toLowerCase();
|
const firstTokenAddress = addedTokenValues?.[0].address?.toLowerCase();
|
||||||
|
|
||||||
addedTokenValues.forEach((pendingToken) => {
|
addedTokenValues.forEach((pendingToken) => {
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
ASSET_ROUTE,
|
ASSET_ROUTE,
|
||||||
IMPORT_TOKEN_ROUTE,
|
IMPORT_TOKEN_ROUTE,
|
||||||
} from '../../helpers/constants/routes';
|
} from '../../helpers/constants/routes';
|
||||||
import { addTokens, clearPendingTokens } from '../../store/actions';
|
import { addImportedTokens, clearPendingTokens } from '../../store/actions';
|
||||||
import configureStore from '../../store/store';
|
import configureStore from '../../store/store';
|
||||||
import { renderWithProvider } from '../../../test/jest';
|
import { renderWithProvider } from '../../../test/jest';
|
||||||
import ConfirmImportToken from '.';
|
import ConfirmImportToken from '.';
|
||||||
@ -26,7 +26,7 @@ const MOCK_PENDING_TOKENS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
jest.mock('../../store/actions', () => ({
|
jest.mock('../../store/actions', () => ({
|
||||||
addTokens: jest.fn().mockReturnValue({ type: 'test' }),
|
addImportedTokens: jest.fn().mockReturnValue({ type: 'test' }),
|
||||||
clearPendingTokens: jest
|
clearPendingTokens: jest
|
||||||
.fn()
|
.fn()
|
||||||
.mockReturnValue({ type: 'CLEAR_PENDING_TOKENS' }),
|
.mockReturnValue({ type: 'CLEAR_PENDING_TOKENS' }),
|
||||||
@ -118,7 +118,7 @@ describe('ConfirmImportToken Component', () => {
|
|||||||
|
|
||||||
await fireEvent.click(importTokensBtn);
|
await fireEvent.click(importTokensBtn);
|
||||||
|
|
||||||
expect(addTokens).toHaveBeenCalled();
|
expect(addImportedTokens).toHaveBeenCalled();
|
||||||
expect(clearPendingTokens).toHaveBeenCalled();
|
expect(clearPendingTokens).toHaveBeenCalled();
|
||||||
expect(mockHistoryPush).toHaveBeenCalledTimes(1);
|
expect(mockHistoryPush).toHaveBeenCalledTimes(1);
|
||||||
expect(mockHistoryPush).toHaveBeenCalledWith(
|
expect(mockHistoryPush).toHaveBeenCalledWith(
|
||||||
|
@ -2043,25 +2043,6 @@ export async function getTokenStandardAndDetails(
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addTokens(
|
|
||||||
tokens: Token[] | { [address: string]: Token },
|
|
||||||
): ThunkAction<void, MetaMaskReduxState, unknown, AnyAction> {
|
|
||||||
return (dispatch: MetaMaskReduxDispatch) => {
|
|
||||||
if (Array.isArray(tokens)) {
|
|
||||||
return Promise.all(
|
|
||||||
tokens.map(({ address, symbol, decimals }) =>
|
|
||||||
dispatch(addToken(address, symbol, decimals)),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return Promise.all(
|
|
||||||
Object.entries(tokens).map(([_, { address, symbol, decimals }]) =>
|
|
||||||
dispatch(addToken(address, symbol, decimals)),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function clearPendingTokens(): Action {
|
export function clearPendingTokens(): Action {
|
||||||
return {
|
return {
|
||||||
type: actionConstants.CLEAR_PENDING_TOKENS,
|
type: actionConstants.CLEAR_PENDING_TOKENS,
|
||||||
|
Loading…
Reference in New Issue
Block a user