From d34be635f123b5141b88fb2df2c4963811af3ead Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 24 Jan 2024 11:07:34 +0100 Subject: [PATCH] chore: fix E2E tests after main stack navigator and startup saga sync (#5429) This PR depends on #5420 ## Short description This PR fixes the E2E tests, following changes from the stack navigator and startup saga sync. ## List of changes proposed in this pull request - reloadReactNative replaced with launchApp({ newInstance: true}) to prevent bad behaviours - improved a credit card test by searching for a testId instead of a text - better system keyboard closing ## How to test Run the E2E tests. --------- Co-authored-by: Fabio Bombardi <16268789+shadowsheep1@users.noreply.github.com> --- ts/__e2e__/payment.e2e.ts | 7 ++++--- ts/__e2e__/utils.ts | 10 ++++++++++ ts/components/wallet/WalletHomeHeader.tsx | 1 + ts/features/bonus/cgn/__e2e__/cgn.e2e.ts | 2 +- .../bonus/cgn/components/detail/CgnUnsubscribe.tsx | 7 +------ .../bonus/cgn/components/detail/ToastPatch.e2e.ts | 1 - ts/features/bonus/cgn/components/detail/ToastPatch.ts | 1 - .../euCovidCert/__e2e__/euCovidCertExpired.e2e.ts | 2 +- .../euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts | 2 +- .../euCovidCert/__e2e__/euCovidCertValid.e2e.ts | 2 +- ts/features/messages/__e2e__/messages.e2e.ts | 2 +- .../onboarding/__e2e__/creditCardOnboarding.e2e.ts | 10 +++++----- 12 files changed, 26 insertions(+), 21 deletions(-) delete mode 100644 ts/features/bonus/cgn/components/detail/ToastPatch.e2e.ts delete mode 100644 ts/features/bonus/cgn/components/detail/ToastPatch.ts diff --git a/ts/__e2e__/payment.e2e.ts b/ts/__e2e__/payment.e2e.ts index 2586a887670..53b6f2553ba 100644 --- a/ts/__e2e__/payment.e2e.ts +++ b/ts/__e2e__/payment.e2e.ts @@ -1,11 +1,11 @@ import I18n from "../i18n"; import { formatNumberCentsToAmount } from "../utils/stringBuilder"; import { e2eWaitRenderTimeout } from "./config"; -import { ensureLoggedIn } from "./utils"; +import { closeKeyboard, ensureLoggedIn } from "./utils"; describe("Payment", () => { beforeEach(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); @@ -106,8 +106,9 @@ describe("Payment", () => { await element(matchNoticeCodeInput).typeText("123123123123123123"); await element(by.id("EntityCodeInputMask")).typeText("12345678901"); + // Close the keyboard - await element(by.label("Fine")).atIndex(0).tap(); + await closeKeyboard(); await element(by.text(I18n.t("global.buttons.continue"))).tap(); diff --git a/ts/__e2e__/utils.ts b/ts/__e2e__/utils.ts index eeca5bb9847..ef0e68658fb 100644 --- a/ts/__e2e__/utils.ts +++ b/ts/__e2e__/utils.ts @@ -117,3 +117,13 @@ export const ensureLoggedIn = async () => { await loginWithSPID(); } }; + +export const closeKeyboard = async () => { + // Sometimes the device ignores the locale set by the detox setup + // In such case we can try to close the keyboard using the english translation + try { + await element(by.label("Fine")).atIndex(0).tap(); + } catch (e) { + await element(by.label("Done")).atIndex(0).tap(); + } +}; diff --git a/ts/components/wallet/WalletHomeHeader.tsx b/ts/components/wallet/WalletHomeHeader.tsx index f1e9c364215..4098a42100c 100644 --- a/ts/components/wallet/WalletHomeHeader.tsx +++ b/ts/components/wallet/WalletHomeHeader.tsx @@ -48,6 +48,7 @@ export const useWalletHomeHeaderBottomSheet = (): IOBottomSheetModal => { const navigationListItems: ReadonlyArray = [ { title: I18n.t("wallet.paymentMethod"), + testId: "wallet.paymentMethod", subtitle: I18n.t("wallet.paymentMethodDesc"), onPress: () => navigateToWalletAddPaymentMethod({ diff --git a/ts/features/bonus/cgn/__e2e__/cgn.e2e.ts b/ts/features/bonus/cgn/__e2e__/cgn.e2e.ts index d92b2e4167a..37d9defeadf 100644 --- a/ts/features/bonus/cgn/__e2e__/cgn.e2e.ts +++ b/ts/features/bonus/cgn/__e2e__/cgn.e2e.ts @@ -42,7 +42,7 @@ const activateBonusSuccess = async () => { describe("CGN", () => { beforeEach(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); diff --git a/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx b/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx index 9ef0c1fd4cd..ec0eebcd348 100644 --- a/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx +++ b/ts/features/bonus/cgn/components/detail/CgnUnsubscribe.tsx @@ -11,7 +11,6 @@ import { isError, isReady } from "../../../../../common/model/RemoteValue"; import { navigateBack } from "../../../../../store/actions/navigation"; import { cgnDetails } from "../../store/actions/details"; import { IOToast } from "../../../../../components/Toast"; -import { skipToastShowingDueToE2ECrash } from "./ToastPatch"; const CgnUnsubscribe = () => { const dispatch = useIODispatch(); @@ -39,11 +38,7 @@ const CgnUnsubscribe = () => { if (isReady(unsubscriptionStatus)) { navigateBack(); dispatch(cgnDetails.request()); - // This is needed to prevent a crash while running E2E tests. Showing - // the toast causes random crashes upon calling device.reloadReactNative - if (!skipToastShowingDueToE2ECrash) { - IOToast.success(I18n.t("bonus.cgn.activation.deactivate.toast")); - } + IOToast.success(I18n.t("bonus.cgn.activation.deactivate.toast")); } if (isError(unsubscriptionStatus) && !isFirstRender.current) { IOToast.error(I18n.t("global.genericError")); diff --git a/ts/features/bonus/cgn/components/detail/ToastPatch.e2e.ts b/ts/features/bonus/cgn/components/detail/ToastPatch.e2e.ts deleted file mode 100644 index cd3658899d7..00000000000 --- a/ts/features/bonus/cgn/components/detail/ToastPatch.e2e.ts +++ /dev/null @@ -1 +0,0 @@ -export const skipToastShowingDueToE2ECrash = true; diff --git a/ts/features/bonus/cgn/components/detail/ToastPatch.ts b/ts/features/bonus/cgn/components/detail/ToastPatch.ts deleted file mode 100644 index b6d723d80f9..00000000000 --- a/ts/features/bonus/cgn/components/detail/ToastPatch.ts +++ /dev/null @@ -1 +0,0 @@ -export const skipToastShowingDueToE2ECrash = false; diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts index 9237521d1ad..84b19fee096 100644 --- a/ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts +++ b/ts/features/euCovidCert/__e2e__/euCovidCertExpired.e2e.ts @@ -11,7 +11,7 @@ const learnMoreLinkTestId = "euCovidCertLearnMoreLink"; describe("EuCovidCert Expired", () => { beforeAll(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts index 4424b3d2c17..c2de8638b12 100644 --- a/ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts +++ b/ts/features/euCovidCert/__e2e__/euCovidCertRevoked.e2e.ts @@ -11,7 +11,7 @@ const learnMoreLinkTestId = "euCovidCertLearnMoreLink"; describe("EuCovidCert Revoked", () => { beforeAll(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); diff --git a/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts b/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts index 2782e192109..8f2fe2ac19b 100644 --- a/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts +++ b/ts/features/euCovidCert/__e2e__/euCovidCertValid.e2e.ts @@ -13,7 +13,7 @@ const fullScreenQrCodeTestId = "fullScreenQRCode"; describe("EuCovidCert Valid", () => { beforeAll(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); diff --git a/ts/features/messages/__e2e__/messages.e2e.ts b/ts/features/messages/__e2e__/messages.e2e.ts index 28a723b3d65..a9d2037e1b3 100644 --- a/ts/features/messages/__e2e__/messages.e2e.ts +++ b/ts/features/messages/__e2e__/messages.e2e.ts @@ -4,7 +4,7 @@ import { ensureLoggedIn } from "../../../__e2e__/utils"; describe("Messages Screen", () => { beforeEach(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); diff --git a/ts/features/wallet/onboarding/__e2e__/creditCardOnboarding.e2e.ts b/ts/features/wallet/onboarding/__e2e__/creditCardOnboarding.e2e.ts index 642a158fd29..195c5d6cffa 100644 --- a/ts/features/wallet/onboarding/__e2e__/creditCardOnboarding.e2e.ts +++ b/ts/features/wallet/onboarding/__e2e__/creditCardOnboarding.e2e.ts @@ -1,10 +1,10 @@ import { e2eWaitRenderTimeout } from "../../../../__e2e__/config"; -import { ensureLoggedIn } from "../../../../__e2e__/utils"; +import { closeKeyboard, ensureLoggedIn } from "../../../../__e2e__/utils"; import I18n from "../../../../i18n"; describe("Credit Card onboarding", () => { beforeEach(async () => { - await device.reloadReactNative(); + await device.launchApp({ newInstance: true }); await ensureLoggedIn(); }); @@ -24,12 +24,12 @@ describe("Credit Card onboarding", () => { // Button "+ Add" await element(by.id("walletAddNewPaymentMethodTestId")).tap(); - await waitFor(element(by.text(I18n.t("wallet.paymentMethod")))) + await waitFor(element(by.id("wallet.paymentMethod"))) .toBeVisible() .withTimeout(e2eWaitRenderTimeout); // Add payment method listItem in bottomSheet - await element(by.text(I18n.t("wallet.paymentMethod"))).tap(); + await element(by.id("wallet.paymentMethod")).tap(); await waitFor(element(by.text(I18n.t("wallet.methods.card.name")))) .toBeVisible() @@ -51,7 +51,7 @@ describe("Credit Card onboarding", () => { await element(by.id("securityCodeInputMask")).typeText("123"); // Close the keyboard - await element(by.label("Fine")).atIndex(0).tap(); + await closeKeyboard(); await element(by.text(I18n.t("global.buttons.continue"))).tap(); await waitFor(element(by.id("saveOrContinueButton")))