diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 5ab3bee03..233f2e04d 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -45,18 +45,8 @@ jobs: TEMPLE_WALLET_API_URL: ${{ vars.TEMPLE_WALLET_API_URL }} TEMPLE_WALLET_STATIC_API_URL: ${{ vars.TEMPLE_WALLET_STATIC_API_URL }} TEMPLE_WALLET_DEXES_API_URL: ${{ vars.TEMPLE_WALLET_DEXES_API_URL }} - DEFAULT_HD_ACCOUNT_SEED_PHRASE: ${{ secrets.DEFAULT_HD_ACCOUNT_SEED_PHRASE }} - DEFAULT_HD_ACCOUNT_FIRST_PRIVATE_KEY: ${{ secrets.DEFAULT_HD_ACCOUNT_FIRST_PRIVATE_KEY }} - DEFAULT_HD_ACCOUNT_FIRST_HASH_SHORT_FORM: ${{ secrets.DEFAULT_HD_ACCOUNT_FIRST_HASH_SHORT_FORM }} - DEFAULT_HD_ACCOUNT_SECOND_PRIVATE_KEY: ${{ secrets.DEFAULT_HD_ACCOUNT_SECOND_PRIVATE_KEY }} - DEFAULT_PASSWORD: ${{ secrets.DEFAULT_PASSWORD }} - IMPORTED_HD_ACCOUNT_SEED_PHRASE: ${{ secrets.IMPORTED_HD_ACCOUNT_SEED_PHRASE }} - IMPORTED_HD_ACCOUNT_FIRST_PRIVATE_KEY: ${{ secrets.IMPORTED_HD_ACCOUNT_FIRST_PRIVATE_KEY }} - IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM: ${{ secrets.IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM }} - TEMPLE_WALLET_ROUTE3_AUTH_TOKEN: ${{ vars.TEMPLE_WALLET_ROUTE3_AUTH_TOKEN }} TEMPLE_WALLET_MOONPAY_API_KEY: ${{ secrets.TEMPLE_WALLET_MOONPAY_API_KEY }} - WATCH_ONLY_PUBLIC_KEY_HASH: ${{ secrets.WATCH_ONLY_PUBLIC_KEY_HASH }} - WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM: ${{ secrets.WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM }} + TEMPLE_WALLET_ROUTE3_AUTH_TOKEN: ${{ vars.TEMPLE_WALLET_ROUTE3_AUTH_TOKEN }} - name: Install dependencies and code quality check uses: ./.github/workflows/code-quality-check @@ -64,18 +54,6 @@ jobs: - name: Create Chrome build run: yarn build:chrome - - name: Perform end-to-end tests - uses: ./.github/workflows/e2e - - - name: Upload E2E video to Slack - if: failure() - uses: adrey/slack-file-upload-action@master - with: - token: ${{ secrets.SLACK_E2E_VIDEO_UPLOADER_TOKEN }} - path: e2e/video-rep/test-runs.mp4 - channel: temple-test-runs - initial_comment: (Run ) - - name: Upload artifact uses: actions/upload-artifact@v2 with: diff --git a/.github/workflows/manual-builds.yml b/.github/workflows/manual-builds.yml index 472c73bc0..4236d9b05 100644 --- a/.github/workflows/manual-builds.yml +++ b/.github/workflows/manual-builds.yml @@ -1,4 +1,5 @@ name: Manual builds +run-name: Manual build of ${{ github.ref_name }} (Chrome=${{ github.event.inputs.chrome == 'true' || github.event.inputs.chromePlusE2E == 'true' }}; Firefox=${{ github.event.inputs.firefox == 'true' }}; E2E=${{ github.event.inputs.chromePlusE2E == 'true' }}) on: workflow_dispatch: @@ -7,6 +8,10 @@ on: type: boolean description: Chrome build required: false + chromePlusE2E: + type: boolean + description: Chrome build + E2E + required: false firefox: type: boolean description: Firefox build @@ -53,16 +58,29 @@ jobs: TEMPLE_WALLET_DEXES_API_URL: ${{ vars.TEMPLE_WALLET_DEXES_API_URL }} TEMPLE_WALLET_ROUTE3_AUTH_TOKEN: ${{ vars.TEMPLE_WALLET_ROUTE3_AUTH_TOKEN }} TEMPLE_WALLET_MOONPAY_API_KEY: ${{ secrets.TEMPLE_WALLET_MOONPAY_API_KEY }} + # [e2e] + DEFAULT_HD_ACCOUNT_SEED_PHRASE: ${{ secrets.DEFAULT_HD_ACCOUNT_SEED_PHRASE }} + DEFAULT_HD_ACCOUNT_FIRST_PRIVATE_KEY: ${{ secrets.DEFAULT_HD_ACCOUNT_FIRST_PRIVATE_KEY }} + DEFAULT_HD_ACCOUNT_FIRST_HASH_SHORT_FORM: ${{ secrets.DEFAULT_HD_ACCOUNT_FIRST_HASH_SHORT_FORM }} + DEFAULT_HD_ACCOUNT_SECOND_PRIVATE_KEY: ${{ secrets.DEFAULT_HD_ACCOUNT_SECOND_PRIVATE_KEY }} + DEFAULT_PASSWORD: ${{ secrets.DEFAULT_PASSWORD }} + IMPORTED_HD_ACCOUNT_SEED_PHRASE: ${{ secrets.IMPORTED_HD_ACCOUNT_SEED_PHRASE }} + IMPORTED_HD_ACCOUNT_FIRST_PRIVATE_KEY: ${{ secrets.IMPORTED_HD_ACCOUNT_FIRST_PRIVATE_KEY }} + IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM: ${{ secrets.IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM }} + WATCH_ONLY_PUBLIC_KEY_HASH: ${{ secrets.WATCH_ONLY_PUBLIC_KEY_HASH }} + WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM: ${{ secrets.WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM }} + CONTACT_ADDRESS_PUBLIC_KEY_HASH: ${{ secrets.CONTACT_ADDRESS_PUBLIC_KEY_HASH }} + CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM: ${{ secrets.CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM }} - name: Install dependencies and code quality uses: ./.github/workflows/code-quality-check - name: Create Chrome build - if: ${{ github.event.inputs.chrome == 'true' }} + if: ${{ github.event.inputs.chrome == 'true' || github.event.inputs.chromePlusE2E == 'true' }} run: yarn build:chrome - name: Upload Chrome artifact - if: ${{ github.event.inputs.chrome == 'true' }} + if: ${{ github.event.inputs.chrome == 'true' || github.event.inputs.chromePlusE2E == 'true' }} uses: actions/upload-artifact@v2 with: name: chrome @@ -70,6 +88,19 @@ jobs: if-no-files-found: error retention-days: 30 + - name: Perform end-to-end tests + if: ${{ github.event.inputs.chromePlusE2E == 'true' }} + uses: ./.github/workflows/e2e + + - name: Upload E2E video to Slack + if: ${{ failure() && github.event.inputs.chromePlusE2E == 'true' }} + uses: adrey/slack-file-upload-action@master + with: + token: ${{ secrets.SLACK_E2E_VIDEO_UPLOADER_TOKEN }} + path: e2e/video-rep/test-runs.mp4 + channel: temple-test-runs + initial_comment: (Run ) + - name: Create Firefox build if: ${{ github.event.inputs.firefox == 'true' }} run: yarn build:firefox diff --git a/.github/workflows/secrets-setup/action.yml b/.github/workflows/secrets-setup/action.yml index 2c9e7b2d6..e435e1564 100644 --- a/.github/workflows/secrets-setup/action.yml +++ b/.github/workflows/secrets-setup/action.yml @@ -47,6 +47,10 @@ inputs: required: false WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM: required: false + CONTACT_ADDRESS_PUBLIC_KEY_HASH: + required: false + CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM: + required: false runs: using: 'composite' @@ -85,4 +89,6 @@ runs: IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM=${{ inputs.IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM }} WATCH_ONLY_PUBLIC_KEY_HASH=${{ inputs.WATCH_ONLY_PUBLIC_KEY_HASH }} WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM=${{ inputs.WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM }} + CONTACT_ADDRESS_PUBLIC_KEY_HASH=${{ inputs.CONTACT_ADDRESS_PUBLIC_KEY_HASH }} + CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM=${{ inputs.CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM }} EOF diff --git a/e2e/.env.dist b/e2e/.env.dist index de49cf5ec..da5019432 100644 --- a/e2e/.env.dist +++ b/e2e/.env.dist @@ -11,3 +11,6 @@ IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM= WATCH_ONLY_PUBLIC_KEY_HASH= WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM= + +CONTACT_ADDRESS_PUBLIC_KEY_HASH= +CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM= diff --git a/e2e/package.json b/e2e/package.json index f723994ce..e58bff95c 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -8,6 +8,7 @@ "start:dev": "yarn start --tags @dev", "start:remove_account": "yarn start --tags @remove_account", "start:create_account": "yarn start --tags @create_account", + "start:address_book": "yarn start --tags @address_book", "test": "yarn start --exit --tags 'not @dev'", "ts": "tsc --pretty" }, diff --git a/e2e/src/features/address-book.feature b/e2e/src/features/address-book.feature new file mode 100644 index 000000000..aee78bbfc --- /dev/null +++ b/e2e/src/features/address-book.feature @@ -0,0 +1,18 @@ +Feature: Address book +@address_book + Scenario: As a user, I'd like to add contact + Given I have imported an existing account + + And I press Account Icon on the Header page + And I am on the AccountsDropdown page + And I press Settings Button on the Account Drop-down page + + And I am on the Settings page + And I press Address Book Button on the Settings page + + And I am on the AddressBook page + And I enter contactPublicKey into Address Input on the Address Book page + And I enter shortRandomContent into Name Input on the Address Book page + And I press Add Contact Button on the Address Book page + + Then I check if added contact is added and displayed diff --git a/e2e/src/features/create-new-wallet.feature b/e2e/src/features/create-new-wallet.feature index 5b5eeb13a..2d9939361 100644 --- a/e2e/src/features/create-new-wallet.feature +++ b/e2e/src/features/create-new-wallet.feature @@ -17,6 +17,7 @@ Feature: Create a new wallet And I am on the SetWallet page And I enter defaultPassword into Password Field on the Register Form page And I enter defaultPassword into Repeat Password Field on the Register Form page + And I press Analytics Check Box on the Register Form page And I press Skip Onboarding Checkbox on the Register Form page And I press Accept Terms Checkbox on the Register Form page And I press Create Button on the Register Form page diff --git a/e2e/src/features/delegate.feature b/e2e/src/features/delegate.feature index 8bcc042f6..630cb6390 100644 --- a/e2e/src/features/delegate.feature +++ b/e2e/src/features/delegate.feature @@ -1,5 +1,5 @@ Feature: Delegate - @dev + Scenario: As a user, i'd like to re-delegate TEZ to a baker Given I have imported an existing account And I press Selected Network Button on the Network Select page diff --git a/e2e/src/features/import-existing-wallet.feature b/e2e/src/features/import-existing-wallet.feature index 32c9d9715..466c9fb00 100644 --- a/e2e/src/features/import-existing-wallet.feature +++ b/e2e/src/features/import-existing-wallet.feature @@ -12,6 +12,7 @@ Feature: Import existing wallet And I enter defaultPassword into Password Field on the Register Form page And I enter defaultPassword into Repeat Password Field on the Register Form page And I press Skip Onboarding Checkbox on the Register Form page + And I press Analytics Check Box on the Register Form page And I press Accept Terms Checkbox on the Register Form page And I press Import Button on the Register Form page diff --git a/e2e/src/features/send.feature b/e2e/src/features/send.feature index 185a843be..c522f0e33 100644 --- a/e2e/src/features/send.feature +++ b/e2e/src/features/send.feature @@ -1,5 +1,5 @@ Feature: Send - @dev + Scenario: As a user, I'd like to send my funds to another account Given I have imported an existing account And I press Selected Network Button on the Network Select page diff --git a/e2e/src/page-objects/index.ts b/e2e/src/page-objects/index.ts index 5528fba78..3f1e81647 100644 --- a/e2e/src/page-objects/index.ts +++ b/e2e/src/page-objects/index.ts @@ -1,3 +1,4 @@ +import { AddressBookPage } from 'e2e/src/page-objects/pages/address-book.page'; import { NetworksDropDown } from 'e2e/src/page-objects/pages/drop-down-lists/networks.drop-down'; import { NewsletterModalPage } from 'e2e/src/page-objects/pages/newsletter-modal.page'; import { OnRumModalPage } from 'e2e/src/page-objects/pages/on-rum-modal.page'; @@ -53,5 +54,6 @@ export const Pages = { OnRumpModal: new OnRumModalPage(), NewsletterModal: new NewsletterModalPage(), Swap: new SwapPage(), - RemoveAccount: new RemoveAccountPage() + RemoveAccount: new RemoveAccountPage(), + AddressBook: new AddressBookPage() }; diff --git a/e2e/src/page-objects/pages/address-book.page.ts b/e2e/src/page-objects/pages/address-book.page.ts new file mode 100644 index 000000000..58da4d5f0 --- /dev/null +++ b/e2e/src/page-objects/pages/address-book.page.ts @@ -0,0 +1,31 @@ +import { AddressBookSelectors } from 'src/app/templates/AddressBook/AddressBook.selectors'; + +import { Page } from 'e2e/src/classes/page.class'; +import { createPageElement, findElement } from 'e2e/src/utils/search.utils'; +import { VERY_SHORT_TIMEOUT } from 'e2e/src/utils/timing.utils'; + +export class AddressBookPage extends Page { + addressInput = createPageElement(AddressBookSelectors.addressInput); + nameInput = createPageElement(AddressBookSelectors.nameInput); + addContactButton = createPageElement(AddressBookSelectors.addContactButton); + contactItem = createPageElement(AddressBookSelectors.contactItem); + deleteContactButton = createPageElement(AddressBookSelectors.deleteContactButton); + contactOwnLabelText = createPageElement(AddressBookSelectors.contactOwnLabelText); + + async isVisible() { + await this.addressInput.waitForDisplayed(); + await this.nameInput.waitForDisplayed(); + await this.addContactButton.waitForDisplayed(); + await this.contactItem.waitForDisplayed(); + await this.contactOwnLabelText.waitForDisplayed(); + } + + isContactAdded(hash: string) { + return findElement( + AddressBookSelectors.contactItem, + { hash }, + VERY_SHORT_TIMEOUT, + `The contact with address: '${hash}' not found` + ); + } +} diff --git a/e2e/src/page-objects/pages/send.page.ts b/e2e/src/page-objects/pages/send.page.ts index 23ce3392e..c951137db 100644 --- a/e2e/src/page-objects/pages/send.page.ts +++ b/e2e/src/page-objects/pages/send.page.ts @@ -9,6 +9,8 @@ export class SendPage extends Page { amountInput = createPageElement(SendFormSelectors.amountInput); recipientInput = createPageElement(SendFormSelectors.recipientInput); sendButton = createPageElement(SendFormSelectors.sendButton); + contactItemButton = createPageElement(SendFormSelectors.contactItemButton); + contactHashValue = createPageElement(SendFormSelectors.contactHashValue); async isVisible() { await this.assetDropDown.waitForDisplayed(); diff --git a/e2e/src/page-objects/pages/setWalletPassword.page.ts b/e2e/src/page-objects/pages/setWalletPassword.page.ts index b4fbd0e50..d642c728b 100644 --- a/e2e/src/page-objects/pages/setWalletPassword.page.ts +++ b/e2e/src/page-objects/pages/setWalletPassword.page.ts @@ -6,6 +6,7 @@ import { createPageElement } from '../../utils/search.utils'; export class setWalletPage extends Page { passwordField = createPageElement(setWalletPasswordSelectors.passwordField); repeatPasswordField = createPageElement(setWalletPasswordSelectors.repeatPasswordField); + analyticsCheckbox = createPageElement(setWalletPasswordSelectors.analyticsCheckBox); skipOnboarding = createPageElement(setWalletPasswordSelectors.skipOnboardingCheckbox); acceptTerms = createPageElement(setWalletPasswordSelectors.acceptTermsCheckbox); importButton = createPageElement(setWalletPasswordSelectors.importButton); @@ -13,6 +14,7 @@ export class setWalletPage extends Page { async isVisible() { await this.passwordField.waitForDisplayed(); await this.repeatPasswordField.waitForDisplayed(); + await this.analyticsCheckbox.waitForDisplayed(); await this.skipOnboarding.waitForDisplayed(); await this.acceptTerms.waitForDisplayed(); } diff --git a/e2e/src/step-definitions/address-book.steps.ts b/e2e/src/step-definitions/address-book.steps.ts new file mode 100644 index 000000000..770dba4d8 --- /dev/null +++ b/e2e/src/step-definitions/address-book.steps.ts @@ -0,0 +1,22 @@ +import { Given } from '@cucumber/cucumber'; +import { expect } from 'chai'; + +import { Pages } from 'e2e/src/page-objects'; +import { envVars } from 'e2e/src/utils/env.utils'; +import { MEDIUM_TIMEOUT } from 'e2e/src/utils/timing.utils'; + +Given(/I check if added contact is added and displayed/, { timeout: MEDIUM_TIMEOUT }, async () => { + // Checking if added contact is displaying 'Current contacts' list + await Pages.AddressBook.isContactAdded(envVars.CONTACT_ADDRESS_PUBLIC_KEY_HASH); + + // Checking if added contact is displayed in the 'Recipient' drop-down on the Send Page + await Pages.Header.templeLogoButton.click(); + await Pages.Home.isVisible(); + await Pages.Home.SendButton.click(); + await Pages.Send.isVisible(); + await Pages.Send.recipientInput.click(); + await Pages.Send.contactItemButton.waitForDisplayed(); + + const contactHashValue = await Pages.Send.contactHashValue.getText(); + expect(contactHashValue).eql(envVars.CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM); +}); diff --git a/e2e/src/step-definitions/common.steps.ts b/e2e/src/step-definitions/common.steps.ts index 131f03599..c297ad820 100644 --- a/e2e/src/step-definitions/common.steps.ts +++ b/e2e/src/step-definitions/common.steps.ts @@ -44,6 +44,7 @@ Given(/I have imported an existing account/, { timeout: LONG_TIMEOUT }, async () await Pages.SetWallet.isVisible(); await Pages.SetWallet.passwordField.type(BrowserContext.password); await Pages.SetWallet.repeatPasswordField.type(BrowserContext.password); + await Pages.SetWallet.analyticsCheckbox.click(); await Pages.SetWallet.skipOnboarding.click(); await Pages.SetWallet.acceptTerms.click(); await Pages.SetWallet.importButton.click(); diff --git a/e2e/src/utils/env.utils.ts b/e2e/src/utils/env.utils.ts index b28f1b4dd..ba7d14a95 100644 --- a/e2e/src/utils/env.utils.ts +++ b/e2e/src/utils/env.utils.ts @@ -14,7 +14,9 @@ export const envVars = { IMPORTED_HD_ACCOUNT_FIRST_PRIVATE_KEY: getEnv('IMPORTED_HD_ACCOUNT_FIRST_PRIVATE_KEY'), IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM: getEnv('IMPORTED_HD_ACCOUNT_FIRST_HASH_SHORT_FORM'), WATCH_ONLY_PUBLIC_KEY_HASH: getEnv('WATCH_ONLY_PUBLIC_KEY_HASH'), - WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM: getEnv('WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM') + WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM: getEnv('WATCH_ONLY_PUBLIC_KEY_HASH_SHORT_FORM'), + CONTACT_ADDRESS_PUBLIC_KEY_HASH: getEnv('CONTACT_ADDRESS_PUBLIC_KEY_HASH'), + CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM: getEnv('CONTACT_ADDRESS_PUBLIC_KEY_HASH_SHORT_FORM') }; Object.entries(envVars).forEach(([key, val]) => { diff --git a/e2e/src/utils/input-data.utils.ts b/e2e/src/utils/input-data.utils.ts index e6a3ed794..edf16ee11 100644 --- a/e2e/src/utils/input-data.utils.ts +++ b/e2e/src/utils/input-data.utils.ts @@ -17,6 +17,7 @@ export const iEnterValues = { defaultSeedPhrase: envVars.DEFAULT_HD_ACCOUNT_SEED_PHRASE, defaultPassword: envVars.DEFAULT_PASSWORD, watchOnlyPublicKey: envVars.WATCH_ONLY_PUBLIC_KEY_HASH, + contactPublicKey: envVars.CONTACT_ADDRESS_PUBLIC_KEY_HASH, bakerAddress: '', shortRandomContent: generateRandomContent(), longRandomContent: 'long random content for test + ' + generateRandomContent(), diff --git a/e2e/src/utils/search.utils.ts b/e2e/src/utils/search.utils.ts index 9916f6802..3348ce309 100644 --- a/e2e/src/utils/search.utils.ts +++ b/e2e/src/utils/search.utils.ts @@ -9,14 +9,24 @@ const buildTestIDSelector = (testID: string) => `[data-testid="${testID}"]`; type OtherSelectors = Record; -export const findElement = async (testID: string, otherSelectors?: OtherSelectors, timeout = MEDIUM_TIMEOUT) => { +export const findElement = async ( + testID: string, + otherSelectors?: OtherSelectors, + timeout = MEDIUM_TIMEOUT, + errorTitle?: string +) => { const selector = buildSelector(testID, otherSelectors); - return await findElementBySelectors(selector, timeout); + return await findElementBySelectors(selector, timeout, errorTitle); }; -export const findElementBySelectors = async (selectors: string, timeout = MEDIUM_TIMEOUT) => { - const element = await BrowserContext.page.waitForSelector(selectors, { visible: true, timeout }); +export const findElementBySelectors = async (selectors: string, timeout = MEDIUM_TIMEOUT, errorTitle?: string) => { + const element = await BrowserContext.page.waitForSelector(selectors, { visible: true, timeout }).catch(error => { + if (errorTitle && error instanceof Error) { + error.message = `${errorTitle}\n` + error.message; + } + throw error; + }); if (isDefined(element)) { return element; @@ -40,11 +50,11 @@ export const findElements = async (testID: string) => { class PageElement { constructor(public testID: string, public otherSelectors?: OtherSelectors, public notSelectors?: OtherSelectors) {} - findElement(timeout?: number) { + findElement(timeout?: number, errorTitle?: string) { let selectors = buildSelector(this.testID, this.otherSelectors); if (this.notSelectors) selectors += buildNotSelector(this.notSelectors); - return findElementBySelectors(selectors, timeout); + return findElementBySelectors(selectors, timeout, errorTitle); } waitForDisplayed(timeout?: number) { return this.findElement(timeout); diff --git a/e2e/src/utils/timing.utils.ts b/e2e/src/utils/timing.utils.ts index f776e05ce..cab91d36e 100644 --- a/e2e/src/utils/timing.utils.ts +++ b/e2e/src/utils/timing.utils.ts @@ -6,6 +6,8 @@ export const MEDIUM_TIMEOUT = 30_000; export const SHORT_TIMEOUT = 15_000; +export const VERY_SHORT_TIMEOUT = 5_000; + export const RETRY_OPTIONS = { minTimeout: 300, maxRetryTime: 15_000 diff --git a/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.selectors.ts b/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.selectors.ts index f5634bea2..4a2493bea 100644 --- a/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.selectors.ts +++ b/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.selectors.ts @@ -1,6 +1,7 @@ export enum setWalletPasswordSelectors { passwordField = 'Register Form/Password Field', repeatPasswordField = 'Register Form/Repeat Password Field', + analyticsCheckBox = 'Register Form/Analytics Check Box', skipOnboardingCheckbox = 'Register Form/Skip Onboarding Checkbox', acceptTermsCheckbox = 'Register Form/Accept Terms Checkbox', importButton = 'Register Form/Import Button', diff --git a/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.tsx b/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.tsx index f0f7a1aaf..d00da1c63 100644 --- a/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.tsx +++ b/src/app/pages/NewWallet/setWalletPassword/SetWalletPassword.tsx @@ -242,6 +242,7 @@ export const SetWalletPassword: FC = ({ /> } containerClassName="mb-4" + testID={setWalletPasswordSelectors.analyticsCheckBox} /> > = ({ item, actions }) => ( -
+
{item.name} @@ -214,6 +219,7 @@ const ContactContent: React.FC @@ -225,6 +231,7 @@ const ContactContent: React.FC diff --git a/src/app/templates/SendForm/ContactsDropdownItem.tsx b/src/app/templates/SendForm/ContactsDropdownItem.tsx index 860a91c31..7cf55865b 100644 --- a/src/app/templates/SendForm/ContactsDropdownItem.tsx +++ b/src/app/templates/SendForm/ContactsDropdownItem.tsx @@ -6,6 +6,7 @@ import { Button } from 'app/atoms/Button'; import HashShortView from 'app/atoms/HashShortView'; import Identicon from 'app/atoms/Identicon'; import Name from 'app/atoms/Name'; +import { setTestID } from 'lib/analytics'; import { T } from 'lib/i18n'; import { TempleContact } from 'lib/temple/types'; import { useScrollIntoView } from 'lib/ui/use-scroll-into-view'; @@ -39,7 +40,10 @@ const ContactsDropdownItem: FC = ({ contact, active,
{contact.name} - +
diff --git a/src/app/templates/SendForm/selectors.ts b/src/app/templates/SendForm/selectors.ts index 39bdee0b6..997aca998 100644 --- a/src/app/templates/SendForm/selectors.ts +++ b/src/app/templates/SendForm/selectors.ts @@ -1,6 +1,7 @@ export enum SendFormSelectors { assetItemButton = 'Send Form/Asset Item Button', contactItemButton = 'Send Form/Contact Item Button', + contactHashValue = 'Send Form/Contact Hash Value', assetDropDown = 'Send Form/Asset Drop-down', assetDropDownSearchInput = 'Send Form/Asset Drop-down Search Input', assetDropDownItem = 'Send Form/Asset Drop-down Item',