From ece2b114371336f8b3670b3abd7fac8f6033658f Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Mon, 27 Jan 2025 17:02:11 +0100 Subject: [PATCH 1/6] test: adding remaining LLM Speculos Send tests --- apps/ledger-live-mobile/e2e/helpers.ts | 4 +- apps/ledger-live-mobile/e2e/models/send.ts | 5 + .../e2e/page/trade/send.page.ts | 73 ++++++ apps/ledger-live-mobile/e2e/setup.ts | 10 +- .../e2e/specs/speculos/send/send.ts | 219 +++++++++++++++--- .../e2e/specs/speculos/send/sendADA.spec.ts | 2 +- .../e2e/specs/speculos/send/sendAPTOS.spec.ts | 6 + .../e2e/specs/speculos/send/sendATOM.spec.ts | 2 +- .../e2e/specs/speculos/send/sendBCH.spec.ts | 3 +- .../e2e/specs/speculos/send/sendDOGE.spec.ts | 3 +- .../specs/speculos/send/sendENS_ETH.spec.ts | 7 + .../sendInvalidAddressALGO_USDT.spec.ts | 12 + .../sendInvalidAddressATOM.spec.ts | 10 + .../sendInvalid/sendInvalidAddressDOT.spec.ts | 10 + .../sendInvalidAddressEMPTY.spec.ts | 7 + .../sendInvalid/sendInvalidAddressETH.spec.ts | 12 + .../sendInvalid/sendInvalidAddressXRP.spec.ts | 10 + .../sendInvalid/sendInvalidAmountDOT.spec.ts | 10 + .../sendInvalid/sendInvalidAmountDOT2.spec.ts | 10 + .../sendInvalid/sendInvalidAmountETH.spec.ts | 7 + .../sendInvalid/sendInvalidAmountETH2.spec.ts | 7 + .../sendInvalid/sendInvalidAmountETH3.spec.ts | 7 + .../sendInvalid/sendInvalidAmountXRP.spec.ts | 10 + .../sendInvalidTokenAmountBSC_BUSD.spec.ts | 13 ++ .../sendInvalidTokenAmountETH_USDT.spec.ts | 13 ++ .../specs/speculos/send/sendMAX_ETH.spec.ts | 7 + .../e2e/specs/speculos/send/sendPOL.spec.ts | 3 +- .../e2e/specs/speculos/send/sendSOL.spec.ts | 2 +- .../specs/speculos/send/sendSepETH.spec.ts | 3 +- .../sendValidAddressATOM.spec.ts | 6 + .../sendValidAddressATOM2.spec.ts | 6 + .../sendValidAddressBCH.spec.ts | 7 + .../sendValidAddressBTC_LEGACY.spec.ts | 12 + .../sendValidAddressBTC_NATIVE_SEGWIT.spec.ts | 12 + .../sendValidAddressBTC_SEGWIT.spec.ts | 12 + .../sendValidAddressBTC_TAPROOT.spec.ts | 12 + .../sendValidAddressETH.spec.ts | 7 + .../sendValidAddressETH2.spec.ts | 7 + .../sendValidAddressETH3.spec.ts | 11 + .../sendValidAddressETH_USDT.spec.ts | 11 + .../sendValidAddressXRP.spec.ts | 6 + .../sendValidAddressXRP2.spec.ts | 6 + .../e2e/specs/speculos/send/sendXLM.spec.ts | 2 +- .../e2e/specs/speculos/send/sendXRP.spec.ts | 2 +- apps/ledger-live-mobile/package.json | 2 +- .../src/components/ValidateOnDevice.tsx | 8 +- .../src/families/evm/SelectFeesStrategy.tsx | 2 +- .../src/screens/SendFunds/03a-AmountCoin.tsx | 1 + .../src/screens/SendFunds/04-Summary.tsx | 2 +- .../src/screens/SendFunds/AmountInput.tsx | 1 + .../screens/SendFunds/DomainErrorHandlers.tsx | 1 + .../src/screens/SendFunds/RecipientRow.tsx | 1 + .../screens/SendFunds/SummaryToSection.tsx | 4 +- .../src/e2e/enum/Account.ts | 2 +- 54 files changed, 582 insertions(+), 48 deletions(-) create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendAPTOS.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendENS_ETH.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressALGO_USDT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressATOM.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressDOT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressEMPTY.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressETH.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressXRP.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT2.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH2.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH3.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountXRP.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountBSC_BUSD.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountETH_USDT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendMAX_ETH.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM2.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBCH.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_LEGACY.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_NATIVE_SEGWIT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_SEGWIT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_TAPROOT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH2.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH3.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH_USDT.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP.spec.ts create mode 100644 apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP2.spec.ts diff --git a/apps/ledger-live-mobile/e2e/helpers.ts b/apps/ledger-live-mobile/e2e/helpers.ts index 9ed915efeae9..e7f3752036e0 100644 --- a/apps/ledger-live-mobile/e2e/helpers.ts +++ b/apps/ledger-live-mobile/e2e/helpers.ts @@ -191,9 +191,7 @@ export async function launchApp() { detoxURLBlacklistRegex: '\\(".*sdk.*.braze.*",".*.googleapis.com/.*",".*clients3.google.com.*",".*tron.coin.ledger.com/wallet/getBrokerage.*"\\)', mock: getEnv("MOCK") ? getEnv("MOCK") : "0", - disable_broadcast: getEnv("DISABLE_TRANSACTION_BROADCAST") - ? getEnv("DISABLE_TRANSACTION_BROADCAST") - : "1", + disable_broadcast: getEnv("DISABLE_TRANSACTION_BROADCAST") ? 1 : 0, }, languageAndLocale: { language: "en-US", diff --git a/apps/ledger-live-mobile/e2e/models/send.ts b/apps/ledger-live-mobile/e2e/models/send.ts index f79dc5e9f293..4f068a042633 100644 --- a/apps/ledger-live-mobile/e2e/models/send.ts +++ b/apps/ledger-live-mobile/e2e/models/send.ts @@ -28,6 +28,7 @@ export async function verifyAppValidationSendInfo( const currency = transaction.accountToCredit.currency; const addressRecipient = transaction.accountToCredit.address; const addressSender = transaction.accountToDebit.address; + const ensName = transaction.accountToCredit.ensName; await app.deviceValidation.expectDeviceValidationScreen(); @@ -42,4 +43,8 @@ export async function verifyAppValidationSendInfo( if (currenciesForValidationSender.includes(currency)) { await app.deviceValidation.expectAddress(addressSender); } + + if (ensName) { + await app.send.expectValidationEnsName(ensName); + } } diff --git a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts index aafe3f709264..c37600f2737f 100644 --- a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts +++ b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts @@ -7,19 +7,30 @@ import { typeTextById, tapByElement, IsIdVisible, + getTextOfElement, } from "../../helpers"; import { expect } from "detox"; +import jestExpect from "expect"; const baseLink = "send"; export default class SendPage { summaryAmount = () => getElementById("send-summary-amount"); summaryRecipient = () => getElementById("send-summary-recipient"); + summaryRecipientEns = () => getElementById("send-summary-recipient-ens"); + validationAmountId = "send-validation-amount"; + validationAddressId = "send-validation-address"; + validationEnsId = "send-validation-domain"; getStep1HeaderTitle = () => getElementById("send-header-step1-title"); recipientContinueButtonId = "recipient-continue-button"; recipientInputId = "recipient-input"; + recipientErrorId = "send-recipient-error"; amountInputId = "amount-input"; + amountErrorId = "send-amount-error"; + amountMaxSwitch = () => getElementById("send-amount-max-switch"); amountContinueButton = () => getElementById("amount-continue-button"); + summaryErrorId = "insufficient-fee-error"; + summaryWarning = () => getElementById("send-summary-warning"); summaryContinueButton = () => getElementById("summary-continue-button"); highFreeConfirmButtonID = "confirmation-modal-confirm-button"; @@ -45,6 +56,21 @@ export default class SendPage { await tapById(this.recipientContinueButtonId); } + @Step("Expect recipient error message") + async expectSendRecipientError(errorMessage: string) { + if (errorMessage) await expect(getElementById(this.recipientErrorId)).toHaveText(errorMessage); + else await expect(getElementById(this.recipientErrorId)).not.toBeVisible(); + await expect(getElementById(this.recipientContinueButtonId)).not.toBeVisible(); + } + + @Step("Expect recipient step success") + async expectSendRecipientSuccess(expectedWarningMessage?: string) { + if (!expectedWarningMessage) + await expect(getElementById(this.recipientErrorId)).not.toBeVisible(); + else await expect(getElementById(this.recipientErrorId)).toHaveText(expectedWarningMessage); + await expect(getElementById(this.recipientContinueButtonId)).toBeVisible(); + } + @Step("Set recipient and continue") async setRecipientAndContinue(address: string) { await this.setRecipient(address); @@ -61,6 +87,18 @@ export default class SendPage { await tapByElement(this.amountContinueButton()); } + @Step("Expect amount step success") + async expectSendAmountSuccess() { + await expect(getElementById(this.amountErrorId)).toHaveText(""); + await expect(this.amountContinueButton()).toBeVisible(); + } + + @Step("Expect amount error message") + async expectSendAmountError(errorMessage: string) { + await expect(getElementById(this.amountErrorId)).toHaveText(errorMessage); + await expect(this.amountContinueButton()).not.toBeVisible(); + } + @Step("Set amount and continue") async setAmountAndContinue(amount: string) { await this.setAmount(amount); @@ -81,9 +119,44 @@ export default class SendPage { await expect(this.summaryRecipient()).toHaveText(recipient); } + @Step("Expect error in summary") + async expectSendSummaryError(errorMessage: RegExp) { + const error = await getTextOfElement(this.summaryErrorId); + jestExpect(error).toMatch(errorMessage); + await expect(this.summaryContinueButton()).not.toBeVisible(); + } + + @Step("Expect warning in summary") + async expectSummaryWarning(warningMessage: string) { + await expect(this.summaryWarning()).toHaveText(warningMessage); + } + + @Step("Expect recipient ENS in summary") + async expectSummaryRecepientEns(ensName: string) { + await expect(this.summaryRecipientEns()).toHaveText(ensName); + } + @Step("Dismiss high fee modal if visible") async dismissHighFeeModal() { if (await IsIdVisible(this.highFreeConfirmButtonID)) await tapById(this.highFreeConfirmButtonID); } + + @Step("Expect amount in device validation screen") + async expectValidationAmount(amount: string) { + await waitForElementById(this.validationAmountId); + await expect(getElementById(this.validationAmountId)).toHaveText(amount); + } + + @Step("Expect address in device validation screen") + async expectValidationAddress(recipient: string) { + await waitForElementById(this.validationAddressId); + await expect(getElementById(this.validationAddressId)).toHaveText(recipient); + } + + @Step("Expect ENS name in device validation screen") + async expectValidationEnsName(ensName: string) { + await waitForElementById(this.validationEnsId); + await expect(getElementById(this.validationEnsId)).toHaveText(ensName); + } } diff --git a/apps/ledger-live-mobile/e2e/setup.ts b/apps/ledger-live-mobile/e2e/setup.ts index dd9513e3e02a..667ae960f8a4 100644 --- a/apps/ledger-live-mobile/e2e/setup.ts +++ b/apps/ledger-live-mobile/e2e/setup.ts @@ -6,11 +6,12 @@ import { MatcherState } from "expect/build/types"; import { format } from "date-fns"; import { launchApp, deleteSpeculos } from "./helpers"; import { closeProxy } from "./bridge/proxy"; -import { setEnv } from "@ledgerhq/live-env"; +import { getEnv, setEnv } from "@ledgerhq/live-env"; const currentDate = new Date(); const date = format(currentDate, "MM-dd"); const directoryPath = `artifacts/${date}_LLM`; +const broadcastOriginalValue = getEnv("DISABLE_TRANSACTION_BROADCAST"); if (process.env.MOCK == "0") { setEnv("MOCK", ""); @@ -20,6 +21,12 @@ if (process.env.MOCK == "0") { process.env.MOCK = "1"; } +if (process.env.DISABLE_TRANSACTION_BROADCAST == "0") { + setEnv("DISABLE_TRANSACTION_BROADCAST", false); +} else if (getEnv("MOCK") != "1") { + setEnv("DISABLE_TRANSACTION_BROADCAST", true); +} + beforeAll( async () => { setEnv("DISABLE_APP_VERSION_REQUIREMENTS", true); @@ -37,6 +44,7 @@ afterEach(async () => { }); afterAll(async () => { + setEnv("DISABLE_TRANSACTION_BROADCAST", broadcastOriginalValue); serverBridge.close(); closeProxy(); await deleteSpeculos(); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts index d9bd8c62cd0f..2e33c571ae86 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts @@ -1,52 +1,215 @@ +import { setEnv } from "@ledgerhq/live-env"; import { verifyAppValidationSendInfo } from "../../../models/send"; import { Application } from "../../../page"; import { CLI } from "../../../utils/cliUtils"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { device } from "detox"; +import invariant from "invariant"; + +async function navigateToSendScreen(app: Application, accountName: string) { + await app.accounts.openViaDeeplink(); + await app.common.goToAccountByName(accountName); + await app.account.tapSend(); +} + +const beforeAllFunction = async (app: Application, transaction: Transaction) => { + await app.init({ + speculosApp: transaction.accountToDebit.currency.speculosApp, + cliCommands: [ + () => { + return CLI.liveData({ + currency: transaction.accountToDebit.currency.currencyId, + index: transaction.accountToDebit.index, + add: true, + appjson: app.userdataPath, + }); + }, + ], + }); + + await app.portfolio.waitForPortfolioPageToLoad(); +}; export async function runSendTest(transaction: Transaction, tmsLink: string) { const app = new Application(); $TmsLink(tmsLink); - describe(`Send flow on ${transaction.accountToCredit.currency.name}`, () => { + describe("Send from 1 account to another", () => { + beforeAll(async () => { + await beforeAllFunction(app, transaction); + }); + + it(`Send from ${transaction.accountToDebit.accountName} to ${transaction.accountToCredit.accountName}`, async () => { + await navigateToSendScreen(app, transaction.accountToDebit.accountName); + await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.setAmountAndContinue(transaction.amount); + + const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; + await app.send.expectSummaryAmount(amountWithCode); + await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.summaryContinue(); + await app.send.dismissHighFeeModal(); + + await verifyAppValidationSendInfo(app, transaction, amountWithCode); + + await app.speculos.signSendTransaction(transaction); + + await device.disableSynchronization(); + await app.common.successViewDetails(); + + await app.operationDetails.waitForOperationDetails(); + await app.operationDetails.checkAccount(transaction.accountToDebit.accountName); + await app.operationDetails.checkRecipient(transaction.accountToCredit.address); + await app.operationDetails.checkTransactionType("OUT"); + }); + }); +} + +export async function runSendInvalidAddressTest( + transaction: Transaction, + expectedErrorMessage: string, + tmsLink: string, + accountName?: string, +) { + const app = new Application(); + + $TmsLink(tmsLink); + describe("Send - invalid address input", () => { + beforeAll(async () => { + await beforeAllFunction(app, transaction); + }); + + it(`Send from ${transaction.accountToDebit.accountName} ${accountName || ""} to ${transaction.accountToCredit.accountName} - invalid address input`, async () => { + await navigateToSendScreen(app, accountName || transaction.accountToDebit.accountName); + await app.send.setRecipient(transaction.accountToCredit.address); + await app.send.expectSendRecipientError(expectedErrorMessage); + }); + }); +} + +export async function runSendValidAddressTest( + transaction: Transaction, + tmsLink: string, + accountName?: string, + expectedWarningMessage?: string, +) { + const app = new Application(); + + $TmsLink(tmsLink); + describe("Send - valid address & amount input", () => { + beforeAll(async () => { + await beforeAllFunction(app, transaction); + }); + + it(`Send from ${transaction.accountToDebit.accountName} ${accountName || ""} to ${transaction.accountToCredit.accountName} - valid address & amount input`, async () => { + await navigateToSendScreen(app, accountName || transaction.accountToDebit.accountName); + await app.send.setRecipient(transaction.accountToCredit.address); + await app.send.expectSendRecipientSuccess(expectedWarningMessage); + await app.send.recipientContinue(); + await app.send.setAmountAndContinue(transaction.amount); + + const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; + await app.send.expectSummaryAmount(amountWithCode); + await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + if (expectedWarningMessage) await app.send.expectSummaryWarning(expectedWarningMessage); + }); + }); +} + +export async function runSendInvalidAmountTest( + transaction: Transaction, + expectedErrorMessage: string, + tmsLink: string, +) { + const app = new Application(); + + $TmsLink(tmsLink); + describe("Check invalid amount input error", () => { beforeAll(async () => { - await app.init({ - speculosApp: transaction.accountToCredit.currency.speculosApp, - cliCommands: [ - () => { - return CLI.liveData({ - currency: transaction.accountToCredit.currency.currencyId, - index: transaction.accountToCredit.index, - add: true, - appjson: app.userdataPath, - }); - }, - () => { - return CLI.liveData({ - currency: transaction.accountToDebit.currency.currencyId, - index: transaction.accountToDebit.index, - add: true, - appjson: app.userdataPath, - }); - }, - ], - }); - - await app.portfolio.waitForPortfolioPageToLoad(); + await beforeAllFunction(app, transaction); }); - it(`Send from 1 account to another on ${transaction.accountToCredit.currency.name}`, async () => { - await app.accounts.openViaDeeplink(); - await app.common.goToAccountByName(transaction.accountToDebit.accountName); - await app.account.tapSend(); + it(`Check "${expectedErrorMessage}" for ${transaction.accountToDebit.currency.name} - invalid amount ${transaction.amount} input error`, async () => { + await navigateToSendScreen(app, transaction.accountToDebit.accountName); + await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.setAmount(transaction.amount); + await app.send.expectSendAmountError(expectedErrorMessage); + }); + }); +} + +export async function runSendInvalidTokenAmountTest( + transaction: Transaction, + expectedErrorMessage: RegExp, + tmsLink: string, +) { + const app = new Application(); + + $TmsLink(tmsLink); + describe("Send token (subAccount) - invalid amount input", () => { + beforeAll(async () => { + await beforeAllFunction(app, transaction); + }); + + it(`Check "${expectedErrorMessage}" for ${transaction.accountToDebit.currency.name} - invalid amount ${transaction.amount} input error`, async () => { + await navigateToSendScreen(app, transaction.accountToDebit.currency.name); + await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.setAmount(transaction.amount); + await app.send.expectSendAmountSuccess(); + await app.send.amountContinue(); const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; + await app.send.expectSummaryAmount(amountWithCode); + await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.expectSendSummaryError(expectedErrorMessage); + }); + }); +} + +export async function runSendMaxTest(transaction: Transaction, tmsLink: string) { + setEnv("DISABLE_TRANSACTION_BROADCAST", true); + const app = new Application(); + + $TmsLink(tmsLink); + describe("Verify send max user flow", () => { + beforeAll(async () => { + await beforeAllFunction(app, transaction); + }); + it(`Check Valid amount input (${transaction.amount}) - ${transaction.accountToCredit.accountName}`, async () => { + await navigateToSendScreen(app, transaction.accountToDebit.accountName); await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.amountContinue(); + + const amountWithCode = amount + " " + transaction.accountToCredit.currency.ticker; + await app.send.expectSummaryAmount(amountWithCode); + await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + }); + }); +} + +export async function runSendENSTest(transaction: Transaction, tmsLink: string) { + setEnv("DISABLE_TRANSACTION_BROADCAST", true); + const app = new Application(); + + $TmsLink(tmsLink); + describe("User sends funds to ENS address", () => { + beforeAll(async () => { + await beforeAllFunction(app, transaction); + }); + + it(`User sends funds to ENS address - ${transaction.accountToCredit.ensName}`, async () => { + const ensName = transaction.accountToCredit.ensName; + invariant(ensName, "ENS name is not provided"); + + await navigateToSendScreen(app, transaction.accountToDebit.accountName); + await app.send.setRecipientAndContinue(ensName); await app.send.setAmountAndContinue(transaction.amount); + const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.expectSummaryRecepientEns(ensName); await app.send.summaryContinue(); await app.send.dismissHighFeeModal(); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendADA.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendADA.spec.ts index 0d8962efd476..70edb551eb0a 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendADA.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendADA.spec.ts @@ -2,5 +2,5 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; -const transaction = new Transaction(Account.ADA_1, Account.ADA_2, "1"); +const transaction = new Transaction(Account.ADA_1, Account.ADA_2, "1", undefined, "noTag"); runSendTest(transaction, "B2CQA-2815"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendAPTOS.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendAPTOS.spec.ts new file mode 100644 index 000000000000..67074318de18 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendAPTOS.spec.ts @@ -0,0 +1,6 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendTest } from "../send/send"; + +const transaction = new Transaction(Account.APTOS_1, Account.APTOS_2, "0.0001"); +runSendTest(transaction, "B2CQA-2920"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendATOM.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendATOM.spec.ts index beb0868a3dee..bdfcad5884be 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendATOM.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendATOM.spec.ts @@ -2,5 +2,5 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; -const transaction = new Transaction(Account.ATOM_1, Account.ATOM_2, "0.0001"); +const transaction = new Transaction(Account.ATOM_1, Account.ATOM_2, "0.0001", undefined, "noTag"); runSendTest(transaction, "B2CQA-2814"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendBCH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendBCH.spec.ts index a06e50efff40..0462536989a9 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendBCH.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendBCH.spec.ts @@ -1,6 +1,7 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; -const transaction = new Transaction(Account.BCH_1, Account.BCH_2, "0.0001"); +const transaction = new Transaction(Account.BCH_1, Account.BCH_2, "0.0001", Fee.SLOW); runSendTest(transaction, "B2CQA-2808"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendDOGE.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendDOGE.spec.ts index bf5db5cfac9a..f6534e020178 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendDOGE.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendDOGE.spec.ts @@ -1,6 +1,7 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; -const transaction = new Transaction(Account.DOGE_1, Account.DOGE_2, "0.01"); +const transaction = new Transaction(Account.DOGE_1, Account.DOGE_2, "0.01", Fee.SLOW); runSendTest(transaction, "B2CQA-2573"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendENS_ETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendENS_ETH.spec.ts new file mode 100644 index 000000000000..65fd4c7a69a7 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendENS_ETH.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendENSTest } from "../send/send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2, "0.0001", Fee.MEDIUM); +runSendENSTest(transaction, "B2CQA-2202"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressALGO_USDT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressALGO_USDT.spec.ts new file mode 100644 index 000000000000..59e6f9c0e0ff --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressALGO_USDT.spec.ts @@ -0,0 +1,12 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ALGO_USDT_1, Account.ALGO_USDT_2, "0.1", Fee.MEDIUM); +runSendInvalidAddressTest( + transaction, + "Recipient account has not opted in the selected ASA.", + "B2CQA-2702", + transaction.accountToDebit.currency.name, +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressATOM.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressATOM.spec.ts new file mode 100644 index 000000000000..dc23e65810f8 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressATOM.spec.ts @@ -0,0 +1,10 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAddressTest } from "../send"; + +const transaction = new Transaction(Account.ATOM_1, Account.ATOM_1, "0.00001"); +runSendInvalidAddressTest( + transaction, + "Destination and source accounts must not be the same.", + "B2CQA-2713", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressDOT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressDOT.spec.ts new file mode 100644 index 000000000000..f202e1b735b0 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressDOT.spec.ts @@ -0,0 +1,10 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAddressTest } from "../send"; + +const transaction = new Transaction(Account.DOT_1, Account.DOT_1, "0.5"); +runSendInvalidAddressTest( + transaction, + "Destination and source accounts must not be the same.", + "B2CQA-2711", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressEMPTY.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressEMPTY.spec.ts new file mode 100644 index 000000000000..baf3c4cb61f3 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressEMPTY.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.EMPTY, "0.00001", Fee.MEDIUM); +runSendInvalidAddressTest(transaction, "", "B2CQA-2710"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressETH.spec.ts new file mode 100644 index 000000000000..505ad006c091 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressETH.spec.ts @@ -0,0 +1,12 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction( + Account.ETH_1, + Account.BTC_NATIVE_SEGWIT_1, + "0.00001", + Fee.MEDIUM, +); +runSendInvalidAddressTest(transaction, "This is not a valid Ethereum address", "B2CQA-2709"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressXRP.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressXRP.spec.ts new file mode 100644 index 000000000000..5b2bc009064a --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAddressXRP.spec.ts @@ -0,0 +1,10 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAddressTest } from "../send"; + +const transaction = new Transaction(Account.XRP_1, Account.XRP_1, "1", undefined, "123456"); +runSendInvalidAddressTest( + transaction, + "Destination and source accounts must not be the same.", + "B2CQA-2712", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT.spec.ts new file mode 100644 index 000000000000..0c7e5a39f20e --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT.spec.ts @@ -0,0 +1,10 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAmountTest } from "../send"; + +const transaction = new Transaction(Account.DOT_1, Account.DOT_2, "1.2"); +runSendInvalidAmountTest( + transaction, + "Balance cannot be below 1 DOT. Send max to empty account.", + "B2CQA-2567", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT2.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT2.spec.ts new file mode 100644 index 000000000000..40f2d097ea26 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountDOT2.spec.ts @@ -0,0 +1,10 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAmountTest } from "../send"; + +const transaction = new Transaction(Account.DOT_1, Account.DOT_3, "0.5"); +runSendInvalidAmountTest( + transaction, + "Minimum of 1 DOT needed to activate recipient address", + "B2CQA-2570", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH.spec.ts new file mode 100644 index 000000000000..412c3db10c20 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAmountTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2, "", Fee.MEDIUM); +runSendInvalidAmountTest(transaction, "", "B2CQA-2568"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH2.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH2.spec.ts new file mode 100644 index 000000000000..7dae3d7bd862 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH2.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAmountTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2, "0", Fee.MEDIUM); +runSendInvalidAmountTest(transaction, "", "B2CQA-2569"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH3.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH3.spec.ts new file mode 100644 index 000000000000..116651b2acc6 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountETH3.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAmountTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2, "100", Fee.MEDIUM); +runSendInvalidAmountTest(transaction, "Sorry, insufficient funds", "B2CQA-2572"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountXRP.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountXRP.spec.ts new file mode 100644 index 000000000000..1c7c4bd797f2 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidAmountXRP.spec.ts @@ -0,0 +1,10 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidAmountTest } from "../send"; + +const transaction = new Transaction(Account.XRP_1, Account.XRP_3, "0.1", undefined, "noTag"); +runSendInvalidAmountTest( + transaction, + "Minimum of 1 XRP needed to activate recipient address", + "B2CQA-2571", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountBSC_BUSD.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountBSC_BUSD.spec.ts new file mode 100644 index 000000000000..8feba7fd1314 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountBSC_BUSD.spec.ts @@ -0,0 +1,13 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidTokenAmountTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.BSC_BUSD_1, Account.BSC_BUSD_2, "1", Fee.MEDIUM); +runSendInvalidTokenAmountTest( + transaction, + new RegExp( + /You need \d+\.\d+ BNB in your account to pay for transaction fees on the Binance Smart Chain network\. .*/, + ), + "B2CQA-2700", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountETH_USDT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountETH_USDT.spec.ts new file mode 100644 index 000000000000..c7e25e0e6e6f --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendInvalid/sendInvalidTokenAmountETH_USDT.spec.ts @@ -0,0 +1,13 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendInvalidTokenAmountTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_USDT_2, Account.ETH_USDT_1, "1", Fee.MEDIUM); +runSendInvalidTokenAmountTest( + transaction, + new RegExp( + /You need \d+\.\d+ ETH in your account to pay for transaction fees on the Ethereum network\. .*/, + ), + "B2CQA-2701", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendMAX_ETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendMAX_ETH.spec.ts new file mode 100644 index 000000000000..b3cf95d58953 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendMAX_ETH.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendMaxTest } from "../send/send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2, "max", Fee.MEDIUM); +runSendMaxTest(transaction, "B2CQA-473"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendPOL.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendPOL.spec.ts index 22231f33c41f..56470095a21a 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendPOL.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendPOL.spec.ts @@ -1,6 +1,7 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; -const transaction = new Transaction(Account.POL_1, Account.POL_2, "0.001"); +const transaction = new Transaction(Account.POL_1, Account.POL_2, "0.001", Fee.SLOW); runSendTest(transaction, "B2CQA-2807"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSOL.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSOL.spec.ts index 4e1ec0fc09dc..bc7efd3f7773 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSOL.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSOL.spec.ts @@ -2,5 +2,5 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; -const transaction = new Transaction(Account.SOL_1, Account.SOL_2, "0.000001"); +const transaction = new Transaction(Account.SOL_1, Account.SOL_2, "0.000001", undefined, "noTag"); runSendTest(transaction, "B2CQA-2811"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSepETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSepETH.spec.ts index 55d4c6ad357e..9986bde0fa0c 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSepETH.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendSepETH.spec.ts @@ -1,6 +1,7 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; -const transaction = new Transaction(Account.sep_ETH_1, Account.sep_ETH_2, "0.00001"); +const transaction = new Transaction(Account.sep_ETH_1, Account.sep_ETH_2, "0.00001", Fee.SLOW); runSendTest(transaction, "B2CQA-2574"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM.spec.ts new file mode 100644 index 000000000000..c1aad522da3b --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM.spec.ts @@ -0,0 +1,6 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; + +const transaction = new Transaction(Account.ATOM_1, Account.ATOM_2, "0.00001", undefined, "123456"); +runSendValidAddressTest(transaction, "B2CQA-2720"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM2.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM2.spec.ts new file mode 100644 index 000000000000..f78833bf609d --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressATOM2.spec.ts @@ -0,0 +1,6 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; + +const transaction = new Transaction(Account.ATOM_1, Account.ATOM_2, "0.0001"); +runSendValidAddressTest(transaction, "B2CQA-2721"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBCH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBCH.spec.ts new file mode 100644 index 000000000000..cdd61ddc4222 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBCH.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.BCH_1, Account.BCH_2, "0.0001", Fee.MEDIUM); +runSendValidAddressTest(transaction, "B2CQA-2726"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_LEGACY.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_LEGACY.spec.ts new file mode 100644 index 000000000000..7a7278843481 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_LEGACY.spec.ts @@ -0,0 +1,12 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction( + Account.BTC_LEGACY_1, + Account.BTC_LEGACY_2, + "0.00001", + Fee.MEDIUM, +); +runSendValidAddressTest(transaction, "B2CQA-2722"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_NATIVE_SEGWIT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_NATIVE_SEGWIT.spec.ts new file mode 100644 index 000000000000..49ce6625fa53 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_NATIVE_SEGWIT.spec.ts @@ -0,0 +1,12 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction( + Account.BTC_NATIVE_SEGWIT_1, + Account.BTC_NATIVE_SEGWIT_2, + "0.00001", + Fee.MEDIUM, +); +runSendValidAddressTest(transaction, "B2CQA-2724"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_SEGWIT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_SEGWIT.spec.ts new file mode 100644 index 000000000000..e965c20fa594 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_SEGWIT.spec.ts @@ -0,0 +1,12 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction( + Account.BTC_SEGWIT_1, + Account.BTC_SEGWIT_2, + "0.00001", + Fee.MEDIUM, +); +runSendValidAddressTest(transaction, "B2CQA-2723"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_TAPROOT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_TAPROOT.spec.ts new file mode 100644 index 000000000000..506069870c37 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressBTC_TAPROOT.spec.ts @@ -0,0 +1,12 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction( + Account.BTC_TAPROOT_1, + Account.BTC_TAPROOT_2, + "0.00001", + Fee.MEDIUM, +); +runSendValidAddressTest(transaction, "B2CQA-2725"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH.spec.ts new file mode 100644 index 000000000000..3b31b9115a72 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_3, "0.00001", Fee.MEDIUM); +runSendValidAddressTest(transaction, "B2CQA-2714"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH2.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH2.spec.ts new file mode 100644 index 000000000000..9d5a18b32bd3 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH2.spec.ts @@ -0,0 +1,7 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2, "0.00001", Fee.MEDIUM); +runSendValidAddressTest(transaction, "B2CQA-2715, B2CQA-2716"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH3.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH3.spec.ts new file mode 100644 index 000000000000..918a1cf47a38 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH3.spec.ts @@ -0,0 +1,11 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; + +const transaction = new Transaction(Account.ETH_1, Account.ETH_2_LOWER_CASE, "0.0001"); +runSendValidAddressTest( + transaction, + "B2CQA-2717", + undefined, + "Auto-verification not available: carefully verify the address.", +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH_USDT.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH_USDT.spec.ts new file mode 100644 index 000000000000..34fa94a5cb03 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressETH_USDT.spec.ts @@ -0,0 +1,11 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; +import { Fee } from "@ledgerhq/live-common/e2e/enum/Fee"; + +const transaction = new Transaction(Account.ETH_USDT_1, Account.ETH_USDT_2, "1", Fee.MEDIUM); +runSendValidAddressTest( + transaction, + "B2CQA-2703, B2CQA-475", + transaction.accountToDebit.currency.name, +); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP.spec.ts new file mode 100644 index 000000000000..55bd3576a5d4 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP.spec.ts @@ -0,0 +1,6 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; + +const transaction = new Transaction(Account.XRP_1, Account.XRP_2, "1", undefined, "123456"); +runSendValidAddressTest(transaction, "B2CQA-2718"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP2.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP2.spec.ts new file mode 100644 index 000000000000..fa6386b42e24 --- /dev/null +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendValidAddress/sendValidAddressXRP2.spec.ts @@ -0,0 +1,6 @@ +import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; +import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; +import { runSendValidAddressTest } from "../send"; + +const transaction = new Transaction(Account.XRP_1, Account.XRP_2, "2"); +runSendValidAddressTest(transaction, "B2CQA-2719"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXLM.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXLM.spec.ts index 5ddb612c8673..a6006e41a2c2 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXLM.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXLM.spec.ts @@ -2,5 +2,5 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; -const transaction = new Transaction(Account.XLM_1, Account.XLM_2, "0.0001"); +const transaction = new Transaction(Account.XLM_1, Account.XLM_2, "0.0001", undefined, "noTag"); runSendTest(transaction, "B2CQA-2813"); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXRP.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXRP.spec.ts index 40a6c9474c2f..6f11327c4594 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXRP.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendXRP.spec.ts @@ -2,5 +2,5 @@ import { Account } from "@ledgerhq/live-common/e2e/enum/Account"; import { Transaction } from "@ledgerhq/live-common/e2e/models/Transaction"; import { runSendTest } from "../send/send"; -const transaction = new Transaction(Account.XRP_1, Account.XRP_2, "0.0001"); +const transaction = new Transaction(Account.XRP_1, Account.XRP_2, "0.0001", undefined, "noTag"); runSendTest(transaction, "B2CQA-2816"); diff --git a/apps/ledger-live-mobile/package.json b/apps/ledger-live-mobile/package.json index 4aaecc51c2f5..3b80d50158f1 100644 --- a/apps/ledger-live-mobile/package.json +++ b/apps/ledger-live-mobile/package.json @@ -20,7 +20,7 @@ "e2e:build": "pnpm detox build", "e2e:ci": "zx ./scripts/e2e-ci.mjs", "e2e:test": "export MOCK=1 && pnpm detox test", - "e2e:test:speculos": "export MOCK=0 && pnpm detox test --testMatch \"{$(pwd)/e2e/specs/speculos/*.spec.ts,$(pwd)/e2e/specs/speculos/**/*.spec.ts}\" --testTimeout=300000", + "e2e:test:speculos": "export MOCK=0 && pnpm detox test --testMatch \"$(pwd)/e2e/specs/speculos/{,**/,**/**/,**/**/**/}*.spec.ts\" --testTimeout=300000", "prebeta": "bundle install", "debug:detox": "pnpm detox test -c ios.manual currencies.spec.ts", "ios:staging": "ENVFILE=.env.ios.staging react-native run-ios --mode Staging", diff --git a/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx b/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx index b368bcaa8643..fa71f33ccbce 100644 --- a/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx +++ b/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx @@ -73,7 +73,13 @@ function AddressField({ field }: FieldComponentProps) { // in case we want specific styles for addresses. function TextField({ field }: FieldComponentProps) { invariant(field.type === "text", "TextField invalid"); - return ; + return ( + + ); } const commonFieldComponents: Record = { diff --git a/apps/ledger-live-mobile/src/families/evm/SelectFeesStrategy.tsx b/apps/ledger-live-mobile/src/families/evm/SelectFeesStrategy.tsx index cbf3131468a3..ee6665e33aa5 100644 --- a/apps/ledger-live-mobile/src/families/evm/SelectFeesStrategy.tsx +++ b/apps/ledger-live-mobile/src/families/evm/SelectFeesStrategy.tsx @@ -234,7 +234,7 @@ export default function SelectFeesStrategy({ onBuy(mainAccount)}> - + diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx index 0607112bb3c6..b71f2991d551 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx @@ -187,6 +187,7 @@ export default function SendAmountCoin({ navigation, route }: Props) { style={styles.switch} value={useAllAmount} onValueChange={toggleUseAllAmount} + testID="send-amount-max-switch" /> ) : null} diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/04-Summary.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/04-Summary.tsx index 2a0c92937f3e..2dda67a5edc6 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/04-Summary.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/04-Summary.tsx @@ -181,7 +181,7 @@ function SendSummary({ navigation, route }: Props) { /> {status.warnings.recipient ? ( - + ) : null} diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx index 6d6dd61491c2..2f34ed93d30d 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx @@ -81,6 +81,7 @@ export default function AmountInput({ style={[error ? styles.error : styles.warning]} color={error ? "alert" : "orange"} numberOfLines={2} + testID="send-amount-error" > diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/DomainErrorHandlers.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/DomainErrorHandlers.tsx index 6709f660de7f..d6fef29b5b8d 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/DomainErrorHandlers.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/DomainErrorHandlers.tsx @@ -31,6 +31,7 @@ export const BasicErrorsView = memo( diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/RecipientRow.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/RecipientRow.tsx index 6b2c58b43e01..63dde70b9abc 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/RecipientRow.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/RecipientRow.tsx @@ -43,6 +43,7 @@ const RecipientRow = ({ diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryToSection.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryToSection.tsx index 63c9d66b8f6f..ef4a07aac81e 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryToSection.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryToSection.tsx @@ -23,7 +23,7 @@ const DefaultRecipientTemplate = memo(({ transaction }: Pick - + {recipientDomain?.domain} - + {recipientDomain?.domain} Date: Mon, 27 Jan 2025 17:53:44 +0100 Subject: [PATCH 2/6] test: fix send max --- .../e2e/page/trade/send.page.ts | 26 +++++++++++++++---- .../e2e/specs/speculos/send/send.ts | 5 ++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts index c37600f2737f..43082faed123 100644 --- a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts +++ b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts @@ -15,7 +15,7 @@ import jestExpect from "expect"; const baseLink = "send"; export default class SendPage { - summaryAmount = () => getElementById("send-summary-amount"); + summaryAmountId = "send-summary-amount"; summaryRecipient = () => getElementById("send-summary-recipient"); summaryRecipientEns = () => getElementById("send-summary-recipient-ens"); validationAmountId = "send-validation-amount"; @@ -77,10 +77,15 @@ export default class SendPage { await this.recipientContinue(); } + @Step("Set the amount and return the value") async setAmount(amount: string) { - const element = getElementById(this.amountInputId); - await element.replaceText(amount); - await element.tapReturnKey(); + if (amount === "max") await tapByElement(this.amountMaxSwitch()); + else { + const element = getElementById(this.amountInputId); + await element.replaceText(amount); + await element.tapReturnKey(); + } + return await getTextOfElement(this.amountInputId); } async amountContinue() { @@ -111,7 +116,18 @@ export default class SendPage { @Step("Expect amount in summary") async expectSummaryAmount(amount: string) { - await expect(this.summaryAmount()).toHaveText(amount); + await expect(getElementById(this.summaryAmountId)).toHaveText(amount); + } + + @Step("Expect max amount is within range in summary") + async expectSummaryMaxAmount(amount: string, tolerance = 0.00005) { + const summaryAmount = parseFloat( + (await getTextOfElement(this.summaryAmountId)).replace(/[^\d.-]/g, ""), + ); + const expectedAmount = parseFloat(amount); + // Check if the actual amount is within the tolerance range + jestExpect(summaryAmount).toBeGreaterThanOrEqual(expectedAmount - tolerance); + jestExpect(summaryAmount).toBeLessThanOrEqual(expectedAmount + tolerance); } @Step("Expect recipient in summary") diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts index 2e33c571ae86..3446beff83c3 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts @@ -179,10 +179,11 @@ export async function runSendMaxTest(transaction: Transaction, tmsLink: string) it(`Check Valid amount input (${transaction.amount}) - ${transaction.accountToCredit.accountName}`, async () => { await navigateToSendScreen(app, transaction.accountToDebit.accountName); await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + const amount = await app.send.setAmount("max"); + await app.send.expectSendAmountSuccess(); await app.send.amountContinue(); - const amountWithCode = amount + " " + transaction.accountToCredit.currency.ticker; - await app.send.expectSummaryAmount(amountWithCode); + await app.send.expectSummaryMaxAmount(amount); await app.send.expectSummaryRecepient(transaction.accountToCredit.address); }); }); From c458e6f30929507250bf24228c607e098954d0af Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Mon, 27 Jan 2025 20:03:55 +0100 Subject: [PATCH 3/6] test: fix name too long issue --- apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts index 3446beff83c3..51bd8f068081 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts @@ -151,7 +151,7 @@ export async function runSendInvalidTokenAmountTest( await beforeAllFunction(app, transaction); }); - it(`Check "${expectedErrorMessage}" for ${transaction.accountToDebit.currency.name} - invalid amount ${transaction.amount} input error`, async () => { + it(`Check error message for ${transaction.accountToDebit.currency.name} - invalid amount ${transaction.amount} input error`, async () => { await navigateToSendScreen(app, transaction.accountToDebit.currency.name); await app.send.setRecipientAndContinue(transaction.accountToCredit.address); await app.send.setAmount(transaction.amount); From 95d964cfddeb43fadf74cc4613cb43085dca0774 Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Tue, 28 Jan 2025 17:22:03 +0100 Subject: [PATCH 4/6] chore: fix typo --- apps/ledger-live-mobile/e2e/page/trade/send.page.ts | 4 ++-- .../e2e/specs/speculos/send/send.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts index 43082faed123..c026f87a0c8d 100644 --- a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts +++ b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts @@ -131,7 +131,7 @@ export default class SendPage { } @Step("Expect recipient in summary") - async expectSummaryRecepient(recipient: string) { + async expectSummaryRecipient(recipient: string) { await expect(this.summaryRecipient()).toHaveText(recipient); } @@ -148,7 +148,7 @@ export default class SendPage { } @Step("Expect recipient ENS in summary") - async expectSummaryRecepientEns(ensName: string) { + async expectSummaryRecipientEns(ensName: string) { await expect(this.summaryRecipientEns()).toHaveText(ensName); } diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts index 51bd8f068081..917b453d75a6 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts @@ -46,7 +46,7 @@ export async function runSendTest(transaction: Transaction, tmsLink: string) { const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); - await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(transaction.accountToCredit.address); await app.send.summaryContinue(); await app.send.dismissHighFeeModal(); @@ -110,7 +110,7 @@ export async function runSendValidAddressTest( const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); - await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(transaction.accountToCredit.address); if (expectedWarningMessage) await app.send.expectSummaryWarning(expectedWarningMessage); }); }); @@ -160,7 +160,7 @@ export async function runSendInvalidTokenAmountTest( const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); - await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(transaction.accountToCredit.address); await app.send.expectSendSummaryError(expectedErrorMessage); }); }); @@ -184,7 +184,7 @@ export async function runSendMaxTest(transaction: Transaction, tmsLink: string) await app.send.amountContinue(); await app.send.expectSummaryMaxAmount(amount); - await app.send.expectSummaryRecepient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(transaction.accountToCredit.address); }); }); } @@ -209,8 +209,8 @@ export async function runSendENSTest(transaction: Transaction, tmsLink: string) const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); - await app.send.expectSummaryRecepient(transaction.accountToCredit.address); - await app.send.expectSummaryRecepientEns(ensName); + await app.send.expectSummaryRecipient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipientEns(ensName); await app.send.summaryContinue(); await app.send.dismissHighFeeModal(); From 1e27607bf796565eafbda6b98227c73b39face21 Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Wed, 29 Jan 2025 13:28:41 +0100 Subject: [PATCH 5/6] test: improve environment setup --- apps/ledger-live-mobile/e2e/bridge/client.ts | 7 ++++++- apps/ledger-live-mobile/e2e/helpers.ts | 18 ++++++++++++++++++ .../e2e/jest.globalTeardown.ts | 4 +++- apps/ledger-live-mobile/e2e/setup.ts | 18 ++---------------- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/apps/ledger-live-mobile/e2e/bridge/client.ts b/apps/ledger-live-mobile/e2e/bridge/client.ts index a8c1e73f9d55..1ad567a12af6 100644 --- a/apps/ledger-live-mobile/e2e/bridge/client.ts +++ b/apps/ledger-live-mobile/e2e/bridge/client.ts @@ -14,6 +14,7 @@ import { MessageData, ServerData, mockDeviceEventSubject } from "./types"; import { getAllEnvs, setEnv } from "@ledgerhq/live-env"; import { getAllFeatureFlags } from "@ledgerhq/live-common/e2e/index"; import { DeviceModelId } from "@ledgerhq/devices"; +import Config from "react-native-config"; export const e2eBridgeClient = new Subject(); @@ -29,7 +30,11 @@ export function init() { log(`[E2E Bridge Client]: wsPort=${wsPort}, mock=${mock}`); - if (mock == "0") setEnv("MOCK", ""); + if (mock == "0") { + setEnv("MOCK", ""); + setEnv("MOCK_COUNTERVALUES", ""); + Config.MOCK = ""; + } setEnv("DISABLE_TRANSACTION_BROADCAST", disable_broadcast != "0"); if (ws) { diff --git a/apps/ledger-live-mobile/e2e/helpers.ts b/apps/ledger-live-mobile/e2e/helpers.ts index e7f3752036e0..05d186c9cdf1 100644 --- a/apps/ledger-live-mobile/e2e/helpers.ts +++ b/apps/ledger-live-mobile/e2e/helpers.ts @@ -26,6 +26,24 @@ const MAX_PORT = 65535; let portCounter = BASE_PORT; // Counter for generating unique ports const speculosDevices: [number, SpeculosDevice][] = []; +export function setupEnvironment() { + setEnv("DISABLE_APP_VERSION_REQUIREMENTS", true); + + if (process.env.MOCK == "0") { + setEnv("MOCK", ""); + process.env.MOCK = ""; + } else { + setEnv("MOCK", "1"); + process.env.MOCK = "1"; + } + + if (process.env.DISABLE_TRANSACTION_BROADCAST == "0") { + setEnv("DISABLE_TRANSACTION_BROADCAST", false); + } else if (getEnv("MOCK") != "1") { + setEnv("DISABLE_TRANSACTION_BROADCAST", true); + } +} + function sync_delay(ms: number) { const done = new Int32Array(new SharedArrayBuffer(4)); Atomics.wait(done, 0, 0, ms); // Wait for the specified duration diff --git a/apps/ledger-live-mobile/e2e/jest.globalTeardown.ts b/apps/ledger-live-mobile/e2e/jest.globalTeardown.ts index 6843276b5904..a2cef5bc2e3d 100644 --- a/apps/ledger-live-mobile/e2e/jest.globalTeardown.ts +++ b/apps/ledger-live-mobile/e2e/jest.globalTeardown.ts @@ -2,13 +2,15 @@ const detoxGlobalTeardown = require("detox/runners/jest/globalTeardown"); import { promises as fs } from "fs"; import { getEnvs, getFlags, loadConfig } from "./bridge/server"; import { formatFlagsData, formatEnvData } from "@ledgerhq/live-common/e2e/index"; -import { launchApp, waitForElementById } from "./helpers"; +import { launchApp, setupEnvironment, waitForElementById } from "./helpers"; import detox from "detox/internals"; import { close as closeBridge } from "./bridge/server"; const environmentFilePath = "artifacts/environment.properties"; const shouldManageDetox = detox.getStatus() === "inactive"; +setupEnvironment(); + export default async () => { if (process.env.CI) { try { diff --git a/apps/ledger-live-mobile/e2e/setup.ts b/apps/ledger-live-mobile/e2e/setup.ts index 667ae960f8a4..aefa941edaf6 100644 --- a/apps/ledger-live-mobile/e2e/setup.ts +++ b/apps/ledger-live-mobile/e2e/setup.ts @@ -4,7 +4,7 @@ import fs from "fs"; import { getState } from "expect"; import { MatcherState } from "expect/build/types"; import { format } from "date-fns"; -import { launchApp, deleteSpeculos } from "./helpers"; +import { launchApp, deleteSpeculos, setupEnvironment } from "./helpers"; import { closeProxy } from "./bridge/proxy"; import { getEnv, setEnv } from "@ledgerhq/live-env"; @@ -13,24 +13,10 @@ const date = format(currentDate, "MM-dd"); const directoryPath = `artifacts/${date}_LLM`; const broadcastOriginalValue = getEnv("DISABLE_TRANSACTION_BROADCAST"); -if (process.env.MOCK == "0") { - setEnv("MOCK", ""); - process.env.MOCK = ""; -} else { - setEnv("MOCK", "1"); - process.env.MOCK = "1"; -} - -if (process.env.DISABLE_TRANSACTION_BROADCAST == "0") { - setEnv("DISABLE_TRANSACTION_BROADCAST", false); -} else if (getEnv("MOCK") != "1") { - setEnv("DISABLE_TRANSACTION_BROADCAST", true); -} +setupEnvironment(); beforeAll( async () => { - setEnv("DISABLE_APP_VERSION_REQUIREMENTS", true); - const port = await launchApp(); await device.reverseTcpPort(8081); await device.reverseTcpPort(port); From 3dcbc96b82fd294eaac441fbfb5cad87413dffba Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Wed, 29 Jan 2025 15:42:25 +0100 Subject: [PATCH 6/6] test: fix receive after disabling mocked contervalues --- .../ledger-live-mobile/e2e/specs/speculos/deeplinks.spec.ts | 6 +++--- .../e2e/specs/speculos/verifyAddress/receiveFlowETH.spec.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/deeplinks.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/deeplinks.spec.ts index a28b710604c8..667296eb71c5 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/deeplinks.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/deeplinks.spec.ts @@ -7,8 +7,8 @@ const nanoApp = AppInfos.ETHEREUM; const ethereumLong = "ethereum"; const bitcoinLong = "bitcoin"; -const arbitrumLong = "arbitrum"; -const bobaLong = "boba"; +const zksync = "zksync"; +const scroll = "scroll"; $TmsLink("B2CQA-1837"); describe("DeepLinks Tests", () => { @@ -97,6 +97,6 @@ describe("DeepLinks Tests", () => { await app.portfolio.openViaDeeplink(); await app.portfolio.waitForPortfolioPageToLoad(); await app.receive.receiveViaDeeplink(ethereumLong); - await app.receive.expectSecondStepNetworks([ethereumLong, arbitrumLong, bobaLong]); + await app.receive.expectSecondStepNetworks([ethereumLong, zksync, scroll]); }); }); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/verifyAddress/receiveFlowETH.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/verifyAddress/receiveFlowETH.spec.ts index e0758d47351e..d0bba448998c 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/verifyAddress/receiveFlowETH.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/verifyAddress/receiveFlowETH.spec.ts @@ -44,7 +44,7 @@ describe("Receive Flow", () => { it("Should access to receive after importing a cryptocurrency on a selected network", async () => { await openReceive(); await app.common.performSearch("Polygon"); - await app.receive.selectAsset("POL"); + await app.receive.selectCurrency("Polygon"); await app.receive.selectNetwork("binance smart chain"); await app.receive.selectAccount("Binance Smart Chain 1"); await app.receive.doNotVerifyAddress();