From d24e26311009075b098ef2715ff0de9432b6dde2 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Ortiz karliatto Date: Tue, 1 Oct 2024 23:21:17 +0200 Subject: [PATCH] wip --- suite-native/app/.detoxrc.js | 2 +- .../app/e2e/tests/deeplinkPopup.test.ts | 118 ++++++++++++++++++ suite-native/app/package.json | 1 + yarn.lock | 3 +- 4 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 suite-native/app/e2e/tests/deeplinkPopup.test.ts diff --git a/suite-native/app/.detoxrc.js b/suite-native/app/.detoxrc.js index cf802c22fac..b40af60f23c 100644 --- a/suite-native/app/.detoxrc.js +++ b/suite-native/app/.detoxrc.js @@ -43,7 +43,7 @@ module.exports = { emulator: { type: 'android.emulator', device: { - avdName: 'Pixel_3a_API_31', + avdName: 'Pixel_6_API_33', }, }, }, diff --git a/suite-native/app/e2e/tests/deeplinkPopup.test.ts b/suite-native/app/e2e/tests/deeplinkPopup.test.ts new file mode 100644 index 00000000000..81907135c44 --- /dev/null +++ b/suite-native/app/e2e/tests/deeplinkPopup.test.ts @@ -0,0 +1,118 @@ +import { exec } from 'child_process'; +// `expect` keyword is already used by jest. +import { expect as detoxExpect } from 'detox'; + +import { TrezorUserEnvLink } from '@trezor/trezor-user-env-link'; +import TrezorConnect from '@trezor/connect-deeplink'; + +import { openApp } from '../utils'; +import { onOnboarding } from '../pageObjects/onboardingActions'; +import { onCoinEnablingInit } from '../pageObjects/coinEnablingActions'; + +const TREZOR_DEVICE_LABEL = 'Trezor T - Tester'; +// Contains only one BTC account with a single transaction to make the discovery as fast as possible. +const SIMPLE_SEED = 'immune enlist rule measure fan swarm mandate track point menu security fan'; +const platform = device.getPlatform(); + +function openUriScheme(url, platform) { + // Construct the command dynamically using double quotes + const command = `npx uri-scheme open '${url.replace(/'/g, '')}' --${platform}`; + + exec(command, (err, stdout, stderr) => { + if (err) { + console.error('Error:'); + console.error(err); + console.error(); + return; // Exit the function if there's an error + } + console.log(stdout); + console.error(stderr); + }); +} + +describe('Deeplink connect popup.', () => { + beforeAll(async () => { + if (platform === 'android') { + // Prepare Trezor device for test scenario and turn it off. + await TrezorUserEnvLink.disconnect(); + await TrezorUserEnvLink.connect(); + await TrezorUserEnvLink.startEmu({ wipe: true }); + await TrezorUserEnvLink.setupEmu({ + label: TREZOR_DEVICE_LABEL, + mnemonic: SIMPLE_SEED, + }); + await TrezorUserEnvLink.startBridge(); + await TrezorUserEnvLink.stopEmu(); + } + + await openApp({ newInstance: true }); + + await TrezorConnect.init({ + manifest: { + email: 'developer@xyz.com', + appUrl: 'http://your.application.com', + }, + deeplinkOpen: url => { + // eslint-disable-next-line no-console + console.log('deeplinkOpen', url); + openUriScheme(url, 'android'); + + // Android.openAsync({ uri: url }); + }, + deeplinkCallbackUrl: 'https://test.com/connect', + // deeplinkUrl: 'https://dev.suite.sldev.cz/connect/develop/deeplink/', + }); + }); + + afterAll(async () => { + if (platform === 'android') { + await TrezorUserEnvLink.stopEmu(); + } + await device.terminateApp(); + }); + + it('Navigate to dashboard', async () => { + await onOnboarding.finishOnboarding(); + console.log('after onboarding'); + + if (platform === 'android') { + console.log('platform is android'); + await TrezorUserEnvLink.startEmu(); + + await waitFor(element(by.id('@screen/CoinEnablingInit'))) + .toBeVisible() + .withTimeout(10000); + + console.log('before waitForBtcToBeVisible'); + await onCoinEnablingInit.waitForBtcToBeVisible(); + + console.log('before enableNetwork'); + await onCoinEnablingInit.enableNetwork('btc'); + // TODO: I don't understand why without eth the part after does not complete. + await onCoinEnablingInit.enableNetwork('eth'); + + console.log('before onCoinEnablingInit.save'); + await onCoinEnablingInit.save(); + + console.log('before waitFor skip-view-only-mode'); + await waitFor(element(by.id('skip-view-only-mode'))) + .toBeVisible() + .withTimeout(60000); // communication between connected Trezor and app takes some time. + + console.log('before skip-view-only-mode tap()'); + await element(by.id('skip-view-only-mode')).tap(); + + console.log('before @home/portfolio/graph'); + await detoxExpect(element(by.id('@home/portfolio/graph'))); // discovery finished and graph is visible + + // TODO: At this point we should be able to call a TrezorConnect from the deeplink package, + // TODO: and check that the app opens it!! + const response = await TrezorConnect.getAddress({ + path: "m/49'/0'/0'/0/0", + coin: 'btc', + }); + + console.log('response', response); + } + }); +}); diff --git a/suite-native/app/package.json b/suite-native/app/package.json index dd06171a07f..90459d39ac2 100644 --- a/suite-native/app/package.json +++ b/suite-native/app/package.json @@ -76,6 +76,7 @@ "@suite-native/toasts": "workspace:*", "@suite-native/transactions": "workspace:*", "@trezor/connect": "workspace:*", + "@trezor/connect-deeplink": "workspace:^", "@trezor/react-native-usb": "workspace:*", "@trezor/styles": "workspace:*", "@trezor/theme": "workspace:*", diff --git a/yarn.lock b/yarn.lock index 5af63a7379e..36a5ee8759c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9598,6 +9598,7 @@ __metadata: "@suite-native/toasts": "workspace:*" "@suite-native/transactions": "workspace:*" "@trezor/connect": "workspace:*" + "@trezor/connect-deeplink": "workspace:^" "@trezor/react-native-usb": "workspace:*" "@trezor/styles": "workspace:*" "@trezor/theme": "workspace:*" @@ -11235,7 +11236,7 @@ __metadata: languageName: unknown linkType: soft -"@trezor/connect-deeplink@workspace:*, @trezor/connect-deeplink@workspace:packages/connect-deeplink": +"@trezor/connect-deeplink@workspace:*, @trezor/connect-deeplink@workspace:^, @trezor/connect-deeplink@workspace:packages/connect-deeplink": version: 0.0.0-use.local resolution: "@trezor/connect-deeplink@workspace:packages/connect-deeplink" dependencies: