Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 5 additions & 19 deletions test/e2e/flask/solana-wallet-standard/connect.spec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { strict as assert } from 'assert';
import { SOLANA_DEVNET_URL } from '../../tests/solana/common-solana';
import SnapSignMessageConfirmation from '../../page-objects/pages/confirmations/snap-sign-message-confirmation';
import { TestDappSolana } from '../../page-objects/pages/test-dapp-solana';
import { DAPP_PATH, WINDOW_TITLES } from '../../constants';
import { regularDelayMs, withFixtures } from '../../helpers';
import { withFixtures } from '../../helpers';
import FixtureBuilder from '../../fixtures/fixture-builder';
import FixtureBuilderV2 from '../../fixtures/fixture-builder-v2';
import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow';
Expand Down Expand Up @@ -89,14 +89,9 @@ describe('Solana Wallet Standard - e2e tests', function () {
const header = await testDapp.getHeader();
await header.connect();

// wait to display wallet connect modal
await driver.delay(regularDelayMs);

const modal = await testDapp.getWalletModal();
await modal.connectToMetaMaskWallet();

await driver.delay(regularDelayMs);

// Cancel the connection
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
const connectAccountConfirmation = new ConnectAccountConfirmation(
Expand Down Expand Up @@ -140,10 +135,8 @@ describe('Solana Wallet Standard - e2e tests', function () {
// Start connection
const header = await testDapp.getHeader();
await header.connect();
await driver.delay(regularDelayMs);
const modal = await testDapp.getWalletModal();
await modal.connectToMetaMaskWallet();
await driver.delay(regularDelayMs);

// Open the permissions modal
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
Expand Down Expand Up @@ -228,7 +221,6 @@ describe('Solana Wallet Standard - e2e tests', function () {
await testDapp.openTestDappPage();
await testDapp.checkPageIsLoaded();
await connectSolanaTestDapp(driver, testDapp);
await driver.delay(regularDelayMs);

// Check that we're connected to the last selected account
const header = await testDapp.getHeader();
Expand Down Expand Up @@ -395,16 +387,10 @@ describe('Solana Wallet Standard - e2e tests', function () {
await signMessageTest.setMessage('Hello, world!');
await signMessageTest.signMessage();

await driver.delay(regularDelayMs);

await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);

// Check that mainnet appears in the dialog
const el = await driver.waitForSelector({
text: 'Solana Mainnet',
tag: 'p',
});
assert.ok(el);
const signMsgConfirmation = new SnapSignMessageConfirmation(driver);
await signMsgConfirmation.checkPageIsLoaded();
await signMsgConfirmation.checkNetworkIsDisplayed('Solana Mainnet');
},
);
});
Expand Down
12 changes: 6 additions & 6 deletions test/e2e/flask/solana-wallet-standard/signMessage.spec.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import SnapSignMessageConfirmation from '../../page-objects/pages/confirmations/snap-sign-message-confirmation';
import { TestDappSolana } from '../../page-objects/pages/test-dapp-solana';
import { DAPP_PATH, WINDOW_TITLES } from '../../constants';
import { largeDelayMs, veryLargeDelayMs, withFixtures } from '../../helpers';
import FixtureBuilderV2 from '../../fixtures/fixture-builder-v2';
import { withFixtures } from '../../helpers';
import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow';
import FixtureBuilderV2 from '../../fixtures/fixture-builder-v2';
import {
account1,
assertSignedMessageIsValid,
clickConfirmButton,
connectSolanaTestDapp,
} from './testHelpers';

Expand Down Expand Up @@ -34,13 +34,13 @@ describe('Solana Wallet Standard - Sign Message', function () {

await signMessageTest.signMessage();

await driver.delay(veryLargeDelayMs);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
const signMsgConfirmation = new SnapSignMessageConfirmation(driver);
await signMsgConfirmation.checkPageIsLoaded();
await signMsgConfirmation.clickFooterConfirmButton();

await testDapp.switchTo();

await driver.delay(largeDelayMs);
const signedMessage = await signMessageTest.getSignedMessage();

assertSignedMessageIsValid({
Expand Down
35 changes: 0 additions & 35 deletions test/e2e/flask/solana-wallet-standard/testHelpers.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { strict as assert } from 'assert';
import { By } from 'selenium-webdriver';
import nacl from 'tweetnacl';
import { WINDOW_TITLES } from '../../constants';
import { largeDelayMs, regularDelayMs } from '../../helpers';
import { Driver } from '../../webdriver/driver';
import { TestDappSolana } from '../../page-objects/pages/test-dapp-solana';
import { SOLANA_DEVNET_URL } from '../../tests/solana/common-solana';
Expand Down Expand Up @@ -62,14 +60,9 @@ export const connectSolanaTestDapp = async (

await header.connect();

// wait to display wallet connect modal
await driver.delay(regularDelayMs);

const modal = await testDapp.getWalletModal();
await modal.connectToMetaMaskWallet();

// Get to extension modal, and click on the "Connect" button
await driver.delay(largeDelayMs);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);

if (options?.includeDevnet) {
Expand All @@ -85,34 +78,6 @@ export const connectSolanaTestDapp = async (
console.log('solana test dapp connected');
};

/**
* Waits for the Confirm button in the footer of a Solana-specific modal to be clickable then clicks it.
* Note: This function does not work for general purpose modals like connect/disconnect.
*
* @param driver
*/
export const clickConfirmButton = async (driver: Driver): Promise<void> => {
const footerButtons = await driver.findClickableElements(
By.css('button.snap-ui-renderer__footer-button'),
);
const confirmButton = footerButtons[1];
await confirmButton.click();
};

/**
* Clicks the Cancel button in the footer in a Solana-specific modal.
* Note: This function does not work for general purpose modals like connect/disconnect.
*
* @param driver
*/
export const clickCancelButton = async (driver: Driver): Promise<void> => {
const footerButtons = await driver.findClickableElements(
By.css('button.snap-ui-renderer__footer-button'),
);
const cancelButton = footerButtons[0];
await cancelButton.click();
};

/**
* Switches to the specified account in the account menu.
*
Expand Down
53 changes: 17 additions & 36 deletions test/e2e/flask/solana-wallet-standard/transaction_sol.spec.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import { strict as assert } from 'assert';
import { By } from 'selenium-webdriver';
import SnapTransactionConfirmation from '../../page-objects/pages/confirmations/snap-transaction-confirmation';
import { TestDappSolana } from '../../page-objects/pages/test-dapp-solana';
import FixtureBuilderV2 from '../../fixtures/fixture-builder-v2';
import { DAPP_PATH, WINDOW_TITLES } from '../../constants';
import { largeDelayMs, withFixtures } from '../../helpers';
import { withFixtures } from '../../helpers';
import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow';
import { buildSolanaTestSpecificMock } from '../../tests/solana/common-solana';
import {
clickCancelButton,
clickConfirmButton,
connectSolanaTestDapp,
} from './testHelpers';
import { connectSolanaTestDapp } from './testHelpers';

describe('Solana Wallet Standard - Transfer SOL', function () {
describe('Send a transaction', function () {
Expand Down Expand Up @@ -39,28 +35,23 @@ describe('Solana Wallet Standard - Transfer SOL', function () {
const sendSolTest = await testDapp.getSendSolTest();
await sendSolTest.signTransaction();

// Confirm the signature
await driver.delay(largeDelayMs);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
const signTxConfirmation = new SnapTransactionConfirmation(driver);
await signTxConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();
await testDapp.switchTo();

await driver.delay(largeDelayMs);
const signedTransaction = await sendSolTest.getSignedTransaction();
assert.strictEqual(signedTransaction.length, 1);
assert.ok(signedTransaction[0]);

// 2. Send the transaction
await sendSolTest.sendTransaction();

// Confirm the transaction
await driver.delay(largeDelayMs);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
const txConfirmation = new SnapTransactionConfirmation(driver);
await txConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();
await testDapp.switchTo();

// Assert that a transaction hash is received
await driver.delay(largeDelayMs);
const transactionHash = await sendSolTest.getTransactionHash();
assert.ok(transactionHash);
},
Expand Down Expand Up @@ -91,24 +82,22 @@ describe('Solana Wallet Standard - Transfer SOL', function () {
// 1. Start a transaction and cancel it
const sendSolTest = await testDapp.getSendSolTest();
await sendSolTest.sendTransaction();

// Cancel the sendTransaction
await driver.delay(largeDelayMs);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickCancelButton(driver);
const dialogHandle = await driver.getCurrentWindowHandle();
const cancelTxConfirmation = new SnapTransactionConfirmation(driver);
await cancelTxConfirmation.clickFooterCancelButtonAndWaitForWindowToClose();
await testDapp.switchTo();

// 2. Send another transaction
await sendSolTest.sendTransaction();

// Confirm the transaction
await driver.delay(largeDelayMs);
await driver.waitForWindowToClose(dialogHandle);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);

const txConfirmation = new SnapTransactionConfirmation(driver);
await txConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();
await testDapp.switchTo();

// Assert that a transaction hash is received
await driver.delay(largeDelayMs);
const transactionHash = await sendSolTest.getTransactionHash();
assert.ok(transactionHash);
},
Expand Down Expand Up @@ -141,18 +130,10 @@ describe('Solana Wallet Standard - Transfer SOL', function () {
const sendSolTest = await testDapp.getSendSolTest();
await sendSolTest.sendTransaction();

// Confirm the signature
await driver.delay(largeDelayMs);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);

// Look for the target chain to be set to Devnet
const permission = await driver.findElement(
By.xpath("//p[contains(text(), 'Solana Devnet')]"),
);
assert.ok(permission);

// Confirm connection
await driver.clickElement({ text: 'Confirm', tag: 'span' });
const txConfirmation = new SnapTransactionConfirmation(driver);
await txConfirmation.checkNetworkIsDisplayed('Solana Devnet');
await txConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();
},
);
});
Expand Down
35 changes: 17 additions & 18 deletions test/e2e/flask/solana-wallet-standard/transaction_wsol.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { strict as assert } from 'assert';
import SnapTransactionConfirmation from '../../page-objects/pages/confirmations/snap-transaction-confirmation';
import { TestDappSolana } from '../../page-objects/pages/test-dapp-solana';
import { DAPP_PATH, WINDOW_TITLES } from '../../constants';
import { largeDelayMs, withFixtures } from '../../helpers';
import { withFixtures } from '../../helpers';
import FixtureBuilderV2 from '../../fixtures/fixture-builder-v2';
import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow';
import { buildSolanaTestSpecificMock } from '../../tests/solana/common-solana';
import { clickConfirmButton, connectSolanaTestDapp } from './testHelpers';
import { connectSolanaTestDapp } from './testHelpers';

describe('Solana Wallet Standard - Transfer WSOL', function () {
describe('Send WSOL transactions', function () {
Expand Down Expand Up @@ -33,41 +34,39 @@ describe('Solana Wallet Standard - Transfer WSOL', function () {
});

// 1. Sign multiple transactions
console.log('1. Sign multiple transactions');
const sendWSolTest = await testDapp.getSendWSolTest();
await sendWSolTest.signTransaction();
// Confirm the first signature
await driver.delay(largeDelayMs);

await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
const signTxConfirmation = new SnapTransactionConfirmation(driver);
let dialogHandle = await driver.getCurrentWindowHandle();
await signTxConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();

// Confirm the second signature
await driver.delay(largeDelayMs);
await driver.waitForWindowToClose(dialogHandle);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
await signTxConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();
await testDapp.switchTo();

// Assert that the transactions were signed
await driver.delay(largeDelayMs);
const signedTransactions = await sendWSolTest.getSignedTransactions();
assert.strictEqual(signedTransactions.length, 2);
assert.ok(signedTransactions[0]);
assert.ok(signedTransactions[1]);

// 2. Send multiple transactions
console.log('2. Send multiple transactions');
await sendWSolTest.sendTransaction();
// Confirm the first transaction
await driver.delay(largeDelayMs);

await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
dialogHandle = await driver.getCurrentWindowHandle();
const txConfirmation = new SnapTransactionConfirmation(driver);
await txConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();

// Confirm the second transaction
await driver.delay(largeDelayMs);
await driver.waitForWindowToClose(dialogHandle);
await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
await clickConfirmButton(driver);
await txConfirmation.clickFooterConfirmButtonAndWaitForWindowToClose();
await testDapp.switchTo();

// Assert that transaction hashes were received
await driver.delay(largeDelayMs);
const transactionHashes = await sendWSolTest.getTransactionHashs();
assert.strictEqual(transactionHashes.length, 2);
assert.ok(transactionHashes[0]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ class SnapSignMessageConfirmation {
});
}

async checkNetworkIsDisplayed(networkName: string): Promise<void> {
console.log(
`Checking network ${networkName} is displayed on snap sign message confirmation page.`,
);
await this.driver.waitForSelector({
text: networkName,
tag: 'p',
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate checkNetworkIsDisplayed across two page objects

Low Severity

The checkNetworkIsDisplayed method is identically implemented in both SnapSignMessageConfirmation and SnapTransactionConfirmation. Both classes already share similar structure (checkAccountIsDisplayed, checkPageIsLoaded, footer button methods). Extracting shared behavior into a common base class would reduce duplication and make future maintenance easier.

Additional Locations (1)

Fix in Cursor Fix in Web

Triggered by project rule: BUGBOT Rules


async checkPageIsLoaded(): Promise<void> {
try {
await this.driver.waitForMultipleSelectors([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,16 @@ class SnapTransactionConfirmation {
console.log('Snap transaction confirmation page is loaded');
}

async checkNetworkIsDisplayed(networkName: string): Promise<void> {
console.log(
`Checking network ${networkName} is displayed on snap transaction confirmation page.`,
);
await this.driver.waitForSelector({
text: networkName,
tag: 'p',
});
}

async checkSecurityAlertsErrorIsDisplayed(): Promise<void> {
await this.driver.waitForSelector(this.securityAlertsError);
}
Expand All @@ -62,11 +72,22 @@ class SnapTransactionConfirmation {
}

async clickFooterConfirmButton() {
console.log('Clicking footer confirm button');
await this.driver.clickElementAndWaitToDisappear(this.confirmButton);
}

async clickFooterConfirmButtonAndWaitForWindowToClose() {
console.log(
'Clicking footer confirm button and waiting for window to close',
);
await this.driver.clickElementAndWaitForWindowToClose(this.confirmButton);
}

async clickFooterCancelButtonAndWaitForWindowToClose() {
console.log(
'Clicking footer cancel button and waiting for window to close',
);
await this.driver.clickElementAndWaitForWindowToClose(this.cancelButton);
}
}
export default SnapTransactionConfirmation;
Loading
Loading