1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-28 23:06:37 +01:00
metamask-extension/test/e2e/tests/chain-interactions.spec.js
Mark Stacey 96c00df6f0
Reduce e2e test flakiness (#19507)
Three e2e tests have been updated to fix a possible race condition
causing intermittent e2e test failures.

In each of the updated tests, the test checks the current network.
The check is performed as a two-step process: locate the current
network element, then check the text to ensure it's correct.

This fails when the test driver finds the element before it re-renders.
If the test runs too quickly, it compares the text before the switch
is shown on screen, and the test fails.

Instead the tests use the element locator to describe what they want.
This tells the test driver to keep looking until the conditions are
met, ensuring the test doesn't fail unless the network switch takes
longer than the default timeout (which should not happen).

This is a good example of why we should avoid using assertions on
elements in e2e tests. Express your assertions as locators instead to
make the test more resilient in the case where the test runs before the
next render.
2023-06-08 14:34:48 -02:30

114 lines
3.8 KiB
JavaScript

const { strict: assert } = require('assert');
const { convertToHexValue, withFixtures, openDapp } = require('../helpers');
const FixtureBuilder = require('../fixture-builder');
describe('Chain Interactions', function () {
const port = 8546;
const chainId = 1338;
const ganacheOptions = {
accounts: [
{
secretKey:
'0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC',
balance: convertToHexValue(25000000000000000000),
},
],
concurrent: { port, chainId },
};
it('should add the Ganache test chain and not switch the network', async function () {
await withFixtures(
{
dapp: true,
fixtures: new FixtureBuilder().build(),
ganacheOptions,
title: this.test.title,
},
async ({ driver }) => {
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
// trigger add chain confirmation
await openDapp(driver);
await driver.clickElement('#addEthereumChain');
await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles();
const extension = windowHandles[0];
await driver.switchToWindowWithTitle(
'MetaMask Notification',
windowHandles,
);
// verify chain details
const [networkName, networkUrl, chainIdElement] =
await driver.findElements('.definition-list dd');
assert.equal(await networkName.getText(), `Localhost ${port}`);
assert.equal(await networkUrl.getText(), `http://127.0.0.1:${port}`);
assert.equal(await chainIdElement.getText(), chainId.toString());
// approve add chain, cancel switch chain
await driver.clickElement({ text: 'Approve', tag: 'button' });
await driver.clickElement({ text: 'Cancel', tag: 'button' });
// switch to extension
await driver.waitUntilXWindowHandles(2);
await driver.switchToWindow(extension);
// verify networks
await driver.findElement({
css: '[data-testid="network-display"]',
text: 'Localhost 8545',
});
await driver.clickElement('[data-testid="network-display"]');
const ganacheChain = await driver.findElements({
text: `Localhost ${port}`,
tag: 'span',
});
assert.ok(ganacheChain.length, 1);
},
);
});
it('should add the Ganache chain and switch the network', async function () {
await withFixtures(
{
dapp: true,
fixtures: new FixtureBuilder().build(),
ganacheOptions,
title: this.test.title,
},
async ({ driver }) => {
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
// trigger add chain confirmation
await openDapp(driver);
await driver.clickElement('#addEthereumChain');
await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles();
const extension = windowHandles[0];
await driver.switchToWindowWithTitle(
'MetaMask Notification',
windowHandles,
);
// approve and switch chain
await driver.clickElement({ text: 'Approve', tag: 'button' });
await driver.clickElement({ text: 'Switch network', tag: 'button' });
// switch to extension
await driver.waitUntilXWindowHandles(2);
await driver.switchToWindow(extension);
// verify current network
await driver.findElement({
css: '[data-testid="network-display"]',
text: `Localhost ${port}`,
});
},
);
});
});