From 04701d51da5ea759c292e62642ade2d944742dc6 Mon Sep 17 00:00:00 2001 From: emiride Date: Thu, 12 Dec 2024 14:51:36 +0100 Subject: [PATCH] test(cat-voices): adding NuFi and Yoroi --- .../cardano-wallet.junit-report.xml | 361 ++++++++++++++++++ .../wallet-automation/pages/homePage.ts | 3 +- .../wallet-automation/pages/modal.ts | 45 ++- .../wallet-automation/pages/walletListPage.ts | 22 +- .../wallet-automation/setup.ts | 3 +- .../wallet-automation/tests/wallets.spec.ts | 63 +-- .../utils/extensionDownloader.ts | 35 +- .../wallet-automation/utils/extensions.ts | 12 + .../wallet-automation/utils/walletConfigs.ts | 171 ++++++--- .../utils/wallets/nufiUtils.ts | 43 +++ .../utils/wallets/walletUtils.ts | 47 ++- .../utils/wallets/yoroiUtils.ts | 47 +++ 12 files changed, 723 insertions(+), 129 deletions(-) create mode 100644 catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/cardano-wallet.junit-report.xml create mode 100644 catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/nufiUtils.ts create mode 100644 catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/yoroiUtils.ts diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/cardano-wallet.junit-report.xml b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/cardano-wallet.junit-report.xml new file mode 100644 index 00000000000..9309a07e11e --- /dev/null +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/cardano-wallet.junit-report.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Call log: + - expect.toBeVisible with timeout 5000ms + - waiting for getByText('Tx hash:') + + + at ../pages/modal.ts:62 + + 60 | await this.page.waitForTimeout(2000); + 61 | await expect(this.modalHeader).toBeVisible(); + > 62 | await expect(this.modalBody).toBeVisible(); + | ^ + 63 | } + 64 | } + 65 | + + at Modal.assertModalIsVisible (/wallet-automation/pages/modal.ts:62:34) + at HomePage.assertModal (/wallet-automation/pages/homePage.ts:102:5) + at /wallet-automation/tests/wallets.spec.ts:60:7 + + attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── + test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium/test-failed-1.png + ──────────────────────────────────────────────────────────────────────────────────────────────── + + attachment #2: screenshot (image/png) ────────────────────────────────────────────────────────── + test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium/test-failed-2.png + ──────────────────────────────────────────────────────────────────────────────────────────────── + + attachment #3: trace (application/zip) ───────────────────────────────────────────────────────── + test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium/trace.zip + Usage: + + npx playwright show-trace test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium/trace.zip + + ──────────────────────────────────────────────────────────────────────────────────────────────── + + Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── + + Error: Timed out 5000ms waiting for expect(locator).toBeVisible() + + Locator: getByText('Tx hash:') + Expected: visible + Received: + Call log: + - expect.toBeVisible with timeout 5000ms + - waiting for getByText('Tx hash:') + + + at ../pages/modal.ts:62 + + 60 | await this.page.waitForTimeout(2000); + 61 | await expect(this.modalHeader).toBeVisible(); + > 62 | await expect(this.modalBody).toBeVisible(); + | ^ + 63 | } + 64 | } + 65 | + + at Modal.assertModalIsVisible (/wallet-automation/pages/modal.ts:62:34) + at HomePage.assertModal (/wallet-automation/pages/homePage.ts:102:5) + at /wallet-automation/tests/wallets.spec.ts:60:7 + + attachment #1: screenshot (image/png) ────────────────────────────────────────────────────────── + test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium-retry1/test-failed-1.png + ──────────────────────────────────────────────────────────────────────────────────────────────── + + attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── + test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium-retry1/trace.zip + Usage: + + npx playwright show-trace test-results/wallets-Testing-with-Yoroi-Sign-and-submit-tx-with-Yoroi-chromium-retry1/trace.zip + + ──────────────────────────────────────────────────────────────────────────────────────────────── +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/homePage.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/homePage.ts index 6c77f456e56..8ad84835d00 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/homePage.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/homePage.ts @@ -266,6 +266,7 @@ export class HomePage { } async getPublicDRepKey(): Promise { + await this.page.waitForTimeout(2000); const isVisible = await this.publicDRepKeyLabel.isVisible(); if (!isVisible) { throw new Error("Public DRep Key label is not visible"); @@ -341,7 +342,7 @@ export class HomePage { expect(actualWalletCipData.networkId).not.toBeNaN(); expect(actualWalletCipData.changeAddress).not.toBeNaN(); expect(actualWalletCipData.rewardAddresses.length).toBeGreaterThan(0); - expect(actualWalletCipData.unusedAddresses.length).toBeGreaterThan(0); + //expect(actualWalletCipData.unusedAddresses.length).toBeGreaterThan(0); expect(actualWalletCipData.usedAddresses.length).toBeGreaterThan(0); expect(actualWalletCipData.utxos.length).toBeGreaterThan(0); expect(actualWalletCipData.publicDRepKey).not.toBeNaN(); diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/modal.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/modal.ts index 09545502963..f31d447ebb6 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/modal.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/modal.ts @@ -1,12 +1,12 @@ import { expect, Locator, Page } from "@playwright/test"; export enum ModalName { - SignData = 'SignData', - SignAndSubmitTx = 'SignAndSubmitTx', - SignAndSubmitRBACTx = 'SignAndSubmitRBACTx', - SignDataUserDeclined = 'UserDeclined', - SignTxUserDeclined = 'SignTxUserDeclined', - SignRBACTxUserDeclined = 'SignRBACTxUserDeclined', + SignData = "SignData", + SignAndSubmitTx = "SignAndSubmitTx", + SignAndSubmitRBACTx = "SignAndSubmitRBACTx", + SignDataUserDeclined = "UserDeclined", + SignTxUserDeclined = "SignTxUserDeclined", + SignRBACTxUserDeclined = "SignRBACTxUserDeclined", } export interface ModalContent { @@ -16,28 +16,28 @@ export interface ModalContent { export const modalContents: { [key in ModalName]: ModalContent } = { [ModalName.SignData]: { - header: 'Sign data', - unchangingText: 'Signature:', + header: "Sign data", + unchangingText: "Signature:", }, [ModalName.SignAndSubmitTx]: { - header: 'Sign & submit tx', - unchangingText: 'Tx hash:', + header: "Sign & submit tx", + unchangingText: "Tx hash:", }, [ModalName.SignAndSubmitRBACTx]: { - header: 'Sign & submit RBAC tx', - unchangingText: 'Tx hash:', + header: "Sign & submit RBAC tx", + unchangingText: "Tx hash:", }, [ModalName.SignDataUserDeclined]: { - header: 'Sign data', - unchangingText: 'user declined sign data', + header: "Sign data", + unchangingText: "WalletApiException", }, [ModalName.SignTxUserDeclined]: { - header: 'Sign & submit tx', - unchangingText: 'user declined sign tx', + header: "Sign & submit tx", + unchangingText: "WalletApiException", }, [ModalName.SignRBACTxUserDeclined]: { - header: 'Sign & submit RBAC tx', - unchangingText: 'user declined sign tx', + header: "Sign & submit RBAC tx", + unchangingText: "WalletApiException", }, }; @@ -50,12 +50,15 @@ export class Modal { constructor(page: Page, modalName: ModalName) { this.page = page; this.content = modalContents[modalName]; - this.modalHeader = this.page.getByText(this.content.header, { exact: true }); - this.modalBody = this.page.getByText(this.content.unchangingText) + this.modalHeader = this.page.getByText(this.content.header, { + exact: true, + }); + this.modalBody = this.page.getByText(this.content.unchangingText); } async assertModalIsVisible() { + await this.page.waitForTimeout(2000); await expect(this.modalHeader).toBeVisible(); await expect(this.modalBody).toBeVisible(); } -} \ No newline at end of file +} diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/walletListPage.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/walletListPage.ts index cb3df5087e5..3f2d59c9967 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/walletListPage.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/pages/walletListPage.ts @@ -1,6 +1,5 @@ -import { Locator, Page } from '@playwright/test'; -import { BrowserExtensionName } from '../utils/extensions'; - +import { Page } from "@playwright/test"; +import { BrowserExtensionName } from "../utils/extensions"; export class WalletListPage { readonly page: Page; @@ -9,10 +8,15 @@ export class WalletListPage { this.page = page; } async clickEnableWallet(walletName: BrowserExtensionName): Promise { - const enableButton = (walletName: BrowserExtensionName) => this.page.locator( - `flt-semantics:has(flt-semantics-img[aria-label*="Name: ${walletName.toLowerCase()}"]) ` + - `flt-semantics[role="button"]:has-text("Enable wallet")` - ); - await enableButton(walletName).click(); + if (walletName === BrowserExtensionName.Nufi) { + const [walletPopup] = await Promise.all([ + this.page.context().waitForEvent("page"), + await this.page.locator('//*[text()="Enable wallet"]').first().click(), + ]); + await walletPopup.locator("button:has-text('Connect')").click(); + } else { + await this.page.locator('//*[text()="Enable wallet"]').first().click(); + } + await this.page.waitForTimeout(2000); } -} \ No newline at end of file +} diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/setup.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/setup.ts index 841cc05d0f8..4630d313d71 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/setup.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/setup.ts @@ -42,12 +42,11 @@ export const enableWallet = async ( browser: BrowserContext ) => { const page = browser.pages()[0]; - await page.reload(); await page.goto("/"); await page.waitForTimeout(4000); const [walletPopup] = await Promise.all([ browser.waitForEvent("page"), - page.locator('//*[text()="Enable wallet"]').click(), + page.locator('//*[text()="Enable wallet"]').first().click(), ]); await walletPopup.waitForTimeout(2000); await allowExtension(walletPopup, walletConfig.extension.Name); diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/tests/wallets.spec.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/tests/wallets.spec.ts index 66a3b998045..6a637a9f54b 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/tests/wallets.spec.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/tests/wallets.spec.ts @@ -13,6 +13,10 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name === "Typhon", "https://github.com/input-output-hk/catalyst-voices/issues/753" ); + test.skip( + walletConfig.extension.Name === "Yoroi", + "https://github.com/input-output-hk/catalyst-voices/issues/753" + ); test.skip( walletConfig.extension.Name === "Lace", "https://github.com/input-output-hk/catalyst-voices/issues/1190" @@ -40,11 +44,7 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name ); const homePage = new HomePage(page); - const [walletPopup] = await Promise.all([ - browser.waitForEvent("page"), - homePage.signDataButton.click(), - ]); - await signWalletPopup(walletPopup, walletConfig); + await signWalletPopup(browser, walletConfig, homePage.signDataButton); await homePage.assertModal(ModalName.SignData); }); @@ -56,11 +56,11 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name ); const homePage = new HomePage(page); - const [walletPopup] = await Promise.all([ - browser.waitForEvent("page"), - homePage.signAndSubmitTxButton.click(), - ]); - await signWalletPopup(walletPopup, walletConfig); + await signWalletPopup( + browser, + walletConfig, + homePage.signAndSubmitTxButton + ); await homePage.assertModal(ModalName.SignAndSubmitTx); }); @@ -74,11 +74,11 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name ); const homePage = new HomePage(page); - const [walletPopup] = await Promise.all([ - browser.waitForEvent("page"), - homePage.signAndSubmitRBACTxButton.click(), - ]); - await signWalletPopup(walletPopup, walletConfig); + await signWalletPopup( + browser, + walletConfig, + homePage.signAndSubmitRBACTxButton + ); await homePage.assertModal(ModalName.SignAndSubmitRBACTx); } ); @@ -94,13 +94,14 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name ); const homePage = new HomePage(page); - const [walletPopup] = await Promise.all([ - browser.waitForEvent("page"), - homePage.signDataButton.click(), - ]); const walletConfigClone = structuredClone(walletConfig); walletConfigClone.password = "BadPassword"; - await signWalletPopup(walletPopup, walletConfigClone, false); + await signWalletPopup( + browser, + walletConfigClone, + homePage.signDataButton, + false + ); await homePage.assertModal(ModalName.SignDataUserDeclined); } ); @@ -116,13 +117,14 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name ); const homePage = new HomePage(page); - const [walletPopup] = await Promise.all([ - browser.waitForEvent("page"), - homePage.signAndSubmitTxButton.click(), - ]); const walletConfigClone = structuredClone(walletConfig); walletConfigClone.password = "BadPassword"; - await signWalletPopup(walletPopup, walletConfigClone, false); + await signWalletPopup( + browser, + walletConfigClone, + homePage.signAndSubmitTxButton, + false + ); await homePage.assertModal(ModalName.SignTxUserDeclined); } ); @@ -138,13 +140,14 @@ walletConfigs.forEach((walletConfig) => { walletConfig.extension.Name ); const homePage = new HomePage(page); - const [walletPopup] = await Promise.all([ - browser.waitForEvent("page"), - homePage.signAndSubmitRBACTxButton.click(), - ]); const walletConfigClone = structuredClone(walletConfig); walletConfigClone.password = "BadPassword"; - await signWalletPopup(walletPopup, walletConfigClone, false); + await signWalletPopup( + browser, + walletConfigClone, + homePage.signAndSubmitRBACTxButton, + false + ); await homePage.assertModal(ModalName.SignRBACTxUserDeclined); } ); diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensionDownloader.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensionDownloader.ts index de09abeca3a..d448035c537 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensionDownloader.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensionDownloader.ts @@ -44,14 +44,43 @@ export class ExtensionDownloader { } // Download the extension - const crxPath = await this.downloadExtension(extensionName); - + if (extensionName === BrowserExtensionName.Nufi) { + const zipPath = await this.downloadNufiExtension(); + await this.extractExtension(zipPath, extensionPath); + } else { + const crxPath = await this.downloadExtension(extensionName); + await this.extractExtension(crxPath, extensionPath); + } // Extract the extension - await this.extractExtension(crxPath, extensionPath); return extensionPath; } + private async downloadNufiExtension(): Promise { + const url = + "https://assets.nu.fi/extension/testnet/nufi-cwe-testnet-latest.zip"; + const filePath = path.join( + this.extensionsDir, + "nufi-cwe-testnet-latest.zip" + ); + + // Ensure the download directory exists + await fsPromises.mkdir(this.extensionsDir, { recursive: true }); + + // Fetch the extension + const res = await nodeFetch(url); + if (!res.ok) { + throw new Error(`Failed to download extension: ${res.statusText}`); + } + + // Stream the response directly to a file + const fileStream = fs.createWriteStream(filePath); + await pipeline(res.body, fileStream); + + console.log(`Extension has been downloaded to: ${filePath}`); + return filePath; + } + private async extractExtension( extensionPath: string, extractPath: string diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensions.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensions.ts index 78bee1df967..7c9b6a35337 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensions.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/extensions.ts @@ -8,6 +8,8 @@ export enum BrowserExtensionName { Lace = "Lace", Typhon = "Typhon", Eternl = "Eternl", + Yoroi = "Yoroi", + Nufi = "Nufi", } /* cspell: disable */ export const browserExtensions: BrowserExtension[] = [ @@ -26,6 +28,16 @@ export const browserExtensions: BrowserExtension[] = [ Id: "kmhcihpebfmpgmihbkipmjlmmioameka", HomeUrl: "index.html#/app/preprod/welcome", }, + { + Name: BrowserExtensionName.Yoroi, + Id: "poonlenmfdfbjfeeballhiibknlknepo", + HomeUrl: "main_window.html#", + }, + { + Name: BrowserExtensionName.Nufi, + Id: "hbklpdnlgiadjhdadfnfmemmklbopbcm", + HomeUrl: "/index.html#", + }, ]; /* cspell: enable */ diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/walletConfigs.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/walletConfigs.ts index ee099a04de1..ce1e11a8f04 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/walletConfigs.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/walletConfigs.ts @@ -3,86 +3,135 @@ import { WalletConfig } from "./wallets/walletUtils"; export const walletConfigs: WalletConfig[] = [ { - id: '1', + id: "1", extension: getBrowserExtension(BrowserExtensionName.Lace), seed: [ - 'stomach', - 'horn', - 'rail', - 'afraid', - 'flip', - 'also', - 'abandon', - 'speed', - 'chaos', - 'daring', - 'soon', - 'soft', - 'okay', - 'online', - 'benefit', + "stomach", + "horn", + "rail", + "afraid", + "flip", + "also", + "abandon", + "speed", + "chaos", + "daring", + "soon", + "soft", + "okay", + "online", + "benefit", ], - username: 'test123', - password: 'test12345678@', - cipBridge: ['cip-95'] + username: "test123", + password: "test12345678@", + cipBridge: ["cip-95"], }, { - id: '2', + id: "2", extension: getBrowserExtension(BrowserExtensionName.Typhon), seed: [ - 'stomach', - 'horn', - 'rail', - 'afraid', - 'flip', - 'also', - 'abandon', - 'speed', - 'chaos', - 'daring', - 'soon', - 'soft', - 'okay', - 'online', - 'benefit', + "stomach", + "horn", + "rail", + "afraid", + "flip", + "also", + "abandon", + "speed", + "chaos", + "daring", + "soon", + "soft", + "okay", + "online", + "benefit", ], - username: 'test123', - password: 'test12345678@', - cipBridge: ['cip-30'] + username: "test123", + password: "test12345678@", + cipBridge: ["cip-30"], }, { - id: '3', + id: "3", extension: getBrowserExtension(BrowserExtensionName.Eternl), seed: [ - 'stomach', - 'horn', - 'rail', - 'afraid', - 'flip', - 'also', - 'abandon', - 'speed', - 'chaos', - 'daring', - 'soon', - 'soft', - 'okay', - 'online', - 'benefit', + "stomach", + "horn", + "rail", + "afraid", + "flip", + "also", + "abandon", + "speed", + "chaos", + "daring", + "soon", + "soft", + "okay", + "online", + "benefit", ], - username: 'test123', - password: 'test12345678@!!', - cipBridge: ['cip-30', 'cip-95'] - } + username: "test123", + password: "test12345678@!!", + cipBridge: ["cip-30", "cip-95"], + }, + { + id: "4", + extension: getBrowserExtension(BrowserExtensionName.Yoroi), + seed: [ + "stomach", + "horn", + "rail", + "afraid", + "flip", + "also", + "abandon", + "speed", + "chaos", + "daring", + "soon", + "soft", + "okay", + "online", + "benefit", + ], + username: "test123", + password: "test12345678@!!", + cipBridge: ["cip-95"], + }, + { + id: "5", + extension: getBrowserExtension(BrowserExtensionName.Nufi), + seed: [ + "stomach", + "horn", + "rail", + "afraid", + "flip", + "also", + "abandon", + "speed", + "chaos", + "daring", + "soon", + "soft", + "okay", + "online", + "benefit", + ], + username: "test123", + password: "test12345678@!!", + cipBridge: ["cip-95"], + }, ]; export const getWalletConfig = (id: string): WalletConfig => { - const walletConfig = walletConfigs.find(walletConfig => walletConfig.id === id); + const walletConfig = walletConfigs.find( + (walletConfig) => walletConfig.id === id + ); if (!walletConfig) { throw new Error(`Wallet config with id ${id} not found`); } return walletConfig; -} +}; export const getWalletConfigs = (): WalletConfig[] => walletConfigs; - \ No newline at end of file diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/nufiUtils.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/nufiUtils.ts new file mode 100644 index 00000000000..fd1c058b179 --- /dev/null +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/nufiUtils.ts @@ -0,0 +1,43 @@ +import { Page } from "playwright"; +import { WalletConfig } from "./walletUtils"; + +export const onboardNufiWallet = async ( + page: Page, + walletConfig: WalletConfig +): Promise => { + await page.locator("//*[@data-testid='RestorePageIcon']").click(); + const seedPhrase = walletConfig.seed; + for (let i = 0; i < 15; i++) { + await page + .locator(`//div[@rtl-data-test-id='mnemonic-field-input-${i}']//input`) + .fill(seedPhrase[i]); + } + await page + .locator("//span[@data-test-id='terms-and-conditions-checkbox']/input") + .check(); + await page.locator("button:has-text('Continue')").click(); + await page + .locator("//input[@rtl-data-test-id='wallet-name-field']") + .fill(walletConfig.username); + await page.locator("//input[@id=':rg:']").fill(walletConfig.password); + await page.locator("//input[@id=':rh:']").fill(walletConfig.password); + await page.locator("button:has-text('Continue')").click(); + await page.locator("button:has-text('Recover')").click(); + await page.locator("button:has-text('Go to Wallet')").click(); +}; + +export const connectWalletPopup = async (page: Page): Promise => { + await page.locator("button:has-text('Connect')").click(); +}; + +export const signNufiData = async ( + page: Page, + password: string, + isCorrectPassword: boolean +): Promise => { + if (!isCorrectPassword) { + await page.locator("button:has-text('Reject')").click(); + return; + } + await page.locator("button:has-text('Sign')").click(); +}; diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/walletUtils.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/walletUtils.ts index fc698a1a689..3b5638a9c45 100644 --- a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/walletUtils.ts +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/walletUtils.ts @@ -1,8 +1,10 @@ -import { Page } from "@playwright/test"; +import { BrowserContext, Locator, Page } from "@playwright/test"; import { BrowserExtension, BrowserExtensionName } from "../extensions"; import { onboardEternlWallet, signEternlData } from "./eternlUtils"; import { onboardLaceWallet, signLaceData } from "./laceUtils"; +import { onboardNufiWallet, signNufiData } from "./nufiUtils"; import { onboardTyphonWallet, signTyphonData } from "./typhonUtils"; +import { onboardYoroiWallet, signYoroiData } from "./yoroiUtils"; export interface WalletConfig { id: string; @@ -27,6 +29,12 @@ export const onboardWallet = async ( case BrowserExtensionName.Eternl: await onboardEternlWallet(page, walletConfig); break; + case BrowserExtensionName.Yoroi: + await onboardYoroiWallet(page, walletConfig); + break; + case BrowserExtensionName.Nufi: + await onboardNufiWallet(page, walletConfig); + break; default: throw new Error("Wallet not in use"); } @@ -49,16 +57,45 @@ export const allowExtension = async ( case "Eternl": await tab.locator('button:has-text("Grant Access")').click(); break; + case "Yoroi": + await tab.locator("button:has(#connectedWalletName)").click(); + break; + case "Nufi": + await tab.locator("//input[@type='password']").fill("test12345678@!!"); + await tab.locator("button:has-text('Connect')").click(); + await tab.locator("button:has-text('Connect')").click(); + break; default: throw new Error("Wallet not in use"); } }; +const getWalletPopup = async ( + browser: BrowserContext, + triggerLocatorCLick: Locator +): Promise => { + if (browser.pages().length > 1) { + await triggerLocatorCLick.click(); + await browser + .pages() + [browser.pages().length - 1].waitForLoadState("domcontentloaded"); + return browser.pages()[browser.pages().length - 1]; + } else { + const [page] = await Promise.all([ + browser.waitForEvent("page"), + triggerLocatorCLick.click(), + ]); + return page; + } +}; + export const signWalletPopup = async ( - page: Page, + browser: BrowserContext, walletConfig: WalletConfig, + locatorTrigger: Locator, isCorrectPassword = true ): Promise => { + const page = await getWalletPopup(browser, locatorTrigger); switch (walletConfig.extension.Name) { case BrowserExtensionName.Typhon: await signTyphonData(page, walletConfig.password, isCorrectPassword); @@ -69,6 +106,12 @@ export const signWalletPopup = async ( case BrowserExtensionName.Eternl: await signEternlData(page, walletConfig.password, isCorrectPassword); break; + case BrowserExtensionName.Yoroi: + await signYoroiData(page, walletConfig.password, isCorrectPassword); + break; + case BrowserExtensionName.Nufi: + await signNufiData(page, walletConfig.password, isCorrectPassword); + break; default: throw new Error("Wallet not in use"); } diff --git a/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/yoroiUtils.ts b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/yoroiUtils.ts new file mode 100644 index 00000000000..19b29811784 --- /dev/null +++ b/catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/utils/wallets/yoroiUtils.ts @@ -0,0 +1,47 @@ +import { Page } from "playwright"; +import { WalletConfig } from "./walletUtils"; + +export const onboardYoroiWallet = async ( + page: Page, + walletConfig: WalletConfig +): Promise => { + await page.locator("#initialPage-tosAgreement-checkbox").check(); + await page.locator("#initialPage-continue-button").click(); + await page.locator("#mui-2").click(); + await page.locator("#somewhere-checkbox").check(); + await page.locator('button:has-text("Continue")').click(); + + await page + .locator(".UriPromptForm_buttonsWrapper button.MuiButton-secondary") + .click(); + + await page.locator("#restoreWalletButton").click(); + await page.locator('button:has-text("Cardano Preprod Testnet")').click(); + await page.locator("#fifteenWordsButton").click(); + const seedPhrase = walletConfig.seed; + for (let i = 0; i < seedPhrase.length; i++) { + const ftSeedPhraseSelector = `#downshift-${i}-input`; + await page.locator(ftSeedPhraseSelector).fill(seedPhrase[i]); + } + await page.locator(`#downshift-${seedPhrase.length - 1}-input`).blur(); + await page.locator("#primaryButton").click(); + await page.locator("#infoDialogContinueButton").click(); + await page.locator("#walletNameInput-label").fill(walletConfig.username); + await page.locator("#walletPasswordInput-label").fill(walletConfig.password); + await page.locator("#repeatPasswordInput-label").fill(walletConfig.password); + await page.locator("#primaryButton").click(); + await page.locator("#dialog-gotothewallet-button").click(); +}; + +export const signYoroiData = async ( + signTab: Page, + password: string, + isCorrectPassword: boolean +): Promise => { + await signTab.locator("#walletPassword").fill(password); + await signTab.locator("#confirmButton").click(); + if (!isCorrectPassword) { + await signTab.locator("#cancelButton").click(); + return; + } +};