Skip to content

Commit aaded72

Browse files
committed
test: add wallet details e2e tests
1 parent d6d9482 commit aaded72

File tree

4 files changed

+239
-0
lines changed

4 files changed

+239
-0
lines changed

test/e2e/page-objects/pages/account-list-page.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,13 @@ class AccountListPage {
652652
await this.driver.waitForSelector(this.walletDetailsButton);
653653
}
654654

655+
// TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860
656+
// eslint-disable-next-line @typescript-eslint/naming-convention
657+
async clickWalletDetailsButton(): Promise<void> {
658+
console.log('Click wallet details button');
659+
await this.driver.clickElement(this.walletDetailsButton);
660+
}
661+
655662
// TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860
656663
// eslint-disable-next-line @typescript-eslint/naming-convention
657664
async check_accountNotDisplayedInAccountList(
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { Driver } from '../../webdriver/driver';
2+
3+
class WalletDetailsPage {
4+
private readonly driver: Driver;
5+
6+
private readonly walletDetailsPage = '.wallet-details-page';
7+
8+
private readonly addAccountButton = '.wallet-details-page__add-account-button';
9+
10+
private readonly accountTypeModal = '.multichain-account-menu-popover';
11+
12+
private readonly ethereumAccountOption = { text: 'Ethereum account', tag: 'button' };
13+
14+
private readonly solanaAccountOption = { text: 'Solana account', tag: 'button' };
15+
16+
private readonly accountItems = '[data-testid^="wallet-details-account-item-"]';
17+
18+
constructor(driver: Driver) {
19+
this.driver = driver;
20+
}
21+
22+
async check_pageIsLoaded(): Promise<void> {
23+
console.log('Check wallet details page is loaded');
24+
await this.driver.waitForSelector(this.walletDetailsPage);
25+
}
26+
27+
async check_walletNameIsDisplayed(walletName: string): Promise<void> {
28+
console.log(`Check wallet name "${walletName}" is displayed`);
29+
await this.driver.waitForSelector({
30+
text: walletName,
31+
tag: 'p'
32+
});
33+
}
34+
35+
async check_balanceIsDisplayed(balance: string): Promise<void> {
36+
console.log(`Check balance "${balance}" is displayed`);
37+
await this.driver.waitForSelector({
38+
text: balance,
39+
tag: 'span'
40+
});
41+
}
42+
43+
async check_accountIsDisplayed(accountName: string): Promise<void> {
44+
console.log(`Check account "${accountName}" is displayed`);
45+
await this.driver.waitForSelector({
46+
text: accountName,
47+
tag: 'p'
48+
});
49+
}
50+
51+
async check_addAccountButtonIsDisplayed(): Promise<void> {
52+
console.log('Check add account button is displayed');
53+
await this.driver.waitForSelector(this.addAccountButton);
54+
}
55+
56+
async clickAddAccountButton(): Promise<void> {
57+
console.log('Click add account button');
58+
await this.driver.clickElement(this.addAccountButton);
59+
}
60+
61+
async check_accountTypeModalIsDisplayed(): Promise<void> {
62+
console.log('Check account type selection modal is displayed');
63+
await this.driver.waitForSelector(this.accountTypeModal);
64+
}
65+
66+
async check_ethereumAccountOptionIsDisplayed(): Promise<void> {
67+
console.log('Check Ethereum account option is displayed');
68+
await this.driver.waitForSelector(this.ethereumAccountOption);
69+
}
70+
71+
async check_solanaAccountOptionIsDisplayed(): Promise<void> {
72+
console.log('Check Solana account option is displayed');
73+
await this.driver.waitForSelector(this.solanaAccountOption);
74+
}
75+
76+
async clickEthereumAccountOption(): Promise<void> {
77+
console.log('Click Ethereum account option');
78+
await this.driver.clickElement(this.ethereumAccountOption);
79+
}
80+
81+
async check_numberOfAccountsDisplayed(expectedCount: number): Promise<void> {
82+
console.log(`Check ${expectedCount} accounts are displayed`);
83+
const accountItemElements = await this.driver.findElements(this.accountItems);
84+
if (accountItemElements.length !== expectedCount) {
85+
throw new Error(`Expected ${expectedCount} accounts, but found ${accountItemElements.length}`);
86+
}
87+
}
88+
}
89+
90+
export default WalletDetailsPage;
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import { Suite } from 'mocha';
2+
import { Mockttp } from 'mockttp';
3+
import AccountListPage from '../../page-objects/pages/account-list-page';
4+
import WalletDetailsPage from '../../page-objects/pages/wallet-details-page';
5+
import { Driver } from '../../webdriver/driver';
6+
import { withFixtures } from '../../helpers';
7+
import HeaderNavbar from '../../page-objects/pages/header-navbar';
8+
import HomePage from '../../page-objects/pages/home/homepage';
9+
import FixtureBuilder from '../../fixture-builder';
10+
import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow';
11+
import { ACCOUNT_TYPE } from '../../constants';
12+
import {
13+
mockMultichainAccountsFeatureFlag,
14+
} from './common';
15+
16+
describe('Multichain Accounts - Wallet Details', function (this: Suite) {
17+
it('should view wallet details with one Ethereum and one Solana account and show SRP backup reminder', async function () {
18+
await withFixtures(
19+
{
20+
fixtures: new FixtureBuilder()
21+
.withKeyringControllerMultiSRP()
22+
.withEnabledNetworks({
23+
eip155: {
24+
'0x539': true,
25+
},
26+
solana: {
27+
'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': true,
28+
},
29+
})
30+
.withPreferencesController({
31+
dismissSeedBackUpReminder: false,
32+
})
33+
.build(),
34+
title: this.test?.fullTitle(),
35+
testSpecificMock: async (mockServer: Mockttp) => {
36+
return mockMultichainAccountsFeatureFlag(mockServer);
37+
},
38+
manifestFlags: {
39+
remoteFeatureFlags: {
40+
addSolanaAccount: true,
41+
},
42+
},
43+
dapp: true,
44+
},
45+
async ({ driver }: { driver: Driver }) => {
46+
await loginWithBalanceValidation(driver);
47+
const homePage = new HomePage(driver);
48+
await homePage.check_pageIsLoaded();
49+
const headerNavbar = new HeaderNavbar(driver);
50+
await headerNavbar.openAccountMenu();
51+
52+
const accountListPage = new AccountListPage(driver);
53+
await accountListPage.check_pageIsLoaded();
54+
55+
// Create a Solana account to match test scenario requirements
56+
await accountListPage.addAccount({
57+
accountType: ACCOUNT_TYPE.Solana,
58+
accountName: 'Solana Account 1',
59+
});
60+
await homePage.check_pageIsLoaded();
61+
await headerNavbar.openAccountMenu();
62+
await accountListPage.check_pageIsLoaded();
63+
64+
await accountListPage.check_walletDetailsButtonIsDisplayed();
65+
await accountListPage.clickWalletDetailsButton();
66+
67+
const walletDetailsPage = new WalletDetailsPage(driver);
68+
await walletDetailsPage.check_pageIsLoaded();
69+
70+
await walletDetailsPage.check_walletNameIsDisplayed('Wallet 1');
71+
await walletDetailsPage.check_balanceIsDisplayed('$42,500.00');
72+
await walletDetailsPage.check_accountIsDisplayed('Account 1');
73+
await walletDetailsPage.check_accountIsDisplayed('Solana Account 1');
74+
},
75+
);
76+
});
77+
78+
it('should add new Ethereum account from wallet details', async function () {
79+
await withFixtures(
80+
{
81+
fixtures: new FixtureBuilder()
82+
.withKeyringControllerMultiSRP()
83+
.withEnabledNetworks({
84+
eip155: {
85+
'0x539': true,
86+
},
87+
solana: {
88+
'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': true,
89+
},
90+
})
91+
.build(),
92+
title: this.test?.fullTitle(),
93+
testSpecificMock: async (mockServer: Mockttp) => {
94+
return mockMultichainAccountsFeatureFlag(mockServer);
95+
},
96+
manifestFlags: {
97+
remoteFeatureFlags: {
98+
addSolanaAccount: true,
99+
},
100+
},
101+
dapp: true,
102+
},
103+
async ({ driver }: { driver: Driver }) => {
104+
await loginWithBalanceValidation(driver);
105+
const homePage = new HomePage(driver);
106+
await homePage.check_pageIsLoaded();
107+
const headerNavbar = new HeaderNavbar(driver);
108+
await headerNavbar.openAccountMenu();
109+
110+
const accountListPage = new AccountListPage(driver);
111+
await accountListPage.check_pageIsLoaded();
112+
113+
// Create a Solana account to match test scenario requirements
114+
await accountListPage.addAccount({
115+
accountType: ACCOUNT_TYPE.Solana,
116+
accountName: 'Solana Account 1',
117+
});
118+
await homePage.check_pageIsLoaded();
119+
await headerNavbar.openAccountMenu();
120+
await accountListPage.check_pageIsLoaded();
121+
122+
await accountListPage.check_walletDetailsButtonIsDisplayed();
123+
await accountListPage.clickWalletDetailsButton();
124+
125+
const walletDetailsPage = new WalletDetailsPage(driver);
126+
await walletDetailsPage.check_pageIsLoaded();
127+
128+
await walletDetailsPage.check_addAccountButtonIsDisplayed();
129+
await walletDetailsPage.clickAddAccountButton();
130+
131+
await walletDetailsPage.check_accountTypeModalIsDisplayed();
132+
await walletDetailsPage.check_ethereumAccountOptionIsDisplayed();
133+
await walletDetailsPage.check_solanaAccountOptionIsDisplayed();
134+
135+
await walletDetailsPage.clickEthereumAccountOption();
136+
137+
await walletDetailsPage.check_numberOfAccountsDisplayed(3);
138+
},
139+
);
140+
});
141+
});

ui/components/multichain/multichain-accounts/wallet-details-account-item/wallet-details-account-item.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const WalletDetailsAccountItem = ({
5757
padding={4}
5858
marginBottom={1}
5959
style={{ cursor: 'pointer', border: 'none' }}
60+
data-testid={`wallet-details-account-item-${account.id}`}
6061
{...rowStylesProps}
6162
>
6263
<Box display={Display.Flex} alignItems={AlignItems.center} gap={3}>

0 commit comments

Comments
 (0)