1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-22 09:57:02 +01:00

Added e2e swap test and fixed mocked API (#17934)

* Added test for submitting second swap without waiting for first one to finish

* Added more test code

* Removed look around Review Swap button

* Added test verification for the transaction details

* Changed mocked API for token import

* Added assert error messages

* Fixed lint errors

* Removed empty lines and improved coding consistency

* Removed empty lines
This commit is contained in:
Davide Brocchetto 2023-03-07 16:51:15 +01:00 committed by GitHub
parent d9826e9385
commit 03732af6f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 191 additions and 65 deletions

View File

@ -332,10 +332,10 @@ async function setupMocking(server, testSpecificMock) {
}; };
}); });
// It disables loading of token icons, e.g. this URL: https://static.metaswap.codefi.network/api/v1/tokenIcons/1337/0x0000000000000000000000000000000000000000.png // It disables loading of token icons, e.g. this URL: https://static.metafi.codefi.network/api/v1/tokenIcons/1337/0x0000000000000000000000000000000000000000.png
await server await server
.forGet( .forGet(
/^https:\/\/static\.metaswap\.codefi\.network\/api\/v1\/tokenIcons\/1337\/.*\.png/u, /^https:\/\/static\.metafi\.codefi\.network\/api\/v1\/tokenIcons\/1337\/.*\.png/u,
) )
.thenCallback(() => { .thenCallback(() => {
return { return {

View File

@ -1,5 +1,6 @@
const { strict: assert } = require('assert');
const FixtureBuilder = require('../fixture-builder'); const FixtureBuilder = require('../fixture-builder');
const { veryLargeDelayMs } = require('../helpers'); const { regularDelayMs, veryLargeDelayMs } = require('../helpers');
const ganacheOptions = { const ganacheOptions = {
accounts: [ accounts: [
@ -16,32 +17,27 @@ const withFixturesOptions = {
ganacheOptions, ganacheOptions,
}; };
const loadSwaps = async (driver) => { const loadExtension = async (driver) => {
await driver.navigate(); await driver.navigate();
await driver.fill('#password', 'correct horse battery staple'); await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER); await driver.press('#password', driver.Key.ENTER);
await driver.clickElement(
'.wallet-overview__buttons .icon-button:nth-child(3)',
);
}; };
const buildQuote = async (driver, options) => { const buildQuote = async (driver, options) => {
await driver.clickElement(
'.wallet-overview__buttons .icon-button:nth-child(3)',
);
await driver.fill('input[placeholder*="0"]', options.amount); await driver.fill('input[placeholder*="0"]', options.amount);
await driver.delay(veryLargeDelayMs); // Need an extra delay after typing an amount. await driver.delay(veryLargeDelayMs); // Need an extra delay after typing an amount.
await driver.clickElement( await driver.waitForSelector(
'[class="dropdown-search-list__closed-primary-label dropdown-search-list__select-default"]', '[class="dropdown-input-pair dropdown-input-pair__to"]',
); );
await driver.wait(async () => {
const tokens = await driver.findElements('.searchable-item-list__item');
return tokens.length > 1;
});
await driver.clickElement('.searchable-item-list__labels');
await driver.clickElement('.dropdown-input-pair__to'); await driver.clickElement('.dropdown-input-pair__to');
await driver.clickElement('input[data-testid="search-list-items"]');
await driver.fill( await driver.fill(
'input[data-testid="search-list-items"]', 'input[data-testid="search-list-items"]',
options.swapTo || options.swapToContractAddress, options.swapTo || options.swapToContractAddress,
); );
await driver.delay(veryLargeDelayMs); // Need an extra delay after typing an amount.
if (options.swapTo) { if (options.swapTo) {
await driver.wait(async () => { await driver.wait(async () => {
const tokenNames = await driver.findElements( const tokenNames = await driver.findElements(
@ -63,8 +59,115 @@ const buildQuote = async (driver, options) => {
await driver.clickElement('.searchable-item-list__primary-label'); await driver.clickElement('.searchable-item-list__primary-label');
}; };
const reviewQuote = async (driver, options) => {
await driver.clickElement({ text: 'Review swap', tag: 'button' });
await driver.waitForSelector({ text: 'Swap', tag: 'button' });
await driver.waitForSelector({
css: '[class*="box--align-items-center"]',
text: 'Estimated gas fee',
});
const sourceValue = await driver.waitForSelector(
'.main-quote-summary__source-row-value',
);
assert.equal(
await sourceValue.getText(),
options.amount,
'Error: Quote has wrong amount',
);
const sourceSymbol = await driver.waitForSelector(
'.main-quote-summary__source-row-symbol',
);
assert.equal(
await sourceSymbol.getText(),
options.swapFrom,
'Error: SwapFrom has wrong symbol',
);
const swapToSymbol = await driver.waitForSelector(
'.main-quote-summary__destination-row',
);
assert.equal(
await swapToSymbol.getText(),
options.swapTo,
'Error: SwapTo has wrong symbol',
);
await driver.waitForSelector(
'[class="exchange-rate-display main-quote-summary__exchange-rate-display"]',
);
await driver.waitForSelector('[class="fee-card__info-tooltip-container"]');
await driver.waitForSelector({
css: '[class="countdown-timer__time"]',
text: '0:23',
});
};
const waitForTransactionToComplete = async (driver, tokenName) => {
const sucessfulTransactionMessage = await driver.waitForSelector(
{
css: '[class="awaiting-swap__header"]',
text: 'Transaction complete',
},
{ timeout: 30000 },
);
assert.equal(
await sucessfulTransactionMessage.getText(),
'Transaction complete',
'Incorrect transaction message',
);
const sucessfulTransactionToken = await driver.waitForSelector({
css: '[class="awaiting-swap__amount-and-symbol"]',
text: tokenName,
});
assert.equal(
await sucessfulTransactionToken.getText(),
tokenName,
'Incorrect token name',
);
await driver.clickElement({ text: 'Close', tag: 'button' });
await driver.waitForSelector('[data-testid="home__asset-tab"]');
};
const checkActivityTransaction = async (driver, options) => {
await driver.clickElement('[data-testid="home__activity-tab"]');
const itemsText = await driver.findElements('.list-item__title');
assert.equal(
await itemsText[options.index].getText(),
`Swap ${options.swapFrom} to ${options.swapTo}`,
'Title is incorrect',
);
const amountValues = await driver.findElements(
'.transaction-list-item__primary-currency',
);
assert.equal(
await amountValues[options.index].getText(),
`-${options.amount} ${options.swapFrom}`,
'Transaction amount is incorrect',
);
await itemsText[options.index].click();
await driver.delay(regularDelayMs);
const txStatus = await driver.findElement(
'.transaction-list-item-details__tx-status >div > div:last-child',
);
assert.equal(
await txStatus.getText(),
`Confirmed`,
`Transaction status is not 'Confirmed'`,
);
const txAmount = await driver.findElement(
'.transaction-breakdown__value--amount',
);
assert.equal(
await txAmount.getText(),
`-${options.amount} ${options.swapFrom}`,
'Transaction breakdown is incorrect',
);
await driver.clickElement('[data-testid="popover-close"]');
};
module.exports = { module.exports = {
withFixturesOptions, withFixturesOptions,
loadSwaps, loadExtension,
buildQuote, buildQuote,
reviewQuote,
waitForTransactionToComplete,
checkActivityTransaction,
}; };

View File

@ -1,64 +1,87 @@
const { strict: assert } = require('assert');
const { withFixtures } = require('../helpers'); const { withFixtures } = require('../helpers');
const { withFixturesOptions, loadSwaps, buildQuote } = require('./shared'); const {
withFixturesOptions,
loadExtension,
buildQuote,
reviewQuote,
waitForTransactionToComplete,
checkActivityTransaction,
} = require('./shared');
describe('Swap Eth for another Token', function () { describe('Swap Eth for another Token', function () {
it('Completes a Swap between Eth and Matic', async function () { it('Completes second Swaps while first swap is processing', async function () {
withFixturesOptions.ganacheOptions.blockTime = 10;
await withFixtures(
{
...withFixturesOptions,
failOnConsoleError: false,
title: this.test.title,
},
async ({ driver }) => {
await loadExtension(driver);
await buildQuote(driver, {
amount: 0.001,
swapTo: 'USDC',
});
await reviewQuote(driver, {
amount: '0.001',
swapFrom: 'TESTETH',
swapTo: 'USDC',
});
await driver.clickElement({ text: 'Swap', tag: 'button' });
await driver.clickElement({ text: 'View in activity', tag: 'button' });
await buildQuote(driver, {
amount: 0.003,
swapTo: 'DAI',
});
await reviewQuote(driver, {
amount: '0.003',
swapFrom: 'TESTETH',
swapTo: 'DAI',
});
await driver.clickElement({ text: 'Swap', tag: 'button' });
await waitForTransactionToComplete(driver, 'DAI');
await checkActivityTransaction(driver, {
index: 0,
amount: '0.003',
swapFrom: 'TESTETH',
swapTo: 'DAI',
});
await checkActivityTransaction(driver, {
index: 1,
amount: '0.001',
swapFrom: 'TESTETH',
swapTo: 'USDC',
});
},
);
});
it('Completes a Swap between Eth and Dai', async function () {
await withFixtures( await withFixtures(
{ {
...withFixturesOptions, ...withFixturesOptions,
title: this.test.title, title: this.test.title,
}, },
async ({ driver }) => { async ({ driver }) => {
await loadSwaps(driver); await loadExtension(driver);
await buildQuote(driver, { await buildQuote(driver, {
amount: 2, amount: 2,
swapTo: 'DAI', swapTo: 'DAI',
}); });
await driver.clickElement({ text: 'Review swap', tag: 'button' }); await reviewQuote(driver, {
await driver.waitForSelector('[class*="box--align-items-center"]'); amount: '2',
const estimatedEth = await driver.waitForSelector({ swapFrom: 'TESTETH',
css: '[class*="box--align-items-center"]', swapTo: 'DAI',
text: 'Estimated gas fee',
});
assert.equal(await estimatedEth.getText(), 'Estimated gas fee');
await driver.waitForSelector(
'[class="exchange-rate-display main-quote-summary__exchange-rate-display"]',
);
await driver.waitForSelector(
'[class="fee-card__info-tooltip-container"]',
);
await driver.waitForSelector({
css: '[class="countdown-timer__time"]',
text: '0:24',
}); });
await driver.clickElement({ text: 'Swap', tag: 'button' }); await driver.clickElement({ text: 'Swap', tag: 'button' });
const sucessfulTransactionMessage = await driver.waitForSelector({ await waitForTransactionToComplete(driver, 'DAI');
css: '[class="awaiting-swap__header"]', await checkActivityTransaction(driver, {
text: 'Transaction complete', index: 0,
amount: '2',
swapFrom: 'TESTETH',
swapTo: 'DAI',
}); });
assert.equal(
await sucessfulTransactionMessage.getText(),
'Transaction complete',
);
const sucessfulTransactionToken = await driver.waitForSelector({
css: '[class="awaiting-swap__amount-and-symbol"]',
text: 'DAI',
});
assert.equal(await sucessfulTransactionToken.getText(), 'DAI');
await driver.clickElement({ text: 'Close', tag: 'button' });
await driver.clickElement('[data-testid="home__activity-tab"]');
const swaptotal = await driver.waitForSelector({
css: '[class="transaction-list-item__primary-currency"]',
text: '-2 TESTETH',
});
assert.equal(await swaptotal.getText(), '-2 TESTETH');
const swaptotaltext = await driver.waitForSelector({
css: '[class="list-item__title"]',
text: 'Swap TESTETH to DAI',
});
assert.equal(await swaptotaltext.getText(), 'Swap TESTETH to DAI');
}, },
); );
}); });

View File

@ -2,7 +2,7 @@ const { strict: assert } = require('assert');
const { withFixtures } = require('../helpers'); const { withFixtures } = require('../helpers');
const { withFixturesOptions, loadSwaps, buildQuote } = require('./shared'); const { withFixturesOptions, loadExtension, buildQuote } = require('./shared');
describe('Swaps - notifications', function () { describe('Swaps - notifications', function () {
async function mockTradesApiPriceSlippageError(mockServer) { async function mockTradesApiPriceSlippageError(mockServer) {
@ -60,7 +60,7 @@ describe('Swaps - notifications', function () {
title: this.test.title, title: this.test.title,
}, },
async ({ driver }) => { async ({ driver }) => {
await loadSwaps(driver); await loadExtension(driver);
await buildQuote(driver, { await buildQuote(driver, {
amount: 2, amount: 2,
swapTo: 'INUINU', swapTo: 'INUINU',
@ -99,7 +99,7 @@ describe('Swaps - notifications', function () {
title: this.test.title, title: this.test.title,
}, },
async ({ driver }) => { async ({ driver }) => {
await loadSwaps(driver); await loadExtension(driver);
await buildQuote(driver, { await buildQuote(driver, {
amount: 50, amount: 50,
swapTo: 'USDC', swapTo: 'USDC',
@ -134,7 +134,7 @@ describe('Swaps - notifications', function () {
title: this.test.title, title: this.test.title,
}, },
async ({ driver }) => { async ({ driver }) => {
await loadSwaps(driver); await loadExtension(driver);
await buildQuote(driver, { await buildQuote(driver, {
amount: 2, amount: 2,
swapToContractAddress: '0x72c9Fb7ED19D3ce51cea5C56B3e023cd918baaDf', swapToContractAddress: '0x72c9Fb7ED19D3ce51cea5C56B3e023cd918baaDf',