Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
- changed: Use the UI4 warning card for the Reveal Raw Keys and Reveal Master Private Key password confirmation warnings.
- changed: Tron resource staking now describes its claim action as reclaiming your own TRX, instead of claiming a reward.
- changed: Add maestro test selectors (testIDs) to the swap scene's from and to wallet pills.
- changed: Add maestro test selectors (testIDs) to Manage Tokens rows.
- changed: Add maestro test selectors (testIDs) to the Wallet Settings name input and Done button.
- changed: Add a maestro test selector (testID) to the split-wallet confirmation button.
- fixed: Force `NODE_ENV=test` in the Jest script so UI tests keep working when npm is invoked via Socket (Socket otherwise sets `NODE_ENV=development`, which makes react-native-gesture-handler treat Jest as a non-test env).
- fixed: Bitwave CSV exports now use ISO 8601 UTC timestamps, leave the fee columns blank so Bitwave does not double-count fees, and copy the description into the second custom metadata column.
- fixed: Bitwave account ids are no longer capitalized by the keyboard or padded with whitespace when entered, so exports import without hand-editing the account id.
Expand Down
3 changes: 2 additions & 1 deletion maestro/01-accounts/C000000-change-password.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ tags:
- pressKey: Enter
- assertVisible: Invalid username or password
# Ensure new password works
- tapOn:
id: "passwordFormField.clearIcon"
- tapOn: Password
- eraseText
- inputText: ${SECOND_PASSWORD}
- pressKey: Enter

Expand Down
20 changes: 11 additions & 9 deletions maestro/01-accounts/C000001-switch-and-forget-account.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ tags:
id: "sideMenuButton"
- tapOn: "Logout"
- tapOn: "Exit PIN"
- assertVisible: ${USERNAME}
- tapOn: "Username"
- assertVisible: ${USERNAME1}
- tapOn:
id: "usernameFormField"
- eraseText
- inputText: ${USERNAME2}
- pressKey: Enter
Expand All @@ -63,7 +64,8 @@ tags:
- tapOn: "Logout"
- tapOn: "Exit PIN"
- assertVisible: ${USERNAME2}
- tapOn: "Username"
- tapOn:
id: "usernameFormField"
- eraseText
- inputText: ${USERNAME3}
- pressKey: Enter
Expand All @@ -79,7 +81,7 @@ tags:
id: "sideMenuButton"
- tapOn:
id: "downArrow"
- assertVisible: ${USERNAME}
- assertVisible: ${USERNAME1}
- assertVisible: ${USERNAME2}
- assertVisible: ${USERNAME3}

Expand All @@ -89,22 +91,22 @@ tags:
index: 0
- assertVisible: ${".*Forget Account.*"}
- tapOn: "Cancel"
- assertVisible: ${USERNAME}
- assertVisible: ${USERNAME1}
- assertVisible: ${USERNAME2}
- assertVisible: ${USERNAME3}
# Delete first account
- tapOn:
id: "sideMenuClose"
index: 1
- assertVisible: ${".*" + USERNAME + ".*"} # Username in confirmation modal
- assertVisible: ${".*" + USERNAME1 + ".*"} # Username in confirmation modal
- tapOn: "Forget"
- assertNotVisible: ${USERNAME}
- assertNotVisible: ${USERNAME1}
- tapOn: ${USERNAME2}

# View, forget, switch accounts from PIN login screen
- assertVisible: ${USERNAME2}
- tapOn: ${USERNAME2}
- assertNotVisible: ${USERNAME}
- assertNotVisible: ${USERNAME1}
- assertVisible: ${USERNAME2}
- assertVisible: ${USERNAME3}
- tapOn:
Expand Down Expand Up @@ -153,4 +155,4 @@ tags:
- assertNotVisible:
id: "userDropdownIcon"

- stopApp
- stopApp
123 changes: 105 additions & 18 deletions maestro/03-login/C190284-2fa-01.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ tags:
visible: "Username and password are correct. This device cannot log in because\
\ it does not have the right 2-factor code."
timeout: 15000
- assertVisible: "Enter Backup Code"
- tapOn: "Enter Backup Code"
- assertVisible: "Enter 2FA code"
- tapOn: "Enter 2FA code"
- inputText: ${MAESTRO_EDGE_2FA_BACKUP_CODE}
- assertVisible: "Submit"

Expand All @@ -36,40 +36,127 @@ tags:
text: "Submit"
optional: true

# If the request notifications modal show with "Security is Our Priority"
# Cancel it
# Wait for the delayed request-notifications modal, then verify it is gone.
- extendedWaitUntil:
visible:
id: "modal-close-button"
timeout: 30000
optional: true
- tapOn:
text: "Cancel"
id: "modal-close-button"
optional: true
- extendedWaitUntil:
notVisible:
id: "modal-close-button"
timeout: 10000
optional: true

# If the 2FA warning shows up for another device, deny it
- tapOn:
text: "Deny"
# Wait for the security-alert scene before checking its available actions.
- extendedWaitUntil:
visible:
id: "securityAlertDenyButton"
timeout: 30000
optional: true
- tapOn:
text: "Deny All"

# A second request-notifications modal can be queued over the alert scene.
- extendedWaitUntil:
visible:
id: "modal-close-button"
timeout: 10000
optional: true
- tapOn:
text: "Deny"
id: "modal-close-button"
optional: true
- tapOn:
text: "Deny All"
- extendedWaitUntil:
notVisible:
id: "modal-close-button"
timeout: 10000
optional: true

# Prefer Deny All when it is exposed. The zero settle timeout lets Maestro
# observe the loading-state identifier before waiting for it to disappear.
- runFlow:
when:
visible:
id: "securityAlertDenyAllButton"
commands:
- tapOn:
id: "securityAlertDenyAllButton"
waitToSettleTimeoutMs: 0
- extendedWaitUntil:
visible:
id: "securityAlertDenyAllButton.spinner"
timeout: 5000
- extendedWaitUntil:
notVisible:
id: "securityAlertDenyAllButton.spinner"
timeout: 20000
- extendedWaitUntil:
notVisible:
id: "securityAlertDenyAllButton"
timeout: 20000

# Android does not expose the off-screen Deny All footer. Clear any remaining
# vouchers individually, bounded to avoid an unending cleanup loop.
- runFlow:
when:
visible:
id: "securityAlertDenyButton"
commands:
- repeat:
times: 10
commands:
- runFlow:
when:
visible:
id: "securityAlertDenyButton"
commands:
- runFlow:
when:
visible:
id: "modal-close-button"
commands:
- tapOn:
id: "modal-close-button"
- extendedWaitUntil:
notVisible:
id: "modal-close-button"
timeout: 10000
- tapOn:
id: "securityAlertDenyButton"
waitToSettleTimeoutMs: 0
- extendedWaitUntil:
visible:
id: "securityAlertDenyButton.spinner"
timeout: 5000
- extendedWaitUntil:
notVisible:
id: "securityAlertDenyButton.spinner"
timeout: 20000
- extendedWaitUntil:
notVisible:
id: "securityAlertDenyButton"
timeout: 20000
- tapOn:
text: "SKIP"
optional: true
- tapOn:
text: "SKIP"
optional: true

# If the request notifications modal show with "Security is Our Priority"
# Cancel it
# Dismiss any notification prompt queued after the denial actions.
- extendedWaitUntil:
visible: "Security is Our Priority"
timeout: 20000
visible:
id: "modal-close-button"
timeout: 10000
optional: true
- tapOn:
text: "Cancel"
id: "modal-close-button"
optional: true
- extendedWaitUntil:
notVisible:
id: "modal-close-button"
timeout: 10000
optional: true

# If the survey modal shows, dismiss it
Expand Down
1 change: 1 addition & 0 deletions maestro/03-login/C999002-pin-login.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ tags:
- extendedWaitUntil:
visible: ${MAESTRO_EDGE_UTXO_USERNAME}
timeout: 15000
- waitForAnimationToEnd

- tapOn: ${MAESTRO_EDGE_UTXO_PIN_1}
- tapOn: ${MAESTRO_EDGE_UTXO_PIN_2}
Expand Down
2 changes: 1 addition & 1 deletion maestro/07-wallets/C000029a-migrate-wallets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ env:
IMPORT_SEED: ${MAESTRO_EDGE_MAX_IMPORT_SEED}
tags:
- android
- C000029
- C000029a
---
- runFlow:
file: ../common/launch-cleared.yaml
Expand Down
36 changes: 18 additions & 18 deletions maestro/07-wallets/C000032-archive-and-restore-wallets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,38 @@ tags:


# Archive wallets
- evalScript: ${var walletNames = ["My Bitcoin", "My Bitcoin Cash", "My Dash", "My Ether", "My Litecoin"]}
- evalScript: ${var index = 0}
- evalScript: ${output.walletNames = ["My Bitcoin", "My Bitcoin Cash", "My Dash", "My Ether", "My Litecoin"]}
- evalScript: ${output.index = 0}
- tapOn: Assets
- repeat:
times: ${walletNames.length - 1}
times: ${output.walletNames.length - 1}
commands:
- tapOn: ${walletNames[index]}
- tapOn: ${output.walletNames[output.index]}
- tapOn:
id: gearIcon
- tapOn: ".*Archive Wallet"
# Modal
- assertVisible: "Archive Wallet"
- assertVisible: ${"Are you sure you want to archive " + walletNames[index] + "?"}
- assertVisible: ${"Are you sure you want to archive " + output.walletNames[output.index] + "?"}
- assertVisible: Cancel
# Check if "My Ether" wallet
- runFlow:
when:
true: ${walletNames[index] == "My Ether"}
true: ${output.walletNames[output.index] == "My Ether"}
commands:
- assertVisible: "Archiving this wallet will also archive any enabled tokens for this wallet."
label: "Extra message for Ether wallets"
# Archive
- tapOn: Archive
- assertNotVisible: ${walletNames[index]}
- assertNotVisible: ${output.walletNames[output.index]}

- evalScript: ${index++}
- evalScript: ${output.index++}
label: "Archive all wallets except last"

# Unable to archive last wallet
- runFlow:
commands:
- longPressOn: ${walletNames[index]}
- longPressOn: ${output.walletNames[output.index]}
- tapOn: ".*Archive Wallet"
- assertVisible: "Cannot Archive Wallet"
- assertVisible: "At least one wallet required in this account."
Expand All @@ -80,13 +80,13 @@ tags:
- assertVisible: "Restore Wallets"

# Toggle on wallets to restore
- evalScript: ${var walletCurrencyCodes = ["BTC", "BCH", "DASH", "ETH", "LTC"]}
- evalScript: ${var index = 0}
- evalScript: ${output.walletCurrencyCodes = ["BTC", "BCH", "DASH", "ETH", "LTC"]}
- evalScript: ${output.index = 0}
- repeat:
times: ${walletCurrencyCodes.length - 1}
times: ${output.walletCurrencyCodes.length - 1}
commands:
- tapOn: ${walletCurrencyCodes[index]}
- evalScript: ${index++}
- tapOn: ${output.walletCurrencyCodes[output.index]}
- evalScript: ${output.index++}
- tapOn: Restore

# Modal
Expand All @@ -97,14 +97,14 @@ tags:

# Confirm restored and returned to assets screen
- assertVisible: "Total Balance.*"
- evalScript: ${var index = 0}
- evalScript: ${output.index = 0}
- repeat:
times: ${walletNames.length}
times: ${output.walletNames.length}
commands:
- scrollUntilVisible:
element: ${walletNames[index]}
element: ${output.walletNames[output.index]}
direction: DOWN
- evalScript: ${index++}
- evalScript: ${output.index++}

# Ensure restore is not tappable when none left to restore
- tapOn:
Expand Down
19 changes: 14 additions & 5 deletions maestro/07-wallets/C000034-detect-disable-tokens.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ env:
WALLET_NAME: "My Ether"
ASSET_NAME: "Ethereum"
TOKEN_NAME: "SHIB" # With balance
TOKEN_DISPLAY_NAME: "SHIBA INU"
tags:
- all
- C000034
Expand All @@ -39,12 +40,21 @@ tags:
ASSET_NAMES: ${ASSET_NAME}
NO_COMPLETE: TRUE
label: "Import ETH wallet with a token"
- extendedWaitUntil:
visible: ".*\uEB20"
timeout: 30000
# Complete import
- tapOn: Next
- tapOn:
text: Next
waitToSettleTimeoutMs: 100
# Ensure receive token detected notification and tap on it
# After trying several wait/tap patterns, this polling loop has been the
# most dependable: the notification disappears after about 5 seconds, so
# poll for up to 15 seconds while optional misses keep the loop moving.
- evalScript: ${output.deadline = Date.now() + 15000}
- repeat:
while:
visible: "Total Balance.*"
true: ${Date.now() < output.deadline}
commands:
- tapOn:
text: "Tokens Detected.*"
Expand All @@ -55,9 +65,8 @@ tags:
- assertVisible: "Auto Detected Tokens"
- assertVisible: "All Tokens"
- tapOn:
text: ${TOKEN_NAME + ".*"}
index: 1
- tapOn: Done
id: ${"manageTokensRow." + TOKEN_NAME + "." + TOKEN_DISPLAY_NAME}
- tapOn: Save
- assertNotVisible: ${TOKEN_NAME}

# # Skip testing resync behavior until changed - expected NOT to rediscover tokens from a resync
Expand Down
Loading