From 19bd5dd98902844e288fd8dccbeb39f2468eb807 Mon Sep 17 00:00:00 2001 From: Abdurrahman SASTIM Date: Thu, 30 Jan 2025 17:46:08 +0100 Subject: [PATCH] test: implement memo tag in send flows --- .../e2e/page/trade/send.page.ts | 32 ++++++++++++++--- .../e2e/specs/send/currencies.spec.ts | 2 +- .../e2e/specs/speculos/send/send.ts | 35 ++++++++++++------- .../e2e/specs/speculos/send/sendALGO.spec.ts | 2 +- .../sendValidAddressATOM2.spec.ts | 2 +- .../sendValidAddressXRP2.spec.ts | 2 +- .../src/families/cardano/SendRowsCustom.tsx | 8 ++++- .../CosmosFamilySendRowsCustomComponent.tsx | 8 ++++- .../src/families/hedera/SendRowsCustom.tsx | 8 ++++- .../internet_computer/SendRowMemo.tsx | 2 +- .../src/families/solana/SendRowsCustom.tsx | 8 ++++- .../src/families/stacks/SendRowMemo.tsx | 2 +- .../src/families/stellar/SendRowMemo.tsx | 2 +- .../src/families/xrp/SendRowTag.tsx | 6 +++- .../components/GenericMemoTagInput.tsx | 9 ++++- .../components/GenericMemoTagSummary.tsx | 2 +- .../MemoTag/components/MemoTagDrawer.tsx | 11 ++++-- 17 files changed, 108 insertions(+), 33 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 c026f87a0c8d..545e63c70d01 100644 --- a/apps/ledger-live-mobile/e2e/page/trade/send.page.ts +++ b/apps/ledger-live-mobile/e2e/page/trade/send.page.ts @@ -18,6 +18,8 @@ export default class SendPage { summaryAmountId = "send-summary-amount"; summaryRecipient = () => getElementById("send-summary-recipient"); summaryRecipientEns = () => getElementById("send-summary-recipient-ens"); + summaryMemoTagId = "summary-memo-tag"; + summaryMemoTag = () => getElementById(this.summaryMemoTagId); validationAmountId = "send-validation-amount"; validationAddressId = "send-validation-address"; validationEnsId = "send-validation-domain"; @@ -25,6 +27,9 @@ export default class SendPage { recipientContinueButtonId = "recipient-continue-button"; recipientInputId = "recipient-input"; recipientErrorId = "send-recipient-error"; + memoTagInputId = "memo-tag-input"; + memoTagDrawerTitleId = "memo-tag-drawer-title"; + memoTagIgnoreButtonId = "memo-tag-ignore-button"; amountInputId = "amount-input"; amountErrorId = "send-amount-error"; amountMaxSwitch = () => getElementById("send-amount-max-switch"); @@ -47,13 +52,22 @@ export default class SendPage { await expect(this.getStep1HeaderTitle()).toBeVisible(); } - async setRecipient(address: string) { + @Step("Set recipient and memo tag") + async setRecipient(address: string, memoTag?: string) { await typeTextById(this.recipientInputId, address); + if (memoTag && memoTag !== "noTag") { + await typeTextById(this.memoTagInputId, memoTag); + } } - async recipientContinue() { + @Step("Continue to next step and skip memo tag if needed") + async recipientContinue(memoTag?: string) { await waitForElementById(this.recipientContinueButtonId); // To prevent flakiness await tapById(this.recipientContinueButtonId); + if (memoTag == "noTag") { + await waitForElementById(this.memoTagDrawerTitleId); + await tapById(this.memoTagIgnoreButtonId); + } } @Step("Expect recipient error message") @@ -72,9 +86,9 @@ export default class SendPage { } @Step("Set recipient and continue") - async setRecipientAndContinue(address: string) { - await this.setRecipient(address); - await this.recipientContinue(); + async setRecipientAndContinue(address: string, memoTag?: string) { + await this.setRecipient(address, memoTag); + await this.recipientContinue(memoTag); } @Step("Set the amount and return the value") @@ -152,6 +166,14 @@ export default class SendPage { await expect(this.summaryRecipientEns()).toHaveText(ensName); } + @Step("Expect memo tag in summary") + async expectSummaryMemoTag(memoTag?: string) { + if (memoTag && memoTag !== "noTag") await expect(this.summaryMemoTag()).toHaveText(memoTag); + else if (await IsIdVisible(this.summaryMemoTagId)) { + await expect(this.summaryMemoTag()).toHaveText(""); + } + } + @Step("Dismiss high fee modal if visible") async dismissHighFeeModal() { if (await IsIdVisible(this.highFreeConfirmButtonID)) diff --git a/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts b/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts index c40f04425e4d..c8e0f414ae66 100644 --- a/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts @@ -59,7 +59,7 @@ describe("Send flow", () => { await app.common.performSearch(accountName); await app.common.selectAccount(account.id); await app.send.setRecipient(account.freshAddress); - await app.send.recipientContinue(); + await app.send.recipientContinue(account.currency.name == "Cosmos" ? "noTag" : undefined); await app.send.setAmount(amountInput); await app.send.amountContinue(); await app.send.expectSummaryAmount(amountWithCode); 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 917b453d75a6..5e07a2612008 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/send.ts @@ -40,13 +40,15 @@ export async function runSendTest(transaction: Transaction, tmsLink: string) { }); it(`Send from ${transaction.accountToDebit.accountName} to ${transaction.accountToCredit.accountName}`, async () => { + const addressToCredit = transaction.accountToCredit.address; await navigateToSendScreen(app, transaction.accountToDebit.accountName); - await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.setRecipientAndContinue(addressToCredit, transaction.memoTag); await app.send.setAmountAndContinue(transaction.amount); const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); - await app.send.expectSummaryRecipient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(addressToCredit); + await app.send.expectSummaryMemoTag(transaction.memoTag); await app.send.summaryContinue(); await app.send.dismissHighFeeModal(); @@ -59,7 +61,7 @@ export async function runSendTest(transaction: Transaction, tmsLink: string) { await app.operationDetails.waitForOperationDetails(); await app.operationDetails.checkAccount(transaction.accountToDebit.accountName); - await app.operationDetails.checkRecipient(transaction.accountToCredit.address); + await app.operationDetails.checkRecipient(addressToCredit); await app.operationDetails.checkTransactionType("OUT"); }); }); @@ -81,7 +83,7 @@ export async function runSendInvalidAddressTest( 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.setRecipient(transaction.accountToCredit.address, transaction.memoTag); await app.send.expectSendRecipientError(expectedErrorMessage); }); }); @@ -103,14 +105,15 @@ export async function runSendValidAddressTest( 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.setRecipient(transaction.accountToCredit.address, transaction.memoTag); await app.send.expectSendRecipientSuccess(expectedWarningMessage); - await app.send.recipientContinue(); + await app.send.recipientContinue(transaction.memoTag); await app.send.setAmountAndContinue(transaction.amount); const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); await app.send.expectSummaryRecipient(transaction.accountToCredit.address); + await app.send.expectSummaryMemoTag(transaction.memoTag); if (expectedWarningMessage) await app.send.expectSummaryWarning(expectedWarningMessage); }); }); @@ -131,7 +134,10 @@ export async function runSendInvalidAmountTest( 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.setRecipientAndContinue( + transaction.accountToCredit.address, + transaction.memoTag, + ); await app.send.setAmount(transaction.amount); await app.send.expectSendAmountError(expectedErrorMessage); }); @@ -152,15 +158,17 @@ export async function runSendInvalidTokenAmountTest( }); it(`Check error message for ${transaction.accountToDebit.currency.name} - invalid amount ${transaction.amount} input error`, async () => { + const addressToCredit = transaction.accountToCredit.address; await navigateToSendScreen(app, transaction.accountToDebit.currency.name); - await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.setRecipientAndContinue(addressToCredit, transaction.memoTag); 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.expectSummaryRecipient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(addressToCredit); + await app.send.expectSummaryMemoTag(transaction.memoTag); await app.send.expectSendSummaryError(expectedErrorMessage); }); }); @@ -177,14 +185,16 @@ export async function runSendMaxTest(transaction: Transaction, tmsLink: string) }); it(`Check Valid amount input (${transaction.amount}) - ${transaction.accountToCredit.accountName}`, async () => { + const addressToCredit = transaction.accountToCredit.address; await navigateToSendScreen(app, transaction.accountToDebit.accountName); - await app.send.setRecipientAndContinue(transaction.accountToCredit.address); + await app.send.setRecipientAndContinue(addressToCredit, transaction.memoTag); const amount = await app.send.setAmount("max"); await app.send.expectSendAmountSuccess(); await app.send.amountContinue(); await app.send.expectSummaryMaxAmount(amount); - await app.send.expectSummaryRecipient(transaction.accountToCredit.address); + await app.send.expectSummaryRecipient(addressToCredit); + await app.send.expectSummaryMemoTag(transaction.memoTag); }); }); } @@ -204,13 +214,14 @@ export async function runSendENSTest(transaction: Transaction, tmsLink: string) invariant(ensName, "ENS name is not provided"); await navigateToSendScreen(app, transaction.accountToDebit.accountName); - await app.send.setRecipientAndContinue(ensName); + await app.send.setRecipientAndContinue(ensName, transaction.memoTag); await app.send.setAmountAndContinue(transaction.amount); const amountWithCode = transaction.amount + " " + transaction.accountToCredit.currency.ticker; await app.send.expectSummaryAmount(amountWithCode); await app.send.expectSummaryRecipient(transaction.accountToCredit.address); await app.send.expectSummaryRecipientEns(ensName); + await app.send.expectSummaryMemoTag(transaction.memoTag); await app.send.summaryContinue(); await app.send.dismissHighFeeModal(); diff --git a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendALGO.spec.ts b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendALGO.spec.ts index 6e361e5b576d..4f5a6f32dd9a 100644 --- a/apps/ledger-live-mobile/e2e/specs/speculos/send/sendALGO.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/speculos/send/sendALGO.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.ALGO_1, Account.ALGO_2, "0.001"); +const transaction = new Transaction(Account.ALGO_1, Account.ALGO_2, "0.001", undefined, "noTag"); runSendTest(transaction, "B2CQA-2810"); 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 index f78833bf609d..7f9437ea490f 100644 --- 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 @@ -2,5 +2,5 @@ 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"); +const transaction = new Transaction(Account.ATOM_1, Account.ATOM_2, "0.0001", undefined, "noTag"); runSendValidAddressTest(transaction, "B2CQA-2721"); 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 index fa6386b42e24..a7bfb68dd119 100644 --- 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 @@ -2,5 +2,5 @@ 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"); +const transaction = new Transaction(Account.XRP_1, Account.XRP_2, "2", undefined, "noTag"); runSendValidAddressTest(transaction, "B2CQA-2719"); diff --git a/apps/ledger-live-mobile/src/families/cardano/SendRowsCustom.tsx b/apps/ledger-live-mobile/src/families/cardano/SendRowsCustom.tsx index bb96972a53dc..8159d4989ed1 100644 --- a/apps/ledger-live-mobile/src/families/cardano/SendRowsCustom.tsx +++ b/apps/ledger-live-mobile/src/families/cardano/SendRowsCustom.tsx @@ -46,7 +46,13 @@ export default function CardanoSendRowsCustom(props: Props) { {transaction.memo ? ( - + {transaction.memo} ) : ( diff --git a/apps/ledger-live-mobile/src/families/cosmos/shared/CosmosFamilySendRowsCustomComponent.tsx b/apps/ledger-live-mobile/src/families/cosmos/shared/CosmosFamilySendRowsCustomComponent.tsx index 589debc060b9..13e5e35677d2 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/shared/CosmosFamilySendRowsCustomComponent.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/shared/CosmosFamilySendRowsCustomComponent.tsx @@ -18,7 +18,13 @@ export default function CosmosFamilySendRowsCustomComponent({ transaction, editM {transaction.memo ? ( - + {transaction.memo} ) : ( diff --git a/apps/ledger-live-mobile/src/families/hedera/SendRowsCustom.tsx b/apps/ledger-live-mobile/src/families/hedera/SendRowsCustom.tsx index 01c28c006982..c13ce10dc1a3 100644 --- a/apps/ledger-live-mobile/src/families/hedera/SendRowsCustom.tsx +++ b/apps/ledger-live-mobile/src/families/hedera/SendRowsCustom.tsx @@ -43,7 +43,13 @@ export default function HederaSendRowsCustom(props: Props) { {transaction.memo ? ( - + {transaction.memo} ) : ( diff --git a/apps/ledger-live-mobile/src/families/internet_computer/SendRowMemo.tsx b/apps/ledger-live-mobile/src/families/internet_computer/SendRowMemo.tsx index 51f1d313b8e8..f9a437061ba0 100644 --- a/apps/ledger-live-mobile/src/families/internet_computer/SendRowMemo.tsx +++ b/apps/ledger-live-mobile/src/families/internet_computer/SendRowMemo.tsx @@ -55,7 +55,7 @@ export default function InternetComputerMemoRow({ account, transaction }: Props) ) : ( } onPress={editMemo}> - + {String(memo)} diff --git a/apps/ledger-live-mobile/src/families/solana/SendRowsCustom.tsx b/apps/ledger-live-mobile/src/families/solana/SendRowsCustom.tsx index 0aee514bbdc4..65228389d306 100644 --- a/apps/ledger-live-mobile/src/families/solana/SendRowsCustom.tsx +++ b/apps/ledger-live-mobile/src/families/solana/SendRowsCustom.tsx @@ -48,7 +48,13 @@ export default function SolanaSendRowsCustom({ account, transaction, navigation, {model.uiState.memo ? ( - + {model.uiState.memo} ) : ( diff --git a/apps/ledger-live-mobile/src/families/stacks/SendRowMemo.tsx b/apps/ledger-live-mobile/src/families/stacks/SendRowMemo.tsx index 5e30434eef45..cfbfbf6f8b4c 100644 --- a/apps/ledger-live-mobile/src/families/stacks/SendRowMemo.tsx +++ b/apps/ledger-live-mobile/src/families/stacks/SendRowMemo.tsx @@ -56,7 +56,7 @@ export default function StacksMemoRow({ account, transaction }: Props) { ) : ( } onPress={editMemo}> - + {String(memo)} diff --git a/apps/ledger-live-mobile/src/families/stellar/SendRowMemo.tsx b/apps/ledger-live-mobile/src/families/stellar/SendRowMemo.tsx index 1131f576901f..1fff5bd26dd7 100644 --- a/apps/ledger-live-mobile/src/families/stellar/SendRowMemo.tsx +++ b/apps/ledger-live-mobile/src/families/stellar/SendRowMemo.tsx @@ -60,7 +60,7 @@ export default function StellarMemoValueRow({ account, transaction }: Props) { title={} onPress={editMemo} > - + {String(memoValue)} diff --git a/apps/ledger-live-mobile/src/families/xrp/SendRowTag.tsx b/apps/ledger-live-mobile/src/families/xrp/SendRowTag.tsx index 92bf0f34d299..956d66b7ae28 100644 --- a/apps/ledger-live-mobile/src/families/xrp/SendRowTag.tsx +++ b/apps/ledger-live-mobile/src/families/xrp/SendRowTag.tsx @@ -40,7 +40,11 @@ export default function XrpTagRow({ account, transaction }: Props) { }> - {tag && {tag.toString()}} + {tag && ( + + {tag.toString()} + + )} ({ onChange({ value, patch }); }; - return ; + return ( + + ); } diff --git a/apps/ledger-live-mobile/src/newArch/features/MemoTag/components/GenericMemoTagSummary.tsx b/apps/ledger-live-mobile/src/newArch/features/MemoTag/components/GenericMemoTagSummary.tsx index 4421226bd12d..294827ccb4ab 100644 --- a/apps/ledger-live-mobile/src/newArch/features/MemoTag/components/GenericMemoTagSummary.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/MemoTag/components/GenericMemoTagSummary.tsx @@ -34,7 +34,7 @@ export function GenericMemoTagSummary({ } data={ - + {memoTag} { - + {t("transfer.memoTag.title")} @@ -34,7 +34,13 @@ export const MemoTagDrawer = memo(({ open, onClose, onNext }: Props) => { {t("transfer.memoTag.description")} -