1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-22 18:00:18 +01:00
metamask-extension/test/e2e/nft/erc721-interaction.spec.js
Mark Stacey 7f6bdf0178
Fix e2e test for NFT interactions (#18540)
The test `should transfer a single ERC721 NFT from one account to another`
has been failing intermittently. It seems to be failing due to a race
condition; the first render shows "Send Token" but later renders show
"Send TDC". The test only passes if it runs fast enough to read the
first render of the list item component.

The test has been updated to look for the text "Send TDC", which is
what the component shows from the second render onward.
2023-04-12 09:21:33 -02:30

287 lines
11 KiB
JavaScript

const { strict: assert } = require('assert');
const { convertToHexValue, withFixtures } = require('../helpers');
const { SMART_CONTRACTS } = require('../seeder/smart-contracts');
const FixtureBuilder = require('../fixture-builder');
describe('ERC721 NFTs testdapp interaction', function () {
const smartContract = SMART_CONTRACTS.NFTS;
const ganacheOptions = {
accounts: [
{
secretKey:
'0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC',
balance: convertToHexValue(25000000000000000000),
},
],
};
it('should transfer a single ERC721 NFT from one account to another', async function () {
await withFixtures(
{
dapp: true,
fixtures: new FixtureBuilder()
.withPermissionControllerConnectedToTestDapp()
.build(),
ganacheOptions,
smartContract,
title: this.test.title,
failOnConsoleError: false,
},
async ({ driver, _, contractRegistry }) => {
const contract = contractRegistry.getContractAddress(smartContract);
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
// Open Dapp and wait for deployed contract
await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`);
await driver.findClickableElement('#deployButton');
// Click Transer
await driver.fill('#transferTokenInput', '1');
await driver.clickElement('#transferFromButton');
await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles();
const [extension] = windowHandles;
await driver.switchToWindowWithTitle(
'MetaMask Notification',
windowHandles,
);
// Confirm transfer
await driver.waitForSelector({
css: '.confirm-page-container-summary__title',
text: 'TestDappCollectibles',
});
await driver.clickElement({ text: 'Confirm', tag: 'button' });
await driver.waitUntilXWindowHandles(2);
await driver.switchToWindow(extension);
await driver.clickElement('[data-testid="home__activity-tab"]');
await driver.waitForSelector(
'.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)',
);
// Verify transaction
await driver.findElement({ text: 'Send TDC' });
},
);
});
it('should approve an address to transfer a single ERC721 NFT', async function () {
await withFixtures(
{
dapp: true,
fixtures: new FixtureBuilder()
.withPermissionControllerConnectedToTestDapp()
.build(),
ganacheOptions,
smartContract,
title: this.test.title,
failOnConsoleError: false,
},
async ({ driver, _, contractRegistry }) => {
const contract = contractRegistry.getContractAddress(smartContract);
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
// Open Dapp and wait for deployed contract
await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`);
await driver.findClickableElement('#deployButton');
// Click Approve
const approveInput = await driver.findElement('#approveTokenInput');
await approveInput.clear();
await approveInput.sendKeys('1');
await driver.clickElement('#approveButton');
await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles();
const [extension] = windowHandles;
await driver.switchToWindowWithTitle(
'MetaMask Notification',
windowHandles,
);
// Verify dialog
const title = await driver.findElement(
'[data-testid="confirm-approve-title"]',
);
await driver.clickElement({
text: 'View full transaction details',
css: '.confirm-approve-content__small-blue-text',
});
const [func] = await driver.findElements(
'.confirm-approve-content__data .confirm-approve-content__small-text',
);
assert.equal(
await title.getText(),
'Allow access to and transfer of your TestDappCollectibles (#1)?',
);
assert.equal(await func.getText(), 'Function: Approve');
// Confirm approval
await driver.clickElement({ text: 'Confirm', tag: 'button' });
await driver.waitUntilXWindowHandles(2);
await driver.switchToWindow(extension);
await driver.clickElement('[data-testid="home__activity-tab"]');
await driver.waitForSelector(
'.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)',
);
// Verify transaction
const completedTx = await driver.waitForSelector({
css: '.list-item__title',
text: 'Approve TDC spending cap',
});
assert.equal(await completedTx.isDisplayed(), true);
},
);
});
it('should enable approval for a third party address to manage all ERC721 NFTs', async function () {
await withFixtures(
{
dapp: true,
fixtures: new FixtureBuilder()
.withPermissionControllerConnectedToTestDapp()
.build(),
ganacheOptions,
smartContract,
title: this.test.title,
failOnConsoleError: false,
},
async ({ driver, _, contractRegistry }) => {
const contract = contractRegistry.getContractAddress(smartContract);
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
// Open Dapp and wait for deployed contract
await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`);
await driver.findClickableElement('#deployButton');
// Enable Set approval for all
await driver.clickElement('#setApprovalForAllButton');
await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles();
const [extension] = windowHandles;
await driver.switchToWindowWithTitle(
'MetaMask Notification',
windowHandles,
);
// Verify dialog
const title = await driver.findElement(
'[data-testid="confirm-approve-title"]',
);
await driver.clickElement({
text: 'View full transaction details',
css: '.confirm-approve-content__small-blue-text',
});
const [func, params] = await driver.findElements(
'.confirm-approve-content__data .confirm-approve-content__small-text',
);
assert.equal(
await title.getText(),
'Allow access to and transfer of all your TestDappCollectibles?',
);
assert.equal(await func.getText(), 'Function: SetApprovalForAll');
assert.equal(await params.getText(), 'Parameters: true');
// Confirm enabling set approval for all
await driver.clickElement({ text: 'Confirm', tag: 'button' });
await driver.clickElement({ text: 'Approve', tag: 'button' });
await driver.waitUntilXWindowHandles(2);
await driver.switchToWindow(extension);
await driver.clickElement('[data-testid="home__activity-tab"]');
await driver.waitForSelector(
'.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)',
);
// Verify transaction
const completedTx = await driver.waitForSelector({
css: '.list-item__title',
text: 'Approve TDC with no spend limit',
});
assert.equal(await completedTx.isDisplayed(), true);
},
);
});
it('should disable approval for a third party address to manage all ERC721 NFTs', async function () {
await withFixtures(
{
dapp: true,
fixtures: new FixtureBuilder()
.withPermissionControllerConnectedToTestDapp()
.build(),
ganacheOptions,
smartContract,
title: this.test.title,
failOnConsoleError: false,
},
async ({ driver, _, contractRegistry }) => {
const contract = contractRegistry.getContractAddress(smartContract);
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
// Open Dapp and wait for deployed contract
await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`);
await driver.findClickableElement('#deployButton');
// Disable Set approval for all
await driver.clickElement('#revokeButton');
await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles();
const [extension] = windowHandles;
await driver.switchToWindowWithTitle(
'MetaMask Notification',
windowHandles,
);
// Verify dialog
const title = await driver.findElement(
'[data-testid="confirm-approve-title"]',
);
await driver.clickElement({
text: 'View full transaction details',
css: '.confirm-approve-content__small-blue-text',
});
const [func, params] = await driver.findElements(
'.confirm-approve-content__data .confirm-approve-content__small-text',
);
const proceedWithCautionIsDisplayed = await driver.isElementPresent(
'.dialog--error',
);
assert.equal(
await title.getText(),
'Revoke permission to access and transfer all of your TestDappCollectibles?',
);
assert.equal(await func.getText(), 'Function: SetApprovalForAll');
assert.equal(await params.getText(), 'Parameters: false');
assert.equal(proceedWithCautionIsDisplayed, false);
// Confirm disabling set approval for all
await driver.clickElement({ text: 'Confirm', tag: 'button' });
await driver.waitUntilXWindowHandles(2);
await driver.switchToWindow(extension);
await driver.clickElement('[data-testid="home__activity-tab"]');
await driver.waitForSelector(
'.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)',
);
// Verify transaction
const completedTx = await driver.waitForSelector({
css: '.list-item__title',
text: 'Approve TDC with no spend limit',
});
assert.equal(await completedTx.isDisplayed(), true);
},
);
});
});