diff --git a/e2e/src/fixtures/FixtureBuilder.ts b/e2e/src/fixtures/FixtureBuilder.ts index 6c53d5287..dc503111e 100644 --- a/e2e/src/fixtures/FixtureBuilder.ts +++ b/e2e/src/fixtures/FixtureBuilder.ts @@ -5,6 +5,9 @@ function getGanachePort() { return process.env.GANACHE_PORT || '8585'; } +export const DEFAULT_FIXTURE_ACCOUNT = + '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3'; + /** * FixtureBuilder class provides a fluent interface for building fixture data. */ @@ -18,79 +21,72 @@ export class FixtureBuilder { withDefaultFixture() { this.fixture = { state: { - /* legalNotices: { newPrivacyPolicyToastClickedOrClosed: true, newPrivacyPolicyToastShownDate: Date.now(), }, - - */ collectibles: { favorites: {}, }, engine: { backgroundState: { AccountTrackerController: { - accounts: { - '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3': { - balance: '0x0', - }, - }, accountsByChainId: { 64: { - '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3': { + [DEFAULT_FIXTURE_ACCOUNT]: { balance: '0x0', }, }, 1: { - '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3': { + [DEFAULT_FIXTURE_ACCOUNT]: { balance: '0x0', }, }, }, - _U: 0, - _V: 1, - _X: null, }, AddressBookController: { addressBook: {}, }, - AssetsContractController: {}, NftController: { allNftContracts: {}, allNfts: {}, ignoredNfts: [], }, TokenListController: { - tokenList: { - '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f': { - address: '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f', - symbol: 'SNX', - decimals: 18, - name: 'Synthetix Network Token', - iconUrl: - 'https://static.cx.metamask.io/api/v1/tokenIcons/1/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.png', - type: 'erc20', - aggregators: [ - 'Aave', - 'Bancor', - 'CMC', - 'Crypto.com', - 'CoinGecko', - '1inch', - 'PMM', - 'Synthetix', - 'Zerion', - 'Lifi', + tokensChainsCache: { + '0x1': { + data: [ + { + '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f': { + address: '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f', + symbol: 'SNX', + decimals: 18, + name: 'Synthetix Network Token', + iconUrl: + 'https://static.cx.metamask.io/api/v1/tokenIcons/1/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.png', + type: 'erc20', + aggregators: [ + 'Aave', + 'Bancor', + 'CMC', + 'Crypto.com', + 'CoinGecko', + '1inch', + 'PMM', + 'Synthetix', + 'Zerion', + 'Lifi', + ], + occurrences: 10, + fees: { + '0x5fd79d46eba7f351fe49bff9e87cdea6c821ef9f': 0, + '0xda4ef8520b1a57d7d63f1e249606d1a459698876': 0, + }, + }, + }, ], - occurrences: 10, - fees: { - '0x5fd79d46eba7f351fe49bff9e87cdea6c821ef9f': 0, - '0xda4ef8520b1a57d7d63f1e249606d1a459698876': 0, - }, }, }, - tokensChainsCache: {}, preventPollingOnNetworkRestart: false, }, CurrencyRateController: { @@ -108,7 +104,7 @@ export class FixtureBuilder { '{"cipher":"ynNI8tAH4fcpmXo8S88A/3T3Dd1w0LY5ftpL59gW0ObYxovgFhrtKpRe/WD7WU42KwGBNKVicB9W9at4ePgOJGS6IMWr//C3jh0vKQTabkDzDy1ZfSvztRxGpVjmrnU3fC5B0eq/MBMSrgu8Bww309pk5jghyRfzp9YsG0ONo1CXUm2brQo/eRve7i9aDbiGXiEK0ch0BO7AvZPGMhHtYRrrOro4QrDVHGUgAF5SA1LD4dv/2AB8ctHwn4YbUmICieqlhJhprx3CNOJ086g7vPQOr21T4IbvtTumFaTibfoD3GWHQo11CvE04z3cN3rRERriP7bww/tZOe8OAMFGWANkmOJHwPPwEo1NBr6w3GD2VObEmqNhXeNc6rrM23Vm1JU40Hl+lVKubnbT1vujdGLmOpDY0GdekscQQrETEQJfhKlXIT0wwyPoLwR+Ja+GjyOhBr0nfWVoVoVrcTUwAk5pStBMt+5OwDRpP29L1+BL9eMwDgKpjVXRTh4MGagKYmFc6eKDf6jV0Yt9pG+jevv5IuyhwX0TRtfQCGgRTtS7oxhDQPxGqu01rr+aI7vGMfRQpaKEEXEWVmMaqCmktyUV35evK9h/xv1Yif00XBll55ShxN8t2/PnATvZxFKQfjJe5f/monbwf8rpfXHuFoh8M9hzjbcS5eh/TPYZZu1KltpeHSIAh5C+4aFyZw0e1DeAg/wdRO3PhBrVztsHSyISHlRdfEyw7QF4Lemr++2MVR1dTxS2I5mUEHjh+hmp64euH1Vb/RUppXlmE8t1RYYXfcsF2DlRwPswP739E/EpVtY3Syf/zOTyHyrOJBldzw22sauIzt8Q5Fe5qA/hGRWiejjK31P/P5j7wEKY7vrOJB1LWNXHSuSjffx9Ai9E","iv":"d5dc0252424ac0c08ca49ef320d09569","salt":"feAPSGdL4R2MVj2urJFl4A==","lib":"original"}', keyrings: [ { - accounts: ['0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3'], + accounts: [DEFAULT_FIXTURE_ACCOUNT], index: 0, type: 'HD Key Tree', }, @@ -116,43 +112,94 @@ export class FixtureBuilder { }, NetworkController: { selectedNetworkClientId: 'mainnet', - providerConfig: { - type: 'mainnet', - chainId: '0x1', - ticker: 'ETH', - }, networksMetadata: { - goerli: { - EIPS: {}, - status: 'unknown', + mainnet: { + status: 'available', + EIPS: { + 1559: true, + }, }, - 'linea-goerli': { - EIPS: {}, - status: 'unknown', + networkId1: { + status: 'available', + EIPS: { + 1559: true, + }, }, - 'linea-sepolia': { - EIPS: {}, - status: 'unknown', + }, + networkConfigurationsByChainId: { + '0x1': { + chainId: '0x1', + rpcEndpoints: [ + { + networkClientId: 'mainnet', + url: 'https://mainnet.infura.io/v3/{infuraProjectId}', + type: 'infura', + name: 'Ethereum Network default RPC', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://etherscan.io'], + defaultBlockExplorerUrlIndex: 0, + name: 'Ethereum Main Network', + nativeCurrency: 'ETH', }, - 'linea-mainnet': { - EIPS: {}, - status: 'unknown', + '0x539': { + chainId: '0x539', + rpcEndpoints: [ + { + networkClientId: 'networkId1', + url: `http://localhost:${getGanachePort()}`, + type: 'custom', + name: 'Local RPC', + }, + ], + defaultRpcEndpointIndex: 0, + defaultBlockExplorerUrlIndex: 0, + blockExplorerUrls: ['https://test.io'], + name: 'Localhost', + nativeCurrency: 'ETH', }, - mainnet: { - EIPS: {}, - status: 'unknown', + '0xaa36a7': { + blockExplorerUrls: [], + chainId: '0xaa36a7', + defaultRpcEndpointIndex: 0, + name: 'Sepolia', + nativeCurrency: 'SepoliaETH', + rpcEndpoints: [ + { + networkClientId: 'sepolia', + type: 'infura', + url: 'https://sepolia.infura.io/v3/{infuraProjectId}', + }, + ], }, - sepolia: { - EIPS: {}, - status: 'unknown', + '0xe705': { + blockExplorerUrls: [], + chainId: '0xe705', + defaultRpcEndpointIndex: 0, + name: 'Linea Sepolia', + nativeCurrency: 'LineaETH', + rpcEndpoints: [ + { + networkClientId: 'linea-sepolia', + type: 'infura', + url: 'https://linea-sepolia.infura.io/v3/{infuraProjectId}', + }, + ], }, - }, - networkConfigurations: { - networkId1: { - rpcUrl: `http://localhost:${getGanachePort()}`, - chainId: '1337', - ticker: 'ETH', - nickname: 'Localhost', + '0xe708': { + blockExplorerUrls: [], + chainId: '0xe708', + defaultRpcEndpointIndex: 0, + name: 'Linea Main Network', + nativeCurrency: 'LineaETH', + rpcEndpoints: [ + { + networkClientId: 'linea-mainnet', + type: 'infura', + url: 'https://linea-mainnet.infura.io/v3/{infuraProjectId}', + }, + ], }, }, }, @@ -182,7 +229,7 @@ export class FixtureBuilder { internalAccounts: { accounts: { '4d7a5e0b-b261-4aed-8126-43972b0fa0a1': { - address: '0x76cf1cdd1fcc252442b50d6e97207228aa4aefc3', + address: DEFAULT_FIXTURE_ACCOUNT, id: '4d7a5e0b-b261-4aed-8126-43972b0fa0a1', metadata: { name: 'Account 1', @@ -194,98 +241,49 @@ export class FixtureBuilder { options: {}, methods: [ 'personal_sign', - 'eth_sign', 'eth_signTransaction', 'eth_signTypedData_v1', 'eth_signTypedData_v3', 'eth_signTypedData_v4', ], type: 'eip155:eoa', + scopes: ['eip155:0'], }, }, selectedAccount: '4d7a5e0b-b261-4aed-8126-43972b0fa0a1', }, }, + AccountTreeController: { + accountTree: { + wallets: {}, + }, + }, PreferencesController: { featureFlags: {}, identities: { - '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3': { - address: '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3', + [DEFAULT_FIXTURE_ACCOUNT]: { + address: DEFAULT_FIXTURE_ACCOUNT, name: 'Account 1', importTime: 1684232000456, }, }, - ipfsGateway: 'https://cloudflare-ipfs.com/ipfs/', + ipfsGateway: 'https://dweb.link/ipfs/', lostIdentities: {}, - selectedAddress: '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3', + selectedAddress: DEFAULT_FIXTURE_ACCOUNT, useTokenDetection: true, useNftDetection: true, displayNftMedia: true, useSafeChainsListValidation: false, isMultiAccountBalancesEnabled: true, - disabledRpcMethodPreferences: { - eth_sign: false, - }, showTestNetworks: true, - _U: 0, - _V: 1, - _W: { - featureFlags: {}, - frequentRpcList: [], - identities: { - '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3': { - address: '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3', - name: 'Account 1', - importTime: 1684232000456, - }, - }, - ipfsGateway: 'https://cloudflare-ipfs.com/ipfs/', - lostIdentities: {}, - selectedAddress: '0x76cf1CdD1fcC252442b50D6e97207228aA4aefC3', - useTokenDetection: true, - useNftDetection: false, - displayNftMedia: true, - useSafeChainsListValidation: false, - isMultiAccountBalancesEnabled: true, - disabledRpcMethodPreferences: { - eth_sign: false, - }, - showTestNetworks: true, - showIncomingTransactions: { - '0x1': true, - '0x5': true, - '0x38': true, - '0x61': true, - '0xa': true, - '0xa869': true, - '0x1a4': true, - '0x89': true, - '0x13881': true, - '0xa86a': true, - '0xfa': true, - '0xfa2': true, - '0xaa36a7': true, - '0xe704': true, - '0xe705': true, - '0xe708': true, - '0x504': true, - '0x507': true, - '0x505': true, - '0x64': true, - }, - }, - _X: null, }, TokenBalancesController: { - contractBalances: {}, + tokenBalances: {}, }, TokenRatesController: { marketData: {}, }, TokensController: { - tokens: [], - ignoredTokens: [], - detectedTokens: [], allTokens: {}, allIgnoredTokens: {}, allDetectedTokens: {}, @@ -293,7 +291,6 @@ export class FixtureBuilder { TransactionController: { methodData: {}, transactions: [], - internalTransactions: [], swapsTransactions: {}, }, SwapsController: { @@ -325,7 +322,6 @@ export class FixtureBuilder { approvalTransaction: null, aggregatorMetadataLastFetched: 0, quotesLastFetched: 0, - topAssetsLastFetched: 0, error: { key: null, description: null, @@ -333,7 +329,7 @@ export class FixtureBuilder { topAggId: null, tokensLastFetched: 0, isInPolling: false, - pollingCyclesLeft: 3, + pollingCyclesLeft: 4, quoteRefreshSeconds: null, usedGasEstimate: null, usedCustomGas: null, @@ -355,8 +351,6 @@ export class FixtureBuilder { gasFeeEstimatesByChainId: {}, nonRPCGasFeeApisDisabled: false, }, - TokenDetectionController: {}, - NftDetectionController: {}, PermissionController: { subjects: {}, }, @@ -365,6 +359,45 @@ export class FixtureBuilder { pendingApprovalCount: 0, approvalFlows: [], }, + UserStorageController: {}, + NotificationServicesController: { + subscriptionAccountsSeen: [], + isMetamaskNotificationsFeatureSeen: false, + isNotificationServicesEnabled: false, + isFeatureAnnouncementsEnabled: false, + metamaskNotificationsList: [], + metamaskNotificationsReadList: [], + isUpdatingMetamaskNotifications: false, + isFetchingMetamaskNotifications: false, + isUpdatingMetamaskNotificationsAccount: [], + isCheckingAccountsPresence: false, + }, + MultichainNetworkController: { + selectedMultichainNetworkChainId: + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + multichainNetworkConfigurationsByChainId: { + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': { + chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + name: 'Solana Mainnet', + nativeCurrency: + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', + isEvm: false, + }, + }, + isEvmSelected: true, + networksWithTransactionActivity: {}, + }, + MultichainAssetsController: { + accountsAssets: {}, + assetsMetadata: {}, + }, + MultichainAssetsRatesController: { + conversionRates: {}, + }, + CronJobController: { + jobs: {}, + events: {}, + }, }, }, privacy: { @@ -377,7 +410,7 @@ export class FixtureBuilder { whitelist: [], tabs: [ { - url: 'https://home.metamask.io/', + url: 'https://google.com', id: 1692550481062, }, ], @@ -392,7 +425,7 @@ export class FixtureBuilder { signMessageModalVisible: true, }, settings: { - searchEngine: 'DuckDuckGo', + searchEngine: 'Google', primaryCurrency: 'ETH', lockTime: 30000, useBlockieIcon: true, @@ -557,6 +590,8 @@ export class FixtureBuilder { selectedRegionAgg: null, selectedPaymentMethodAgg: null, getStartedAgg: false, + getStartedSell: false, + getStartedDeposit: false, authenticationUrls: [], activationKeys: [], }, @@ -582,9 +617,6 @@ export class FixtureBuilder { }, security: { allowLoginWithRememberMe: false, - automaticSecurityChecksEnabled: false, - hasUserSelectedAutomaticSecurityCheckOption: true, - isAutomaticSecurityChecksModalOpen: false, }, experimentalSettings: { securityAlertsEnabled: true, @@ -592,26 +624,14 @@ export class FixtureBuilder { inpageProvider: { networkId: '1', }, - /* WORKS BUT IT'S VERY SLOW - _persist: { - rehydrated: true, - version: -1, - }, - */ - - /* Works but slow as well (object has bo context) - _persist: { - // rehydrated: true, - // version: -1, - }, */ }, asyncState: { '@MetaMask:existingUser': 'true', + '@MetaMask:OptinMetaMetricsUISeen': 'true', '@MetaMask:onboardingWizard': 'explored', '@MetaMask:UserTermsAcceptedv1.0': 'true', '@MetaMask:WhatsNewAppVersionSeen': '7.24.3', - '@MetaMask:passcodeDisabled': true, - '@MetaMask:biometryChoiceDisabled': true, + '@MetaMask:solanaFeatureModalShown': 'true', }, }; return this; diff --git a/e2e/src/fixtures/FixtureHelper.ts b/e2e/src/fixtures/FixtureHelper.ts index 4aab06663..88c7c63da 100644 --- a/e2e/src/fixtures/FixtureHelper.ts +++ b/e2e/src/fixtures/FixtureHelper.ts @@ -1,6 +1,6 @@ import FixtureServer from '@fixtures/FixtureServer'; import { FixtureBuilder } from '@fixtures/FixtureBuilder'; -import { FIXTURE_SERVER_URL } from '@util/Constants'; +import { FIXTURE_SERVER_URL } from '@util/constants'; // checks if server has already been started const isFixtureServerStarted = async () => { diff --git a/e2e/src/fixtures/FixtureServer.ts b/e2e/src/fixtures/FixtureServer.ts index bd42a95ea..d520e7c41 100644 --- a/e2e/src/fixtures/FixtureServer.ts +++ b/e2e/src/fixtures/FixtureServer.ts @@ -1,6 +1,6 @@ import Koa from 'koa'; import * as http from "http"; -import { FIXTURE_SERVER_HOST, FIXTURE_SERVER_PORT } from '@util/Constants'; +import { FIXTURE_SERVER_HOST, FIXTURE_SERVER_PORT } from '@util/constants'; const CURRENT_STATE_KEY = '__CURRENT__'; const DEFAULT_STATE_KEY = '__DEFAULT__'; diff --git a/e2e/src/screens/Android/AndroidSettingsOpeningLinksScreen.ts b/e2e/src/screens/Android/AndroidSettingsOpeningLinksScreen.ts index 92db02795..f01d09853 100644 --- a/e2e/src/screens/Android/AndroidSettingsOpeningLinksScreen.ts +++ b/e2e/src/screens/Android/AndroidSettingsOpeningLinksScreen.ts @@ -1,8 +1,8 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { METAMASK_APP_NAME_ANDROID } from '@util/Constants'; -import Gestures from '@util/Gestures'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector } from '@util/Selectors'; +import { METAMASK_APP_NAME_ANDROID } from '@util/constants'; +import { swipeByPercentage } from '@util/gestures'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector } from '@util/selectors'; class AndroidSettingsOpeningLinksScreen { get openingLinksMetaMaskAppOption(): ChainablePromiseElement { @@ -80,7 +80,7 @@ class AndroidSettingsOpeningLinksScreen { await this.openingLinksMetaMaskAppOption.isDisplayed(); while (!isMetaMaskLinksButtonDisplayed) { - await Gestures.swipeByPercentage({ x: 50, y: 90 }, { x: 50, y: 5 }); + await swipeByPercentage({ x: 50, y: 90 }, { x: 50, y: 5 }); isMetaMaskLinksButtonDisplayed = await this.openingLinksMetaMaskAppOption.isDisplayed(); } diff --git a/e2e/src/screens/Android/AndroidSettingsScreen.ts b/e2e/src/screens/Android/AndroidSettingsScreen.ts index 969a71ba3..fd9b98405 100644 --- a/e2e/src/screens/Android/AndroidSettingsScreen.ts +++ b/e2e/src/screens/Android/AndroidSettingsScreen.ts @@ -1,13 +1,13 @@ import { ChainablePromiseArray, ChainablePromiseElement } from 'webdriverio'; import { $$ } from '@wdio/globals'; -import Gestures from '@util/Gestures'; -import { getSelectorForPlatform } from '@util/Utils'; +import { swipeByPercentage } from '@util/gestures'; +import { getSelectorForPlatform } from '@util/utils'; import { IS_RUNNING_IN_BROWSER_STACK, METAMASK_APP_NAME_ANDROID, -} from '@util/Constants'; -import { AndroidSelector } from '@util/Selectors'; +} from '@util/constants'; +import { AndroidSelector } from '@util/selectors'; class AndroidSettingsScreen { get metaMaskQALinksButton(): ChainablePromiseElement { @@ -114,7 +114,7 @@ class AndroidSettingsScreen { let isMetaMaskLinksButtonDisplayed = await this.metaMaskQALinksButton.isDisplayed(); while (!isMetaMaskLinksButtonDisplayed) { - await Gestures.swipeByPercentage({ x: 50, y: 90 }, { x: 50, y: 5 }); + await swipeByPercentage({ x: 50, y: 90 }, { x: 50, y: 5 }); isMetaMaskLinksButtonDisplayed = await this.metaMaskQALinksButton.isDisplayed(); } diff --git a/e2e/src/screens/Android/ChromeBrowserScreen.ts b/e2e/src/screens/Android/ChromeBrowserScreen.ts index e2d73dd86..76b5a3eb9 100644 --- a/e2e/src/screens/Android/ChromeBrowserScreen.ts +++ b/e2e/src/screens/Android/ChromeBrowserScreen.ts @@ -2,9 +2,9 @@ import { ChainablePromiseElement } from 'webdriverio'; import { driver } from '@wdio/globals'; import { MobileBrowser } from '@screens/interfaces/MobileBrowser'; import { Dapp } from '@screens/interfaces/Dapp'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector } from '@util/Selectors'; -import { Browsers } from '@util/Constants'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector } from '@util/selectors'; +import { Browsers } from '@util/constants'; class ChromeBrowserScreen implements MobileBrowser { get urlAddressBar(): ChainablePromiseElement { diff --git a/e2e/src/screens/Android/components/AndroidOpenWithComponent.ts b/e2e/src/screens/Android/components/AndroidOpenWithComponent.ts index 6bb898ef8..f2a7e4568 100644 --- a/e2e/src/screens/Android/components/AndroidOpenWithComponent.ts +++ b/e2e/src/screens/Android/components/AndroidOpenWithComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector } from '@util/selectors'; class AndroidOpenWithComponent { get openWithMetaMaskQA(): ChainablePromiseElement { diff --git a/e2e/src/screens/Dapps/MetaMaskSDKTestDappScreen.ts b/e2e/src/screens/Dapps/MetaMaskSDKTestDappScreen.ts index 946f8a042..d0a86dabb 100644 --- a/e2e/src/screens/Dapps/MetaMaskSDKTestDappScreen.ts +++ b/e2e/src/screens/Dapps/MetaMaskSDKTestDappScreen.ts @@ -1,12 +1,9 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { - getSelectorForPlatform, - scrollToElement, - getWebViewElementText, -} from '@util/Utils'; +import { getSelectorForPlatform, getWebViewElementText } from '@util/utils'; +import { swipeToElement } from '@util/gestures'; import { Dapp } from '@screens/interfaces/Dapp'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class MetaMaskSDKTestDappScreen implements Dapp { private connectionStatusLocator = '[data-testid="connection-status"]'; @@ -118,12 +115,12 @@ class MetaMaskSDKTestDappScreen implements Dapp { } async terminate(): Promise { - await scrollToElement(this.terminateButton); + await swipeToElement(this.terminateButton); await this.terminateButton.click(); } async tapPersonalSignButton(): Promise { - await scrollToElement(this.personalSignButton); + await swipeToElement(this.personalSignButton); await this.personalSignButton.click(); } diff --git a/e2e/src/screens/MetaMask/GetStartedScreen.ts b/e2e/src/screens/MetaMask/GetStartedScreen.ts index 5285dcd45..74c49e274 100644 --- a/e2e/src/screens/MetaMask/GetStartedScreen.ts +++ b/e2e/src/screens/MetaMask/GetStartedScreen.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class GetStartedScreen { get getStartedButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/ImportFromSeedScreen.ts b/e2e/src/screens/MetaMask/ImportFromSeedScreen.ts index 94bcf1fea..24f504c67 100644 --- a/e2e/src/screens/MetaMask/ImportFromSeedScreen.ts +++ b/e2e/src/screens/MetaMask/ImportFromSeedScreen.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class ImportFromSeedScreen { get srpInput(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/LockScreen.ts b/e2e/src/screens/MetaMask/LockScreen.ts index cb64d7bc7..e4a1bc794 100644 --- a/e2e/src/screens/MetaMask/LockScreen.ts +++ b/e2e/src/screens/MetaMask/LockScreen.ts @@ -1,8 +1,8 @@ import { ChainablePromiseElement } from 'webdriverio'; import { driver } from '@wdio/globals'; import { visibilityOf } from 'wdio-wait-for'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; import MainScreen from '@screens/MetaMask/MainScreen'; class LockScreen { @@ -39,7 +39,7 @@ class LockScreen { '//*[@resource-id="log-in-button"]/android.widget.Button', ), iosSelector: IOSSelector.by().predicateString( - 'label == "UNLOCK" AND name == "UNLOCK"', + 'label == "Unlock" AND name == "Unlock"', ), }), ); diff --git a/e2e/src/screens/MetaMask/MainScreen.ts b/e2e/src/screens/MetaMask/MainScreen.ts index a3d9e8d67..706ada4cf 100644 --- a/e2e/src/screens/MetaMask/MainScreen.ts +++ b/e2e/src/screens/MetaMask/MainScreen.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class MainScreen { get networkSwitcher(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/OptinMetricsScreen.ts b/e2e/src/screens/MetaMask/OptinMetricsScreen.ts index f8ea854e4..a92ef3952 100644 --- a/e2e/src/screens/MetaMask/OptinMetricsScreen.ts +++ b/e2e/src/screens/MetaMask/OptinMetricsScreen.ts @@ -1,8 +1,8 @@ import { ChainablePromiseElement } from 'webdriverio'; -import Gestures from '@util/Gestures'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { swipeByPercentage } from '@util/gestures'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class OptinMetricsScreen { get acceptOptinMetrics(): ChainablePromiseElement { @@ -18,7 +18,7 @@ class OptinMetricsScreen { async tapAgreeOptinMetrics(): Promise { if (!(await this.isAcceptOptinMetricsEnabled())) { - await Gestures.swipeByPercentage({ x: 50, y: 50 }, { x: 50, y: 5 }); + await swipeByPercentage({ x: 50, y: 50 }, { x: 50, y: 5 }); } await this.acceptOptinMetrics.click(); } diff --git a/e2e/src/screens/MetaMask/SecurityUpdates.ts b/e2e/src/screens/MetaMask/SecurityUpdates.ts index 82f4e8c49..c385fe654 100644 --- a/e2e/src/screens/MetaMask/SecurityUpdates.ts +++ b/e2e/src/screens/MetaMask/SecurityUpdates.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class SecurityUpdatesScreen { get noThanksSecurityUpdates(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/SettingsScreen.ts b/e2e/src/screens/MetaMask/SettingsScreen.ts index 67e0d1a9d..d2e79e630 100644 --- a/e2e/src/screens/MetaMask/SettingsScreen.ts +++ b/e2e/src/screens/MetaMask/SettingsScreen.ts @@ -1,8 +1,8 @@ import { ChainablePromiseElement } from 'webdriverio'; -import Gestures from '@util/Gestures'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { swipeByPercentage } from '@util/gestures'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class SettingsScreen { get securityAndPrivacyButton(): ChainablePromiseElement { @@ -109,8 +109,8 @@ class SettingsScreen { let isDisplayed = await this.manageConnectionsButton.isDisplayed(); while (!isDisplayed) { // Swipe down twice - await Gestures.swipeByPercentage({ x: 50, y: 90 }, { x: 50, y: 5 }); - await Gestures.swipeByPercentage({ x: 50, y: 60 }, { x: 50, y: 5 }); + await swipeByPercentage({ x: 50, y: 90 }, { x: 50, y: 5 }); + await swipeByPercentage({ x: 50, y: 60 }, { x: 50, y: 5 }); isDisplayed = await this.manageConnectionsButton.isDisplayed(); } await this.tapManageConnections(); diff --git a/e2e/src/screens/MetaMask/TermsOfUseScreen.ts b/e2e/src/screens/MetaMask/TermsOfUseScreen.ts index 88c4430cd..7dd901b80 100644 --- a/e2e/src/screens/MetaMask/TermsOfUseScreen.ts +++ b/e2e/src/screens/MetaMask/TermsOfUseScreen.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class TermsOfUseScreen { get acceptTermsOfUseCheckbox(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/WalletReadyScreen.ts b/e2e/src/screens/MetaMask/WalletReadyScreen.ts index 5b28f3d53..b4263572e 100644 --- a/e2e/src/screens/MetaMask/WalletReadyScreen.ts +++ b/e2e/src/screens/MetaMask/WalletReadyScreen.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class WalletReadyScreen { get doneButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/WalletSetupScreen.ts b/e2e/src/screens/MetaMask/WalletSetupScreen.ts index 9570b4ae4..74facee1e 100644 --- a/e2e/src/screens/MetaMask/WalletSetupScreen.ts +++ b/e2e/src/screens/MetaMask/WalletSetupScreen.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class WalletSetupScreen { get importWithSRP(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/BottomNavigationComponent.ts b/e2e/src/screens/MetaMask/components/BottomNavigationComponent.ts index 0e108c295..0ddae7902 100644 --- a/e2e/src/screens/MetaMask/components/BottomNavigationComponent.ts +++ b/e2e/src/screens/MetaMask/components/BottomNavigationComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class BottomNavigationComponent { get settingsButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/ConnectModalComponent.ts b/e2e/src/screens/MetaMask/components/ConnectModalComponent.ts index 26e5ef60d..5fb25edb3 100644 --- a/e2e/src/screens/MetaMask/components/ConnectModalComponent.ts +++ b/e2e/src/screens/MetaMask/components/ConnectModalComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class ConnectModalComponent { get accountApprovalModalContainer(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/EnableSmartTransactionsComponent.ts b/e2e/src/screens/MetaMask/components/EnableSmartTransactionsComponent.ts index e2b2dbdfb..881671fde 100644 --- a/e2e/src/screens/MetaMask/components/EnableSmartTransactionsComponent.ts +++ b/e2e/src/screens/MetaMask/components/EnableSmartTransactionsComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class EnableSmartTransactionsComponent { private get enableSmartTransactions(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/MetaMetricsComponent.ts b/e2e/src/screens/MetaMask/components/MetaMetricsComponent.ts index 42a4579b8..3c5a953e4 100644 --- a/e2e/src/screens/MetaMask/components/MetaMetricsComponent.ts +++ b/e2e/src/screens/MetaMask/components/MetaMetricsComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class MetaMetricsComponent { get agreeToMetaMetrics(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/NetworkSwitchedModalComponent.ts b/e2e/src/screens/MetaMask/components/NetworkSwitchedModalComponent.ts index 103ef23d3..43d0fa403 100644 --- a/e2e/src/screens/MetaMask/components/NetworkSwitchedModalComponent.ts +++ b/e2e/src/screens/MetaMask/components/NetworkSwitchedModalComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class NetworkSwitchedModalComponent { get gotItButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/PersonalSignConfirmationComponent.ts b/e2e/src/screens/MetaMask/components/PersonalSignConfirmationComponent.ts index 41c1bfbb2..4028fc8b2 100644 --- a/e2e/src/screens/MetaMask/components/PersonalSignConfirmationComponent.ts +++ b/e2e/src/screens/MetaMask/components/PersonalSignConfirmationComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; import { visibilityOf } from 'wdio-wait-for'; class PersonalSignConfirmationComponent { diff --git a/e2e/src/screens/MetaMask/components/SendTxModalComponent.ts b/e2e/src/screens/MetaMask/components/SendTxModalComponent.ts index 628cb330d..e6053d261 100644 --- a/e2e/src/screens/MetaMask/components/SendTxModalComponent.ts +++ b/e2e/src/screens/MetaMask/components/SendTxModalComponent.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class SendTxModalComponent { get confirmButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/SignModalComponent.ts b/e2e/src/screens/MetaMask/components/SignModalComponent.ts index 7a1e84ae5..dd9585c79 100644 --- a/e2e/src/screens/MetaMask/components/SignModalComponent.ts +++ b/e2e/src/screens/MetaMask/components/SignModalComponent.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class SignModalComponent { get signApprovalButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/SwitchNetworkModalComponent.ts b/e2e/src/screens/MetaMask/components/SwitchNetworkModalComponent.ts index 72f10ce61..d2fed361b 100644 --- a/e2e/src/screens/MetaMask/components/SwitchNetworkModalComponent.ts +++ b/e2e/src/screens/MetaMask/components/SwitchNetworkModalComponent.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class SwitchNetworkModalComponent { get switchNetworkButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/WelcomeComponent.ts b/e2e/src/screens/MetaMask/components/WelcomeComponent.ts index 7f64db911..341ba747c 100644 --- a/e2e/src/screens/MetaMask/components/WelcomeComponent.ts +++ b/e2e/src/screens/MetaMask/components/WelcomeComponent.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class WelcomeComponent { get noThanksButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/MetaMask/components/WhatsNewComponent.ts b/e2e/src/screens/MetaMask/components/WhatsNewComponent.ts index 1ebc56bd7..dde47bc17 100644 --- a/e2e/src/screens/MetaMask/components/WhatsNewComponent.ts +++ b/e2e/src/screens/MetaMask/components/WhatsNewComponent.ts @@ -1,6 +1,6 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { getSelectorForPlatform } from '@util/Utils'; -import { AndroidSelector, IOSSelector } from '@util/Selectors'; +import { getSelectorForPlatform } from '@util/utils'; +import { AndroidSelector, IOSSelector } from '@util/selectors'; class WhatsNewComponent { get closeModalButton(): ChainablePromiseElement { diff --git a/e2e/src/screens/iOS/SafariBrowserScreen.ts b/e2e/src/screens/iOS/SafariBrowserScreen.ts index 6688fcd2b..dba1b60b6 100644 --- a/e2e/src/screens/iOS/SafariBrowserScreen.ts +++ b/e2e/src/screens/iOS/SafariBrowserScreen.ts @@ -1,10 +1,10 @@ import { ChainablePromiseElement } from 'webdriverio'; import { driver } from '@wdio/globals'; -import { getSelectorForPlatform } from '@util/Utils'; +import { getSelectorForPlatform } from '@util/utils'; import { MobileBrowser } from '@screens/interfaces/MobileBrowser'; -import { IOSSelector } from '@util/Selectors'; -import { Browsers } from '@util/Constants'; +import { IOSSelector } from '@util/selectors'; +import { Browsers } from '@util/constants'; import { Dapp } from '@screens/interfaces/Dapp'; class SafariBrowserScreen implements MobileBrowser { diff --git a/e2e/src/screens/iOS/components/IOSOpenInComponent.ts b/e2e/src/screens/iOS/components/IOSOpenInComponent.ts index e1be80df1..b2700b5e7 100644 --- a/e2e/src/screens/iOS/components/IOSOpenInComponent.ts +++ b/e2e/src/screens/iOS/components/IOSOpenInComponent.ts @@ -1,7 +1,7 @@ import { ChainablePromiseElement } from 'webdriverio'; -import { IOSSelector } from '@util/Selectors'; -import { getSelectorForPlatform } from '@util/Utils'; +import { IOSSelector } from '@util/selectors'; +import { getSelectorForPlatform } from '@util/utils'; class IOSOpenInComponent { get open(): ChainablePromiseElement { diff --git a/e2e/src/util/Gestures.ts b/e2e/src/util/Gestures.ts deleted file mode 100644 index 82f21b831..000000000 --- a/e2e/src/util/Gestures.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { - getCoordinatesAsPercentage, - getCoordinatesForDeviceFromPercentage, -} from './Utils'; -import { ScreenPercentage } from './types'; - -const Actions = { - LONG_PRESS: 'longPress', - MOVE_TO: 'moveTo', - RELEASE: 'release', - WAIT: 'wait', - TAP: 'tap', - DOUBLE_TAP: 'doubleTap', - KEY_DOWN: 'keyDown', - KEY_UP: 'keyUp', - PAUSE: 'pause', - PRESS: 'press', - POINTER_MOVE: 'pointerMove', - POINTER_DOWN: 'pointerDown', - POINTER_UP: 'pointerUp', -}; - -const ActionTypes = { - POINTER: 'pointer', - KEY: 'key', -}; - -const ActionSource = { - KEYBOARD: 'keyboard', - FINDER_1: 'finger1', -}; - -export default class Gestures { - static async swipeByPercentage(from: ScreenPercentage, to: ScreenPercentage) { - if (driver.isIOS) { - await this.swipeIOSByPercentage(from, to); - } else { - await this.swipeAndroidByPercentage(from, to); - } - } - - // Currently broken with the latest XCUITest - static async swipeIOSByPercentage( - from: ScreenPercentage, - to: ScreenPercentage, - ): Promise { - const fromPercentage = await getCoordinatesForDeviceFromPercentage(from); - const toPercentage = await getCoordinatesForDeviceFromPercentage(to); - - await driver - .action('pointer', { parameters: { pointerType: 'touch' } }) - .move({ x: fromPercentage.x, y: fromPercentage.y }) - .down() - .move({ x: toPercentage.x, y: toPercentage.y }) - .up() - .perform(); - } - - static async swipeAndroidByPercentage( - from: ScreenPercentage, - to: ScreenPercentage, - ): Promise { - const [fromPercentage, toPercentage] = await getCoordinatesAsPercentage( - from, - to, - ); - - await driver.performActions([ - { - type: ActionTypes.POINTER, - id: ActionSource.FINDER_1, - actions: [ - { type: 'pause', duration: 1000 }, - { - type: Actions.POINTER_MOVE, - duration: 0, - x: fromPercentage.x, - y: fromPercentage.y, - }, - { type: Actions.POINTER_DOWN, button: 0 }, - { type: Actions.PAUSE, duration: 100 }, - { - type: Actions.POINTER_MOVE, - duration: 1000, - x: toPercentage.x, - y: toPercentage.y, - }, - { type: Actions.POINTER_UP, button: 0 }, - ], - }, - ]); - } - - static async tapDeviceKey(key: string): Promise { - await driver.performActions([ - { - type: ActionTypes.KEY, - id: ActionSource.KEYBOARD, - actions: [ - { type: Actions.KEY_DOWN, value: key }, - { type: Actions.PAUSE, duration: 100 }, - { type: Actions.KEY_UP, value: key }, - ], - }, - ]); - } - - static async hideKeyboardWithTap(): Promise { - await Gestures.tapOnCoordinatesByPercentage({ x: 1, y: 40 }); - } - - static async tapOnCoordinatesByPercentage( - location: ScreenPercentage, - ): Promise { - const tapLocation = await getCoordinatesForDeviceFromPercentage({ - x: location.x, - y: location.y, - }); - - // TODO: use this for BrowserStack - await driver.touchAction([ - { - action: 'tap', - x: tapLocation.x, - y: tapLocation.y, - }, - ]); - - // try { - // await driver - // .action('pointer', { parameters: { pointerType: 'touch' } }) - // .move({ x: tapLocation.x, y: tapLocation.y }) - // .down() - // .pause(100) - // .up() - // .perform(); - // } catch (error) { - // log.error(`Error tapping on coordinates: ${location.x}, ${location.y}`); - // log.error(error); - // } - } -} diff --git a/e2e/src/util/Constants.ts b/e2e/src/util/constants.ts similarity index 79% rename from e2e/src/util/Constants.ts rename to e2e/src/util/constants.ts index ebd83aebe..2483e7bd8 100644 --- a/e2e/src/util/Constants.ts +++ b/e2e/src/util/constants.ts @@ -1,3 +1,29 @@ +export const Actions = { + LONG_PRESS: 'longPress', + MOVE_TO: 'moveTo', + RELEASE: 'release', + WAIT: 'wait', + TAP: 'tap', + DOUBLE_TAP: 'doubleTap', + KEY_DOWN: 'keyDown', + KEY_UP: 'keyUp', + PAUSE: 'pause', + PRESS: 'press', + POINTER_MOVE: 'pointerMove', + POINTER_DOWN: 'pointerDown', + POINTER_UP: 'pointerUp', +}; + +export const ActionTypes = { + POINTER: 'pointer', + KEY: 'key', +}; + +export const ActionSource = { + KEYBOARD: 'keyboard', + FINDER_1: 'finger1', +}; + export const WALLET_PASSWORD = (process.env.WALLET_PASSWORD as string) || '123123123'; diff --git a/e2e/src/util/gestures.ts b/e2e/src/util/gestures.ts new file mode 100644 index 000000000..4c856aa59 --- /dev/null +++ b/e2e/src/util/gestures.ts @@ -0,0 +1,112 @@ +import { ChainablePromiseElement } from 'webdriverio'; + +import { driver } from '@wdio/globals'; + +import { getDeviceCoordinates } from './utils'; +import { ScreenPercentage, Coordinates } from './types'; +import { Actions, ActionTypes, ActionSource } from './constants'; + +// Currently broken with the latest XCUITest +const swipeIOSByPercentage = async ( + from: ScreenPercentage, + to: ScreenPercentage, +): Promise => { + const fromPercentage = (await getDeviceCoordinates(from)) as Coordinates; + const toPercentage = (await getDeviceCoordinates(to)) as Coordinates; + + await driver + .action('pointer', { parameters: { pointerType: 'touch' } }) + .move({ x: fromPercentage.x, y: fromPercentage.y }) + .down() + .move({ x: toPercentage.x, y: toPercentage.y }) + .up() + .perform(); +}; + +const swipeAndroidByPercentage = async ( + from: ScreenPercentage, + to: ScreenPercentage, +): Promise => { + const [fromPercentage, toPercentage] = (await getDeviceCoordinates({ + from, + to, + })) as [Coordinates, Coordinates]; + + await driver.performActions([ + { + type: ActionTypes.POINTER, + id: ActionSource.FINDER_1, + actions: [ + { type: 'pause', duration: 1000 }, + { + type: Actions.POINTER_MOVE, + duration: 0, + x: fromPercentage.x, + y: fromPercentage.y, + }, + { type: Actions.POINTER_DOWN, button: 0 }, + { type: Actions.PAUSE, duration: 100 }, + { + type: Actions.POINTER_MOVE, + duration: 1000, + x: toPercentage.x, + y: toPercentage.y, + }, + { type: Actions.POINTER_UP, button: 0 }, + ], + }, + ]); +}; + +export const swipeByPercentage = async ( + from: ScreenPercentage, + to: ScreenPercentage, +) => { + if (driver.isIOS) { + await swipeIOSByPercentage(from, to); + } else { + await swipeAndroidByPercentage(from, to); + } +}; + +export const tapDeviceKey = async (key: string): Promise => { + await driver.performActions([ + { + type: ActionTypes.KEY, + id: ActionSource.KEYBOARD, + actions: [ + { type: Actions.KEY_DOWN, value: key }, + { type: Actions.PAUSE, duration: 100 }, + { type: Actions.KEY_UP, value: key }, + ], + }, + ]); +}; + +export const tapOnCoordinatesByPercentage = async ( + location: ScreenPercentage, +): Promise => { + const tapLocation = (await getDeviceCoordinates(location)) as Coordinates; + + // TODO: use this for BrowserStack + await driver.touchAction([ + { + action: 'tap', + x: tapLocation.x, + y: tapLocation.y, + }, + ]); +}; + +export const hideKeyboardWithTap = async (): Promise => { + await tapOnCoordinatesByPercentage({ x: 1, y: 40 }); +}; + +export const swipeToElement = async (element: ChainablePromiseElement) => { + let isElementDisplayed = await element.isDisplayed(); + + while (!isElementDisplayed) { + await swipeByPercentage({ x: 50, y: 70 }, { x: 50, y: 5 }); + isElementDisplayed = await element.isDisplayed(); + } +}; diff --git a/e2e/src/util/helpers.ts b/e2e/src/util/helpers.ts deleted file mode 100644 index 61dda052c..000000000 --- a/e2e/src/util/helpers.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * @deprecated until CI workflow is done - * Dynamically infers the path of the other apps to be installed on the device - * based on the SDK_TYPE environment variable - */ -export const getOtherAppsPath = () => { - const SDK_TYPE = process.env.SDK_TYPE as string; - - const otherAppsPaths = []; - switch (SDK_TYPE) { - case 'js': - otherAppsPaths.push(process.env.RN_TEST_APP_PATH ?? ''); - break; - case 'androidsdk': - otherAppsPaths.push(process.env.ANDROID_SDK_TEST_APP_PATH ?? ''); - break; - default: - break; - } - return otherAppsPaths; -}; diff --git a/e2e/src/util/Selectors.ts b/e2e/src/util/selectors.ts similarity index 98% rename from e2e/src/util/Selectors.ts rename to e2e/src/util/selectors.ts index aab8c2835..e637584ef 100644 --- a/e2e/src/util/Selectors.ts +++ b/e2e/src/util/selectors.ts @@ -5,9 +5,10 @@ import { WDIO_IOS_PREDICATE_STRING, WDIO_RESOURCE_ID, WDIO_XPATH, -} from './Constants'; +} from './constants'; class WDIOSelector { + // '#myId' /* * Returns the locator for the given accessibilityId * @param accessibilityId: string diff --git a/e2e/src/util/Utils.ts b/e2e/src/util/utils.ts similarity index 68% rename from e2e/src/util/Utils.ts rename to e2e/src/util/utils.ts index f07ad22d9..d7f5b8e48 100644 --- a/e2e/src/util/Utils.ts +++ b/e2e/src/util/utils.ts @@ -2,10 +2,8 @@ import ADB from 'appium-adb'; import { driver } from '@wdio/globals'; import LockScreen from '@screens/MetaMask/LockScreen'; import { Dapp } from '@screens/interfaces/Dapp'; -import SafariBrowserScreen from '@screens/iOS/SafariBrowserScreen'; -import ChromeBrowserScreen from '@screens/Android/ChromeBrowserScreen'; -import AndroidOpenWithComponent from '@screens/Android/components/AndroidOpenWithComponent'; -import iOSOpenInComponent from '@screens/iOS/components/IOSOpenInComponent'; +import safariBrowserScreen from '@screens/iOS/SafariBrowserScreen'; +import chromeBrowserScreen from '@screens/Android/ChromeBrowserScreen'; import { loadFixture, startFixtureServer } from '@fixtures/FixtureHelper'; import { FixtureBuilder } from '@fixtures/FixtureBuilder'; import FixtureServer from '@fixtures/FixtureServer'; @@ -24,17 +22,14 @@ import { WALLET_PASSWORD, Browsers, Contexts, -} from './Constants'; -import Gestures from './Gestures'; - -export const deviceOpenDeeplinkWithMetaMask = async () => { - if (PLATFORM === Platforms.IOS) { - await iOSOpenInComponent.tapOpen(); - } else { - await AndroidOpenWithComponent.tapOpenWithMetaMask(); - } -}; +} from './constants'; +import { tapOnCoordinatesByPercentage } from './gestures'; +/** + * Returns the selector for the given platform + * @param locator - The locator to get the selector for + * @returns The selector for the given platform + */ export const getSelectorForPlatform = (locator: MetaMaskElementSelector) => { const platformSelector = PLATFORM === Platforms.IOS ? locator.iosSelector : locator.androidSelector; @@ -45,6 +40,10 @@ export const getSelectorForPlatform = (locator: MetaMaskElementSelector) => { return platformSelector; }; +/** + * Launches the mobile browser for the given platform + * @returns void + */ export const launchMobileBrowser = async () => { if (driver.isIOS) { await driver.activateApp(Browsers.SAFARI); @@ -53,41 +52,51 @@ export const launchMobileBrowser = async () => { } }; +/** + * Restarts the MetaMask app and unlocks it with the given password + * @returns void + */ export const restartAndUnlockMetaMask = async () => { await driver.terminateApp(METAMASK_BUNDLE_ID); await driver.activateApp(METAMASK_BUNDLE_ID); await LockScreen.unlockMMifLocked(WALLET_PASSWORD); }; +/** + * Navigates to the given web mobile dapp + * @param dappUrl - The URL of the dapp to navigate to + * @param dappScreen - The screen of the dapp to navigate to + * @returns void + */ export const navigateToWebMobileDapp = async ( dappUrl: string, dappScreen: Dapp, ) => { const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; + ? safariBrowserScreen + : chromeBrowserScreen; // await launchMobileBrowser(); await browserScreen.goToAddress(dappUrl, dappScreen); }; +/** + * Refreshes the browser + * @returns void + */ export const refreshBrowser = async () => { const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; + ? safariBrowserScreen + : chromeBrowserScreen; await browserScreen.refreshPage(); }; -export const scrollToElement = async (element: ChainablePromiseElement) => { - let isElementDisplayed = await element.isDisplayed(); - - while (!isElementDisplayed) { - await Gestures.swipeByPercentage({ x: 50, y: 70 }, { x: 50, y: 5 }); - isElementDisplayed = await element.isDisplayed(); - } -}; - +/** + * Launches the app with the given bundleId + * @param bundleId - The bundleId of the app to launch + * @returns void + */ export const launchApp = async (bundleId: string) => { // Location can be either url for web test dapp or bundleId for native app console.log(`Launching ${PLATFORM} DAPP with bundleId: ${bundleId}`); @@ -98,75 +107,98 @@ export const launchApp = async (bundleId: string) => { } }; +/** + * Launches the MetaMask app + * @returns void + */ export const launchMetaMask = async () => { console.log(`Launching MetaMask on ${PLATFORM}`); await driver.activateApp(METAMASK_BUNDLE_ID); }; +/** + * Goes back to the previous screen + * @returns void + */ export const goBack = async () => { const browserToOpen = driver.isIOS ? Browsers.SAFARI : Browsers.CHROME; await driver.pause(2500); - await Gestures.tapOnCoordinatesByPercentage({ x: 50, y: 80 }); + await tapOnCoordinatesByPercentage({ x: 50, y: 80 }); await driver.pause(500); await launchApp(browserToOpen); }; -/* +/** * Kills the process of the dapp with the given bundleId * Not the same as the dappTerminate that cleans a session - * */ + * @param bundleId - The bundleId of the app to kill + * @returns void + */ export const killApp = async (bundleId: string) => { console.log(`Terminating ${PLATFORM} DAPP with bundleId: ${bundleId}`); await driver.terminateApp(bundleId); }; +/** + * Returns the screen size of the device + * @returns The screen size of the device + */ export const getScreenSize = async (): Promise => { return await driver.getWindowSize(); }; -/* - * Returns the coordinates in the device screen for a given percentage - * Ex: - * x = 50% of the screen width - * y = 50% of the screen height - * Device size: 1000x1000 +/** + * Converts screen percentage coordinates to actual device coordinates + * + * @param percentages - Single percentage point or from/to percentage points for swipe + * @returns Single coordinate or array of coordinates based on input * - * returns: {x: 5000, y: 5000} - * */ -export const getCoordinatesForDeviceFromPercentage = async ( - percentage: ScreenPercentage, -): Promise => { + * Examples: + * 1. Single point: + * Input: {x: 50, y: 50} + * Output: {x: 500, y: 500} (on a 1000x1000 device) + * + * 2. Two points (swipe): + * Input: from: {x: 20, y: 80}, to: {x: 80, y: 20} + * Output: [{x: 200, y: 800}, {x: 800, y: 200}] (on a 1000x1000 device) + */ +export const getDeviceCoordinates = async ( + percentages: ScreenPercentage | { from: Coordinates; to: Coordinates }, +): Promise => { const DEVICE_SIZE = await getScreenSize(); - const x = Math.round((DEVICE_SIZE.width * percentage.x) / 100); - const y = Math.round((DEVICE_SIZE.height * percentage.y) / 100); - return { x, y }; -}; -export const getCoordinatesAsPercentage = async ( - from: Coordinates, - to: Coordinates, -): Promise<[Coordinates, Coordinates]> => { - const DEVICE_SIZE = await getScreenSize(); - const x1Percentage = Math.round((DEVICE_SIZE.width * from.x) / 100); - const y1Percentage = Math.round((DEVICE_SIZE.height * from.y) / 100); - const x2Percentage = Math.round((DEVICE_SIZE.width * to.x) / 100); - const y2Percentage = Math.round((DEVICE_SIZE.height * to.y) / 100); - return [ - { x: x1Percentage, y: y1Percentage }, - { x: x2Percentage, y: y2Percentage }, - ]; + // Handle single point case + if ('x' in percentages && 'y' in percentages) { + const x = Math.round((DEVICE_SIZE.width * percentages.x) / 100); + const y = Math.round((DEVICE_SIZE.height * percentages.y) / 100); + return { x, y }; + } + // Handle from/to case (swipe) + else if ('from' in percentages && 'to' in percentages) { + const { from, to } = percentages; + const x1 = Math.round((DEVICE_SIZE.width * from.x) / 100); + const y1 = Math.round((DEVICE_SIZE.height * from.y) / 100); + const x2 = Math.round((DEVICE_SIZE.width * to.x) / 100); + const y2 = Math.round((DEVICE_SIZE.height * to.y) / 100); + return [ + { x: x1, y: y1 }, + { x: x2, y: y2 }, + ]; + } + + throw new Error('Invalid input format for coordinate conversion'); }; -/* - * WIP! This function is not working as expected +/** * Launches MetaMask with a fixture * This means that MM will load in a fully onboarded state * * Disclaimer: iOS does not support launching with a fixture for the time being - * - * @param {FixtureServer} fixtureServer - server fixture running in the background - * */ + * @param fixtureServer - server fixture running in the background + * @param bundleId - The bundleId of the app to launch + * @returns void + */ export const launchMetaMaskWithFixture = async ( fixtureServer: FixtureServer, bundleId: string, @@ -200,11 +232,14 @@ export const launchMetaMaskWithFixture = async ( }, ]); - // {"bundleId": "io.metamask.MetaMask-QA", "arguments": ["fixtureServerPort", "12345"], "environment": {"fixtureServerPort": "12345"}} - console.log('MetaMask was loaded with fixtures!'); }; +/** + * Returns the text of the given webview element + * @param locator - The locator of the webview element + * @returns The text of the given webview element + */ export const getWebViewElementText = async (locator: string) => { const webviewElementText = await driver.executeScript( `const element = document.querySelector('${locator}'); @@ -214,6 +249,10 @@ export const getWebViewElementText = async (locator: string) => { return webviewElementText; }; +/** + * Switches to the native context + * @returns void + */ export const switchToNativeContext = async () => { const availableContexts = await driver.getContexts(); const nativeContext = availableContexts.find( @@ -232,6 +271,11 @@ export const switchToNativeContext = async () => { } }; +/** + * Switches to the webview context + * @param dappUrl - The URL of the dapp to switch context to + * @returns void + */ export const switchToWebviewContext = async (dappUrl: string) => { const availableContexts = await driver.getContexts(); const webviewContext = availableContexts.find((context) => { @@ -258,6 +302,12 @@ export const switchToWebviewContext = async (dappUrl: string) => { } }; +/** + * Switches to the given context + * @param context - The context to switch to + * @param dappUrl - The URL of the dapp to switch context to + * @returns void + */ export const switchToContext = async ({ context, dappUrl, diff --git a/e2e/test/ViewHelpers.ts b/e2e/test/ViewHelpers.ts new file mode 100644 index 000000000..fd1c37804 --- /dev/null +++ b/e2e/test/ViewHelpers.ts @@ -0,0 +1,31 @@ +import androidOpenWithComponent from '@screens/Android/components/AndroidOpenWithComponent'; +import iOSOpenInComponent from '@screens/iOS/components/IOSOpenInComponent'; +import bottomNavigationComponent from '@screens/MetaMask/components/BottomNavigationComponent'; +import settingsScreen from '@screens/MetaMask/SettingsScreen'; +import { PLATFORM, Platforms } from '@util/constants'; + +/** + * Clears all connections from the MetaMask app + * @returns void + */ +export const clearAllConnections = async () => { + try { + await bottomNavigationComponent.tapSettingsButton(); + await settingsScreen.clearAllConnections(); + await bottomNavigationComponent.tapHomeButton(); + } catch (e) { + console.log('No Connections to clear', e.message); + } +}; + +/** + * Opens the MetaMask app with the given platform + * @returns void + */ +export const deviceOpenDeeplinkWithMetaMask = async () => { + if (PLATFORM === Platforms.IOS) { + await iOSOpenInComponent.tapOpen(); + } else { + await androidOpenWithComponent.tapOpenWithMetaMask(); + } +}; diff --git a/e2e/test/configs/wdio.conf.ts b/e2e/test/configs/wdio.conf.ts index e60ddab26..f3d8ff596 100644 --- a/e2e/test/configs/wdio.conf.ts +++ b/e2e/test/configs/wdio.conf.ts @@ -23,6 +23,7 @@ moduleAlias.addAliases({ '@util': resolve(__dirname, '../../src/util'), '@screens': resolve(__dirname, '../../src/screens'), '@specs': resolve(__dirname, '../../test/specs'), + '@test': resolve(__dirname, '../../test'), }); export const config: Options.Testrunner = { diff --git a/e2e/test/mocha.hooks.ts b/e2e/test/mocha.hooks.ts deleted file mode 100644 index 12366491b..000000000 --- a/e2e/test/mocha.hooks.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { driver } from '@wdio/globals'; -import { killApp, launchApp, launchMetaMask } from '@util/Utils'; -import LockScreen from '@screens/MetaMask/LockScreen'; -import { NATIVE_OS_APPS, WALLET_PASSWORD, SRP } from '@util/Constants'; -import BottomNavigationComponent from '@screens/MetaMask/components/BottomNavigationComponent'; -import SettingsScreen from '@screens/MetaMask/SettingsScreen'; -import GetStartedScreen from '@screens/MetaMask/GetStartedScreen'; -import WalletSetupScreen from '@screens/MetaMask/WalletSetupScreen'; -import OptinMetricsScreen from '@screens/MetaMask/OptinMetricsScreen'; -import TermsOfUseScreen from '@screens/MetaMask/TermsOfUseScreen'; -import ImportFromSeedScreen from '@screens/MetaMask/ImportFromSeedScreen'; -import Gestures from '@util/Gestures'; -import SecurityUpdatesScreen from '@screens/MetaMask/SecurityUpdates'; -import WelcomeComponent from '@screens/MetaMask/components/WelcomeComponent'; -import MetaMetricsComponent from '@screens/MetaMask/components/MetaMetricsComponent'; -import AndroidSettingsScreen from '@screens/Android/AndroidSettingsScreen'; -import AndroidSettingsOpeningLinksScreen from '@screens/Android/AndroidSettingsOpeningLinksScreen'; -import WalletReadyScreen from '@screens/MetaMask/WalletReadyScreen'; -import EnableSmartTransactionsComponent from '@screens/MetaMask/components/EnableSmartTransactionsComponent'; - -const goToSettingsAndClearAllConnections = async () => { - try { - await BottomNavigationComponent.tapSettingsButton(); - await SettingsScreen.clearAllConnections(); - await BottomNavigationComponent.tapHomeButton(); - } catch (e) { - console.log('No Connections to clear', e.message); - } -}; - -const setAndroidDefaultLinks = async () => { - await killApp(NATIVE_OS_APPS.ANDROID.SETTINGS); - await launchApp(NATIVE_OS_APPS.ANDROID.SETTINGS); - await driver.setOrientation('PORTRAIT'); - - await AndroidSettingsScreen.tapOpenSearchBarButton(); - await AndroidSettingsScreen.fillSearchBarInput('Opening links'); - await AndroidSettingsScreen.tapOpeningLinksSearchResult(); - - await AndroidSettingsOpeningLinksScreen.scrollToMetaMaskAppOption(); - await AndroidSettingsOpeningLinksScreen.tapMetaMaskAppOption(); - - await driver.pause(2000); - - const isAddLinksButtonDisplayed = - await AndroidSettingsOpeningLinksScreen.addLinksButton.isDisplayed(); - - if (isAddLinksButtonDisplayed) { - const isAddLinksButtonEnabled = - await AndroidSettingsOpeningLinksScreen.isAddLinksButtonEnabled(); - - if (isAddLinksButtonEnabled) { - await AndroidSettingsOpeningLinksScreen.tapAddLinksButton(); - await AndroidSettingsOpeningLinksScreen.selectAllMetaMaskSupportedLinks(); - await AndroidSettingsOpeningLinksScreen.tapAddMetaMaskSupportedLinks(); - } - } -}; - -export const beforeHook = async () => { - if (driver.isAndroid) { - await setAndroidDefaultLinks(); - await launchMetaMask(); - } - - await GetStartedScreen.tapGetStarted(); - await WalletSetupScreen.tapImportWithSRP(); - await OptinMetricsScreen.tapAgreeOptinMetrics(); - await TermsOfUseScreen.tapAcceptTermsOfUseCheckbox(); - await TermsOfUseScreen.tapScrollToBottom(); - await TermsOfUseScreen.tapAcceptTermsOfUseButton(); - await ImportFromSeedScreen.fillSrpField(SRP); - await ImportFromSeedScreen.fillFirstPasswordInput(WALLET_PASSWORD); - await ImportFromSeedScreen.fillSecondPasswordInput(WALLET_PASSWORD); - await Gestures.hideKeyboardWithTap(); - await ImportFromSeedScreen.tapBiometricsToggleIfDisplayed(); - await ImportFromSeedScreen.tapImportButton(); - await WalletReadyScreen.tapDoneButton(); - - // Waiting for the wallet to be ready. Because the initial loading popups - // are very inconsistent we try to get them to show up before continuing - await driver.pause(2000); - await SecurityUpdatesScreen.tapNoThanksSecurityUpdates(); - await driver.pause(2000); - await WelcomeComponent.tapNoThanksButton(); - await driver.pause(2000); - await EnableSmartTransactionsComponent.tapEnableSmartTransactions(); - await driver.pause(1000); - await MetaMetricsComponent.tapAgreeToMetaMetrics(); - // await WhatsNewComponent.closeModal(); -}; - -export const onboardMM = async () => { - await beforeHook(); -}; - -export const beforeEachHook = async () => { - await launchMetaMask(); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); -}; - -// Skipping for now -export const afterEachHook = async () => { - await launchMetaMask(); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); - await goToSettingsAndClearAllConnections(); -}; diff --git a/e2e/test/specs/fixture_reference.ts b/e2e/test/specs/fixture_reference.ts index 5f0818d37..635795be7 100644 --- a/e2e/test/specs/fixture_reference.ts +++ b/e2e/test/specs/fixture_reference.ts @@ -2,8 +2,8 @@ import { driver } from '@wdio/globals'; import connectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; import ChromeBrowserScreen from '@screens/Android/ChromeBrowserScreen'; import LockScreen from '@screens/MetaMask/LockScreen'; -import { goBack, launchMetaMaskWithFixture } from '@util/Utils'; -import { METAMASK_BUNDLE_ID, WALLET_PASSWORD } from '@util/Constants'; +import { goBack, launchMetaMaskWithFixture } from '@util/utils'; +import { METAMASK_BUNDLE_ID, WALLET_PASSWORD } from '@util/constants'; import CreateReactAppDappScreen from '@screens/Dapps/CreateReactAppDappScreen'; import IOSOpenInComponent from '@screens/iOS/components/IOSOpenInComponent'; import SafariBrowserScreen from '@screens/iOS/SafariBrowserScreen'; diff --git a/e2e/test/specs/js_sdk.spec.ts b/e2e/test/specs/js_sdk.spec.ts index 0e7614b9c..1e317e3e7 100644 --- a/e2e/test/specs/js_sdk.spec.ts +++ b/e2e/test/specs/js_sdk.spec.ts @@ -1,23 +1,22 @@ -import { beforeEachHook, beforeHook } from '../mocha.hooks'; -import { BROWSER_BUNDLE_ID, WALLET_PASSWORD } from '@util/Constants'; -import { killApp, launchApp, launchMetaMask } from '@util/Utils'; -import ChromeBrowserScreen from '@screens/Android/ChromeBrowserScreen'; -import AndroidOpenWithComponent from '@screens/Android/components/AndroidOpenWithComponent'; -import ReactNativeDappScreen from '@screens/Dapps/ReactNativeDappScreen'; -import SdkPlaygroundDappScreen from '@screens/Dapps/SdkPlaygroundDappScreen'; -import TestDappScreen from '@screens/Dapps/TestDappScreen'; -import Web3OnBoardDappScreen from '@screens/Dapps/Web3OnBoardDappScreen'; -import LockScreen from '@screens/MetaMask/LockScreen'; -import SettingsScreen from '@screens/MetaMask/SettingsScreen'; -import BottomNavigationComponent from '@screens/MetaMask/components/BottomNavigationComponent'; -import ConnectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; -import NetworkSwitchedModalComponent from '@screens/MetaMask/components/NetworkSwitchedModalComponent'; -import SendTxModalComponent from '@screens/MetaMask/components/SendTxModalComponent'; -import SignModalComponent from '@screens/MetaMask/components/SignModalComponent'; -import SwitchNetworkModalComponent from '@screens/MetaMask/components/SwitchNetworkModalComponent'; -import SafariBrowserScreen from '@screens/iOS/SafariBrowserScreen'; -import IOSOpenInComponent from '@screens/iOS/components/IOSOpenInComponent'; -import DevnextJSDappScreen from '@screens/Dapps/DevnextJSDappScreen'; +import { BROWSER_BUNDLE_ID, WALLET_PASSWORD } from '@util/constants'; +import { killApp, launchApp, launchMetaMask } from '@util/utils'; +import chromeBrowserScreen from '@screens/Android/ChromeBrowserScreen'; +import androidOpenWithComponent from '@screens/Android/components/AndroidOpenWithComponent'; +import reactNativeDappScreen from '@screens/Dapps/ReactNativeDappScreen'; +import sdkPlaygroundDappScreen from '@screens/Dapps/SdkPlaygroundDappScreen'; +import testDappScreen from '@screens/Dapps/TestDappScreen'; +import web3OnBoardDappScreen from '@screens/Dapps/Web3OnBoardDappScreen'; +import lockScreen from '@screens/MetaMask/LockScreen'; +import settingsScreen from '@screens/MetaMask/SettingsScreen'; +import bottomNavigationComponent from '@screens/MetaMask/components/BottomNavigationComponent'; +import connectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; +import networkSwitchedModalComponent from '@screens/MetaMask/components/NetworkSwitchedModalComponent'; +import sendTxModalComponent from '@screens/MetaMask/components/SendTxModalComponent'; +import signModalComponent from '@screens/MetaMask/components/SignModalComponent'; +import switchNetworkModalComponent from '@screens/MetaMask/components/SwitchNetworkModalComponent'; +import safariBrowserScreen from '@screens/iOS/SafariBrowserScreen'; +import iosOpenInComponent from '@screens/iOS/components/IOSOpenInComponent'; +import devnextJSDappScreen from '@screens/Dapps/DevnextJSDappScreen'; /* * @deprecated @@ -31,14 +30,6 @@ import DevnextJSDappScreen from '@screens/Dapps/DevnextJSDappScreen'; * */ describe.skip('JS SDK E2E', () => { - before(async () => { - await beforeHook(); - }); - - beforeEach(async () => { - await beforeEachHook(); - }); - it('E2E on devnext', async () => { await driver.pause(5000); @@ -47,12 +38,12 @@ describe.skip('JS SDK E2E', () => { await launchApp(BROWSER_BUNDLE_ID); const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; + ? safariBrowserScreen + : chromeBrowserScreen; const devnextDappUrl = process.env.DEVNEXT_DAPP_URL ?? ''; - await browserScreen.goToAddress(devnextDappUrl, DevnextJSDappScreen); + await browserScreen.goToAddress(devnextDappUrl, devnextJSDappScreen); // TODO: Make the devnext pom and continue writing tests await driver.pause(5000); @@ -67,32 +58,32 @@ describe.skip('JS SDK E2E', () => { await launchApp(BROWSER_BUNDLE_ID); const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; + ? safariBrowserScreen + : chromeBrowserScreen; // Get and navigate to the Dapp URL const dappUrl = process.env.WEB3_ON_BOARD_DAPP_URL ?? ''; - await browserScreen.goToAddress(dappUrl, DevnextJSDappScreen); + await browserScreen.goToAddress(dappUrl, web3OnBoardDappScreen); - await Web3OnBoardDappScreen.connect(); + await web3OnBoardDappScreen.connect(); - await Web3OnBoardDappScreen.tapMetaMaskConnectButton(); + await web3OnBoardDappScreen.tapMetaMaskConnectButton(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } await driver.pause(5000); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await expect( - await ConnectModalComponent.connectApprovalButton, + await connectModalComponent.connectApprovalButton, ).toBeDisplayed(); - await ConnectModalComponent.tapConnectApproval(); + await connectModalComponent.tapConnectApproval(); if (driver.isIOS) { await driver.pause(1000); @@ -100,15 +91,15 @@ describe.skip('JS SDK E2E', () => { } await driver.pause(5000); - await Web3OnBoardDappScreen.sign(); + await web3OnBoardDappScreen.sign(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); }); it.skip('Connect to the SDK Playground Dapp', async () => { @@ -119,66 +110,66 @@ describe.skip('JS SDK E2E', () => { await launchApp(BROWSER_BUNDLE_ID); const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; + ? safariBrowserScreen + : chromeBrowserScreen; // Get and navigate to the Dapp URL const dappUrl = process.env.SDK_PLAYGROUND_DAPP_URL ?? ''; - await browserScreen.goToAddress(dappUrl, DevnextJSDappScreen); + await browserScreen.goToAddress(dappUrl, devnextJSDappScreen); - await SdkPlaygroundDappScreen.terminate(); + await sdkPlaygroundDappScreen.terminate(); - await SdkPlaygroundDappScreen.connect(); + await sdkPlaygroundDappScreen.connect(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } await driver.pause(5000); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await expect( - await ConnectModalComponent.connectApprovalButton, + await connectModalComponent.connectApprovalButton, ).toBeDisplayed(); - await ConnectModalComponent.tapConnectApproval(); + await connectModalComponent.tapConnectApproval(); if (driver.isIOS) { await driver.pause(1000); await launchApp(BROWSER_BUNDLE_ID); } - await SdkPlaygroundDappScreen.signTypedDataV4(); + await sdkPlaygroundDappScreen.signTypedDataV4(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); if (driver.isIOS) { await driver.pause(1000); await launchApp(BROWSER_BUNDLE_ID); } - await SdkPlaygroundDappScreen.switchToGoerliNetwork(); + await sdkPlaygroundDappScreen.switchToGoerliNetwork(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } - await SwitchNetworkModalComponent.switchNetwork(); + await switchNetworkModalComponent.switchNetwork(); if (driver.isIOS) { - await NetworkSwitchedModalComponent.tapGotItButton(); + await networkSwitchedModalComponent.tapGotItButton(); await driver.pause(1000); await launchApp(BROWSER_BUNDLE_ID); @@ -189,45 +180,45 @@ describe.skip('JS SDK E2E', () => { await launchMetaMask(); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await driver.pause(3000); - await NetworkSwitchedModalComponent.tapGotItButton(); + await networkSwitchedModalComponent.tapGotItButton(); await driver.pause(1000); await launchApp(BROWSER_BUNDLE_ID); } - await SdkPlaygroundDappScreen.sendBatchRpcCalls(); + await sdkPlaygroundDappScreen.sendBatchRpcCalls(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); if (driver.isIOS) { await driver.pause(1000); await launchApp(BROWSER_BUNDLE_ID); } - await SdkPlaygroundDappScreen.sendTransaction(); + await sdkPlaygroundDappScreen.sendTransaction(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } - await SendTxModalComponent.reject(); + await sendTxModalComponent.reject(); await driver.pause(1000); @@ -243,17 +234,17 @@ describe.skip('JS SDK E2E', () => { await driver.pause(15000); - await ReactNativeDappScreen.connect(); + await reactNativeDappScreen.connect(); await driver.pause(5000); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await expect( - await ConnectModalComponent.connectApprovalButton, + await connectModalComponent.connectApprovalButton, ).toBeDisplayed(); - await ConnectModalComponent.tapConnectApproval(); + await connectModalComponent.tapConnectApproval(); if (driver.isIOS) { await driver.pause(1000); @@ -261,10 +252,10 @@ describe.skip('JS SDK E2E', () => { } await driver.pause(5000); - await ReactNativeDappScreen.sign(); + await reactNativeDappScreen.sign(); await driver.pause(5000); - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); }); it.skip('Clear all connections', async () => { @@ -277,13 +268,13 @@ describe.skip('JS SDK E2E', () => { await launchMetaMask(); await driver.pause(5000); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await driver.pause(5000); try { - await BottomNavigationComponent.tapSettingsButton(); - await SettingsScreen.clearAllConnections(); - await BottomNavigationComponent.tapHomeButton(); + await bottomNavigationComponent.tapSettingsButton(); + await settingsScreen.clearAllConnections(); + await bottomNavigationComponent.tapHomeButton(); } catch (e) { console.log('No Connections to clear', e.message); } @@ -297,74 +288,74 @@ describe.skip('JS SDK E2E', () => { await launchApp(BROWSER_BUNDLE_ID); const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; + ? safariBrowserScreen + : chromeBrowserScreen; // Get and navigate to the Dapp URL const testDappUrl = process.env.TEST_DAPP_URL ?? ''; if (driver.isAndroid) { - await (browserScreen as typeof ChromeBrowserScreen).tapSwitchTabsButton(); + await (browserScreen as typeof chromeBrowserScreen).tapSwitchTabsButton(); await ( - browserScreen as typeof ChromeBrowserScreen + browserScreen as typeof chromeBrowserScreen ).tapBrowserMoreOptionsButton(); await ( - browserScreen as typeof ChromeBrowserScreen + browserScreen as typeof chromeBrowserScreen ).tapCloseAllTabsButton(); await ( - browserScreen as typeof ChromeBrowserScreen + browserScreen as typeof chromeBrowserScreen ).tapConfirmCloseAllTabsButton(); - await (browserScreen as typeof ChromeBrowserScreen).tapNewTabButton(); + await (browserScreen as typeof chromeBrowserScreen).tapNewTabButton(); } - await browserScreen.goToAddress(testDappUrl, DevnextJSDappScreen); + await browserScreen.goToAddress(testDappUrl, devnextJSDappScreen); await driver.pause(5000); - await TestDappScreen.terminate(); + await testDappScreen.terminate(); await driver.pause(1000); - await TestDappScreen.connect(); + await testDappScreen.connect(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } await driver.pause(5000); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await expect( - await ConnectModalComponent.connectApprovalButton, + await connectModalComponent.connectApprovalButton, ).toBeDisplayed(); - await ConnectModalComponent.tapConnectApproval(); + await connectModalComponent.tapConnectApproval(); - await TestDappScreen.signTypedDataV3(); + await testDappScreen.signTypedDataV3(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); - await TestDappScreen.personalSign(); + await testDappScreen.personalSign(); if (driver.isAndroid) { - await AndroidOpenWithComponent.tapOpenWithMetaMaskQA(); + await androidOpenWithComponent.tapOpenWithMetaMaskQA(); } else if (driver.isIOS) { - await IOSOpenInComponent.tapOpen(); + await iosOpenInComponent.tapOpen(); } await driver.pause(5000); - await SignModalComponent.tapSignApproval(); - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); await driver.pause(2000); }); diff --git a/e2e/test/specs/metamask-connector/web_dapp.spec.ts b/e2e/test/specs/metamask-connector/web_dapp.spec.ts index e650d365e..160c60557 100644 --- a/e2e/test/specs/metamask-connector/web_dapp.spec.ts +++ b/e2e/test/specs/metamask-connector/web_dapp.spec.ts @@ -1,6 +1,5 @@ import FixtureServer from '@fixtures/FixtureServer'; import { - deviceOpenDeeplinkWithMetaMask, goBack, killApp, launchMetaMaskWithFixture, @@ -8,14 +7,15 @@ import { refreshBrowser, withMobileAction, withWebAction, -} from '@util/Utils'; -import ConnectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; -import LockScreen from '@screens/MetaMask/LockScreen'; -import MetaMaskSDKTestDappScreen from '@screens/Dapps/MetaMaskSDKTestDappScreen'; +} from '@util/utils'; +import { deviceOpenDeeplinkWithMetaMask } from '@test/ViewHelpers'; +import connectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; +import lockScreen from '@screens/MetaMask/LockScreen'; +import metaMaskSDKTestDappScreen from '@screens/Dapps/MetaMaskSDKTestDappScreen'; import { METAMASK_BUNDLE_ID, WALLET_PASSWORD, -} from '../../../src/util/Constants'; +} from '../../../src/util/constants'; let metamaskSDKTestDappUrl: string; const fixtureServer = new FixtureServer(); @@ -26,31 +26,54 @@ describe('MetaMask Connector Playground dapp', () => { expect(metamaskSDKTestDappUrl.length).toBeGreaterThan(0); await launchMetaMaskWithFixture(fixtureServer, METAMASK_BUNDLE_ID); - await LockScreen.unlockMM(WALLET_PASSWORD); + await lockScreen.unlockMM(WALLET_PASSWORD); }); - it('connect with a cold start state', async () => { + it('connects with a cold start state', async () => { await navigateToWebMobileDapp( metamaskSDKTestDappUrl, - MetaMaskSDKTestDappScreen, + metaMaskSDKTestDappScreen, ); // Start with a cold start await killApp(METAMASK_BUNDLE_ID); await refreshBrowser(); await withWebAction(metamaskSDKTestDappUrl, async () => { - await MetaMaskSDKTestDappScreen.connect(); + await metaMaskSDKTestDappScreen.connect(); }); await withMobileAction(async () => { await deviceOpenDeeplinkWithMetaMask(); - await LockScreen.unlockMM(WALLET_PASSWORD); - await ConnectModalComponent.tapConnectApproval(); + await lockScreen.unlockMM(WALLET_PASSWORD); + await connectModalComponent.tapConnectApproval(); await goBack(); }); await withWebAction(metamaskSDKTestDappUrl, async () => { - expect(await MetaMaskSDKTestDappScreen.isDappConnected()).toBe(true); + expect(await metaMaskSDKTestDappScreen.isDappConnected()).toBe(true); + }); + }); + + it.skip('calls personal_sign with a cold start state', async () => { + // Start with a cold start + await killApp(METAMASK_BUNDLE_ID); + await refreshBrowser(); + + await withWebAction(metamaskSDKTestDappUrl, async () => { + await metaMaskSDKTestDappScreen.tapPersonalSignButton(); + }); + + await withMobileAction(async () => { + await deviceOpenDeeplinkWithMetaMask(); + await lockScreen.unlockMM(WALLET_PASSWORD); + await connectModalComponent.tapConnectApproval(); + await goBack(); + }); + + await driver.pause(10000); + + await withWebAction(metamaskSDKTestDappUrl, async () => { + expect(await metaMaskSDKTestDappScreen.isDappConnected()).toBe(true); }); }); }); diff --git a/e2e/test/specs/multi-wallet-connector/fixture_reference.ts b/e2e/test/specs/multi-wallet-connector/fixture_reference.ts index 13f6ceb9f..281849b2a 100644 --- a/e2e/test/specs/multi-wallet-connector/fixture_reference.ts +++ b/e2e/test/specs/multi-wallet-connector/fixture_reference.ts @@ -1,20 +1,14 @@ -import { driver } from '@wdio/globals'; import FixtureServer from '@fixtures/FixtureServer'; import { stopFixtureServer } from '@fixtures/FixtureHelper'; -import connectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; -import ChromeBrowserScreen from '@screens/Android/ChromeBrowserScreen'; import LockScreen from '@screens/MetaMask/LockScreen'; -import { goBack, launchMetaMaskWithFixture } from '@util/Utils'; -import { METAMASK_BUNDLE_ID, WALLET_PASSWORD } from '@util/Constants'; -import CreateReactAppDappScreen from '@screens/Dapps/CreateReactAppDappScreen'; -import IOSOpenInComponent from '@screens/iOS/components/IOSOpenInComponent'; -import SafariBrowserScreen from '@screens/iOS/SafariBrowserScreen'; +import { METAMASK_BUNDLE_ID, WALLET_PASSWORD } from '@util/constants'; +import { launchMetaMaskWithFixture } from '@util/utils'; const fixtureServer = new FixtureServer(); // This test reference will be kept for the work in progress of integrating the // fixtureServer -describe('Fixture test', () => { +describe.skip('Fixture test', () => { before(async () => { await launchMetaMaskWithFixture(fixtureServer, METAMASK_BUNDLE_ID); await LockScreen.unlockMM(WALLET_PASSWORD); @@ -24,21 +18,7 @@ describe('Fixture test', () => { await stopFixtureServer(fixtureServer); }); - it('should wait', async () => { - console.log('Dummy waiting for 50 seconds'); - const browserScreen = driver.isIOS - ? SafariBrowserScreen - : ChromeBrowserScreen; - - await browserScreen.goToAddress( - 'https://react.cursedlab.xyz', - CreateReactAppDappScreen, - ); - - await CreateReactAppDappScreen.connectButton.click(); - await IOSOpenInComponent.tapOpen(); - await connectModalComponent.tapConnectApproval(); - await driver.pause(2000); - await goBack(); + it('should pass', async () => { + expect(true).toBe(true); }); }); diff --git a/e2e/test/specs/native/android_sdk.spec.ts b/e2e/test/specs/native/android_sdk.spec.ts index 5ace9a053..a5b00c205 100644 --- a/e2e/test/specs/native/android_sdk.spec.ts +++ b/e2e/test/specs/native/android_sdk.spec.ts @@ -1,22 +1,14 @@ -import { beforeEachHook, beforeHook } from '../../mocha.hooks'; -import { WALLET_PASSWORD } from '@util/Constants'; -import { launchApp } from '@util/Utils'; -import AndroidSDKDappScreen from '@screens/Dapps/AndroidSDKDappScreen'; -import LockScreen from '@screens/MetaMask/LockScreen'; -import ConnectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; -import SendTxModalComponent from '@screens/MetaMask/components/SendTxModalComponent'; -import SignModalComponent from '@screens/MetaMask/components/SignModalComponent'; -import SwitchNetworkModalComponent from '@screens/MetaMask/components/SwitchNetworkModalComponent'; - +import { WALLET_PASSWORD } from '@util/constants'; +import { launchApp } from '@util/utils'; +import androidSDKDappScreen from '@screens/Dapps/AndroidSDKDappScreen'; +import lockScreen from '@screens/MetaMask/LockScreen'; +import connectModalComponent from '@screens/MetaMask/components/ConnectModalComponent'; +import sendTxModalComponent from '@screens/MetaMask/components/SendTxModalComponent'; +import signModalComponent from '@screens/MetaMask/components/SignModalComponent'; +import switchNetworkModalComponent from '@screens/MetaMask/components/SwitchNetworkModalComponent'; + +// THIS SWUITE IS CURRENTLY NOT IN USE AS ANDROID SDK WAS DEPRECATED describe.skip('Android SDK (native) E2E', () => { - before(async () => { - await beforeHook(); - }); - - beforeEach(async () => { - await beforeEachHook(); - }); - it('Smoke Testing on the AndroidSDK Test Dapp', async () => { await driver.pause(5000); @@ -24,17 +16,17 @@ describe.skip('Android SDK (native) E2E', () => { await driver.pause(5000); - await AndroidSDKDappScreen.connect(); + await androidSDKDappScreen.connect(); await driver.pause(3000); - await LockScreen.unlockMMifLocked(WALLET_PASSWORD); + await lockScreen.unlockMMifLocked(WALLET_PASSWORD); await expect( - await ConnectModalComponent.connectApprovalButton, + await connectModalComponent.connectApprovalButton, ).toBeDisplayed(); - await ConnectModalComponent.tapConnectApproval(); + await connectModalComponent.tapConnectApproval(); if (driver.isIOS) { await driver.pause(1000); @@ -43,33 +35,32 @@ describe.skip('Android SDK (native) E2E', () => { await driver.pause(5000); - await AndroidSDKDappScreen.sign(); - await AndroidSDKDappScreen.sign2(); + await androidSDKDappScreen.sign(); + await androidSDKDappScreen.sign2(); - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); - await AndroidSDKDappScreen.goBack(); + await androidSDKDappScreen.goBack(); - await AndroidSDKDappScreen.batchSigning(); - await AndroidSDKDappScreen.batchSigning(); + await androidSDKDappScreen.batchSigning(); + await androidSDKDappScreen.batchSigning(); - await SignModalComponent.tapSignApproval(); - await SignModalComponent.tapSignApproval(); - await SignModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); + await signModalComponent.tapSignApproval(); - await AndroidSDKDappScreen.goBack(); + await androidSDKDappScreen.goBack(); - await AndroidSDKDappScreen.sendTransaction(); - await AndroidSDKDappScreen.sendTransaction2(); + await androidSDKDappScreen.sendTransaction(); + await androidSDKDappScreen.sendTransaction2(); - await SendTxModalComponent.reject(); + await sendTxModalComponent.reject(); - await AndroidSDKDappScreen.goBack(); + await androidSDKDappScreen.goBack(); - await AndroidSDKDappScreen.switchChain(); - await AndroidSDKDappScreen.switchChain2(); + await androidSDKDappScreen.switchChain(); + await androidSDKDappScreen.switchChain2(); - await SwitchNetworkModalComponent.switchNetwork(); + await switchNetworkModalComponent.switchNetwork(); await driver.pause(1000); }); diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index 3099a0d85..4ce033f66 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -27,7 +27,8 @@ "@util/*": ["src/util/*"], "@specs/*": ["test/specs/*"], "@screens/*": ["src/screens/*"], - "@fixtures/*": ["src/fixtures/*"] + "@fixtures/*": ["src/fixtures/*"], + "@test/*": ["test/*"] } }, "include": ["test", "src", "node_modules/@types/mocha/index.d.ts"],