Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Onboarding add custom default ETH Mainnet #8723

Merged
merged 31 commits into from
Mar 8, 2024
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
067233a
update selectors for onboarding
chrisleewilcox Feb 22, 2024
d01e258
add tests, views and selectors
chrisleewilcox Feb 26, 2024
569724e
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Feb 26, 2024
2df1f7e
Update index.js
chrisleewilcox Feb 26, 2024
1cc8496
update spelling
chrisleewilcox Feb 26, 2024
81b9367
update reference
chrisleewilcox Feb 26, 2024
279ed63
update test description spelling
chrisleewilcox Feb 26, 2024
9f829e9
use testID
chrisleewilcox Feb 28, 2024
37355c3
remove redundant funciton
chrisleewilcox Feb 28, 2024
3dd1dc5
remove imports
chrisleewilcox Feb 28, 2024
3c59197
use Gestures for waitAndTapByLabel
chrisleewilcox Feb 28, 2024
27f6689
use updated selectors and testID
chrisleewilcox Feb 29, 2024
3cb57e6
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Feb 29, 2024
8b77f42
use test data object
chrisleewilcox Feb 29, 2024
ab01d69
add urls to blacklist
chrisleewilcox Feb 29, 2024
d0d10d8
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 1, 2024
419d25c
remove dupe import
chrisleewilcox Mar 1, 2024
e5cd0fe
use app text for selector text
chrisleewilcox Mar 1, 2024
151a36b
use existing password helper
chrisleewilcox Mar 1, 2024
63dd264
use default custom name from networks constants
chrisleewilcox Mar 1, 2024
85e44fd
remove unecessary function from Gestures and use proper Matchers
chrisleewilcox Mar 2, 2024
521ad1d
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 2, 2024
c199ba9
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 6, 2024
abfc4ba
add custom mainnet to networks and use in test
chrisleewilcox Mar 6, 2024
5ce5cc7
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 6, 2024
380e175
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 6, 2024
76be400
update invalid url
chrisleewilcox Mar 7, 2024
125073e
remove invalid rpc from networks and add back into test
chrisleewilcox Mar 7, 2024
af589b8
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 7, 2024
51f5ad8
use dot notation to access network property
chrisleewilcox Mar 7, 2024
6bfb8eb
Merge branch 'main' into test/onboarding-add-custom-eth-mainnet
chrisleewilcox Mar 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 10 additions & 18 deletions app/components/UI/OptinMetrics/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
BackHandler,
Alert,
InteractionManager,
Platform,
} from 'react-native';
import PropTypes from 'prop-types';
import { baseStyles, fontStyles } from '../../../styles/common';
Expand All @@ -24,17 +23,9 @@ import {
MetaMetricsEvents,
withMetricsAwareness,
} from '../../hooks/useMetrics';

import DefaultPreference from 'react-native-default-preference';
import { ThemeContext } from '../../../util/theme';
import generateTestId from '../../../../wdio/utils/generateTestId';
import {
OPTIN_METRICS_I_AGREE_BUTTON_ID,
OPTIN_METRICS_NO_THANKS_BUTTON_ID,
OPTIN_METRICS_TITLE_ID,
METAMETRICS_OPT_IN_CONTAINER_ID,
OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID,
} from '../../../../wdio/screen-objects/testIDs/Screens/OptinMetricsScreen.testIds';
import { MetaMetricsOptInSelectorsIDs } from '../../../../e2e/selectors/Onboarding/MetaMetricsOptIn.selectors';
import Button, {
ButtonVariants,
ButtonSize,
Expand Down Expand Up @@ -416,7 +407,9 @@ class OptinMetrics extends PureComponent {
<Button
variant={ButtonVariants.Secondary}
onPress={this.onCancel}
{...generateTestId(Platform, OPTIN_METRICS_NO_THANKS_BUTTON_ID)}
testID={
MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_NO_THANKS_BUTTON_ID
}
style={styles.button}
label={strings('privacy_policy.cta_no_thanks')}
size={ButtonSize.Lg}
Expand All @@ -426,7 +419,7 @@ class OptinMetrics extends PureComponent {
<Button
variant={ButtonVariants.Primary}
onPress={this.onConfirm}
{...generateTestId(Platform, OPTIN_METRICS_I_AGREE_BUTTON_ID)}
testID={MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_I_AGREE_BUTTON_ID}
style={styles.button}
label={strings('privacy_policy.cta_i_agree')}
size={ButtonSize.Lg}
Expand Down Expand Up @@ -488,7 +481,7 @@ class OptinMetrics extends PureComponent {
return (
<SafeAreaView
style={styles.root}
{...generateTestId(Platform, METAMETRICS_OPT_IN_CONTAINER_ID)}
testID={MetaMetricsOptInSelectorsIDs.METAMETRICS_OPT_IN_CONTAINER_ID}
>
<ScrollView
style={styles.root}
Expand All @@ -500,16 +493,15 @@ class OptinMetrics extends PureComponent {
<View style={styles.wrapper}>
<Text
style={styles.title}
{...generateTestId(Platform, OPTIN_METRICS_TITLE_ID)}
testID={MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_TITLE_ID}
>
{strings('privacy_policy.description_title')}
</Text>
<Text
style={styles.content}
{...generateTestId(
Platform,
OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID,
)}
testID={
MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID
}
>
{strings('privacy_policy.description_content_1')}
</Text>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ import {
Linking,
} from 'react-native';
import { connect } from 'react-redux';
import { isSafeChainId, toHex } from '@metamask/controller-utils';

import { typography } from '@metamask/design-tokens';
import {
fontStyles,
Expand Down Expand Up @@ -66,6 +64,8 @@ import {
} from '../../../../../selectors/networkController';
import { regex } from '../../../../../../app/util/regex';
import { NetworksViewSelectorsIDs } from '../../../../../../e2e/selectors/Settings/NetworksView.selectors';
import { isSafeChainId, toHex } from '@metamask/controller-utils';
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
import { CustomDefaultNetworkIDs } from '../../../../../../e2e/selectors/Onboarding/CustomDefaultNetwork.selectors';
import { updateIncomingTransactions } from '../../../../../util/transaction-controller';
import { withMetricsAwareness } from '../../../../../components/hooks/useMetrics';
import { CHAIN_IDS } from '@metamask/transaction-controller/dist/constants';
Expand Down Expand Up @@ -1250,6 +1250,7 @@ class NetworkSettings extends PureComponent {
size={ButtonSize.Lg}
disabled={isActionDisabled}
width={ButtonWidthTypes.Full}
testID={CustomDefaultNetworkIDs.USE_THIS_NETWORK_BUTTON_ID}
/>
) : (
(addMode || editable) && (
Expand Down
31 changes: 31 additions & 0 deletions e2e/pages/Onboarding/DefaultNetworkView.js
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import Matchers from '../../utils/Matchers';
import Gestures from '../../utils/Gestures';
import NetworksView from '../Settings/NetworksView';
import {
CustomDefaultNetworkIDs,
CustomDefaultNetworkTexts,
} from '../../selectors/Onboarding/CustomDefaultNetwork.selectors';

class DefaultNetworkView {
get useThisNetworkButton() {
return device.getPlatform() === 'ios'
? Matchers.getElementByID(
CustomDefaultNetworkIDs.USE_THIS_NETWORK_BUTTON_ID,
)
: Matchers.getElementByLabel(
CustomDefaultNetworkTexts.USE_THIS_NETWORK_BUTTON_TEXT,
);
}

async tapUseThisNetworkButton() {
await Gestures.waitAndTap(this.useThisNetworkButton);
await Gestures.waitAndTap(this.useThisNetworkButton);
}

async typeRpcURL(rpcURL) {
await (await NetworksView.rpcURLInput).clearText();
await NetworksView.typeInRpcUrl(rpcURL);
}
}

export default new DefaultNetworkView();
30 changes: 20 additions & 10 deletions e2e/pages/Onboarding/MetaMetricsOptInView.js
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,29 +1,30 @@
import {
OPTIN_METRICS_I_AGREE_BUTTON_ID,
OPTIN_METRICS_NO_THANKS_BUTTON_ID,
OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID,
METAMETRICS_OPT_IN_CONTAINER_ID,
} from '../../../wdio/screen-objects/testIDs/Screens/OptinMetricsScreen.testIds';
import { MetaMetricsOptInSelectorsIDs } from '../../selectors/Onboarding/MetaMetricsOptIn.selectors';
import Matchers from '../../utils/Matchers';
import Gestures from '../../utils/Gestures';

class MetaMetricsOptIn {
get container() {
return Matchers.getElementByID(METAMETRICS_OPT_IN_CONTAINER_ID);
return Matchers.getElementByID(
MetaMetricsOptInSelectorsIDs.METAMETRICS_OPT_IN_CONTAINER_ID,
);
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
}

get optInMetricsContent() {
return Matchers.getElementByID(
OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID,
MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID,
);
}

get iAgreeButton() {
return Matchers.getElementByID(OPTIN_METRICS_I_AGREE_BUTTON_ID);
return Matchers.getElementByID(
MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_I_AGREE_BUTTON_ID,
);
}

get noThanksButton() {
return Matchers.getElementByID(OPTIN_METRICS_NO_THANKS_BUTTON_ID);
return Matchers.getElementByID(
MetaMetricsOptInSelectorsIDs.OPTIN_METRICS_NO_THANKS_BUTTON_ID,
);
}

async tapAgreeButton() {
Expand All @@ -35,6 +36,15 @@ class MetaMetricsOptIn {
await Gestures.swipe(this.optInMetricsContent, 'up', 'fast', 0.9);
await Gestures.waitAndTap(this.noThanksButton);
}

async tapEditDefaultNetworkHere() {
await Gestures.swipe(this.optInMetricsContent, 'up', 'fast', 0.9);
if (device.getPlatform() === 'ios') {
await Gestures.tapAtPoint(this.container, { x: 333, y: 534 });
} else {
await Gestures.tapAtPoint(this.optInMetricsContent, { x: 15, y: 570 });
}
}
}
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved

export default new MetaMetricsOptIn();
4 changes: 3 additions & 1 deletion e2e/resources/blacklistURLs.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
".*rpc.tenderly.co/.*",
".*api-goerli.etherscan.io/.*",
".*cloudflare-ipfs.com/.*",
".*stale.*"
".*stale.*",
".*phishing-detection.metafi.codefi.network/.*",
".*token-api.metaswap.codefi.network/.*"
]
}
10 changes: 10 additions & 0 deletions e2e/resources/networks.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,15 @@
"nickname": "Gnosis",
"ticker": "xDAI"
}
},
"Ethereum Main Custom": {
"providerConfig": {
"type": "rpc",
"chainId": "1",
"rpcUrl": "https://eth.llamarpc.com",
"invalidUrl": "https//rpc.mevblocker.io",
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
"nickname": "Custom Mainnet",
"ticker": "ETH"
}
}
}
9 changes: 9 additions & 0 deletions e2e/selectors/Onboarding/CustomDefaultNetwork.selectors.js
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import messages from '../../../locales/languages/en.json';

export const CustomDefaultNetworkIDs = {
USE_THIS_NETWORK_BUTTON_ID: 'use-this-network',
};

export const CustomDefaultNetworkTexts = {
USE_THIS_NETWORK_BUTTON_TEXT: messages.app_settings.networks_default_cta,
};
13 changes: 13 additions & 0 deletions e2e/selectors/Onboarding/MetaMetricsOptIn.selectors.js
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// eslint-disable-next-line import/prefer-default-export
export const MetaMetricsOptInSelectorsIDs = {
OPTIN_METRICS_TITLE_ID: 'optin-metrics-title-id',
OPTIN_METRICS_NO_THANKS_BUTTON_ID: 'optin-metrics-no-thanks-button-id',
OPTIN_METRICS_I_AGREE_BUTTON_ID: 'optin-metrics-i-agree-button-id',
OPTIN_METRICS_PRIVACY_POLICY_DESCRIPTION_CONTENT_1_ID:
'optin-metrics-privacy-policy-description',
OPTIN_METRICS_HERE_DEFAULT_NETWORK_ID: 'optin-metrics-default-network-id',
DEFAULT_NETWORK_RPC_URL: 'default-network-rpc-url',
DEFAULT_NETWORK_USE_THIS_NETWORK_BUTTON_ID:
'default-network-use-this-button-id',
METAMETRICS_OPT_IN_CONTAINER_ID: 'meta-metrics-container',
};
62 changes: 62 additions & 0 deletions e2e/specs/onboarding/add-custom-eth-mainnet.spec.js
chrisleewilcox marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { Regression } from '../../tags';
import OnboardingCarouselView from '../../pages/Onboarding/OnboardingCarouselView';
import OnboardingView from '../../pages/Onboarding/OnboardingView';
import Assertions from '../../utils/Assertions';
import MetaMetricsOptIn from '../../pages/Onboarding/MetaMetricsOptInView';
import DefaultNetworkView from '../../pages/Onboarding/DefaultNetworkView';
import TermsOfUseModal from '../../pages/modals/TermsOfUseModal';
import CreatePasswordView from '../../pages/Onboarding/CreatePasswordView';
import EnableAutomaticSecurityChecksView from '../../pages/EnableAutomaticSecurityChecksView';
import SkipAccountSecurityModal from '../../pages/modals/SkipAccountSecurityModal';
import WalletView from '../../pages/WalletView';
import ProtectYourWalletView from '../../pages/Onboarding/ProtectYourWalletView';
import NetworksView from '../../pages/Settings/NetworksView';
import Accounts from '../../../wdio/helpers/Accounts';
import { DEFAULT_MAINNET_CUSTOM_NAME } from '../../../app/constants/network';
import networks from '../../resources/networks.json';

const validAccount = Accounts.getValidAccount();

describe(Regression('Add custom default ETH Mainnet'), () => {
beforeAll(async () => {
await device.launchApp();
});

it('should navigate to edit custom default ETH Mainnet from Opt-In screen', async () => {
await OnboardingCarouselView.tapOnGetStartedButton();
await OnboardingView.tapCreateWallet();
await Assertions.checkIfVisible(MetaMetricsOptIn.container);
});

it('should not edit default network with invalid RPC', async () => {
await MetaMetricsOptIn.tapEditDefaultNetworkHere();
await DefaultNetworkView.typeRpcURL(
networks['Ethereum Main Custom'].providerConfig.invalidUrl,
);
await Assertions.checkIfVisible(NetworksView.rpcWarningBanner);
});

it('should edit default ETH Mainnet with valid RPC', async () => {
await DefaultNetworkView.typeRpcURL(
networks['Ethereum Main Custom'].providerConfig.rpcUrl,
);
await DefaultNetworkView.tapUseThisNetworkButton();
await Assertions.checkIfVisible(MetaMetricsOptIn.container);
});

it('should show custom default ETH Mainnet as active', async () => {
await MetaMetricsOptIn.tapAgreeButton();
await TermsOfUseModal.tapScrollEndButton();
await TermsOfUseModal.tapAgreeCheckBox();
await TermsOfUseModal.tapAcceptButton();
await CreatePasswordView.enterPassword(validAccount.password);
await CreatePasswordView.reEnterPassword(validAccount.password);
await CreatePasswordView.tapIUnderstandCheckBox();
await CreatePasswordView.tapCreatePasswordButton();
await ProtectYourWalletView.tapOnRemindMeLaterButton();
await SkipAccountSecurityModal.tapIUnderstandCheckBox();
await SkipAccountSecurityModal.tapSkipButton();
await EnableAutomaticSecurityChecksView.tapNoThanks();
await WalletView.isNetworkNameVisible(DEFAULT_MAINNET_CUSTOM_NAME);
});
});
Loading