diff --git a/flows/FLOWS_LIMITATIONS.md b/flows/FLOWS_LIMITATIONS.md new file mode 100644 index 0000000000..d8418ae80c --- /dev/null +++ b/flows/FLOWS_LIMITATIONS.md @@ -0,0 +1,9 @@ +# Maestro flow coverage limitations + +These are known gaps that are partially covered or not fully automatable with Maestro alone: + +- Hardware signer operations that require physical actions on external devices (Coldcard/Jade/Ledger/Passport/Keystone, etc.). +- External app handoff flows (buy providers, deep links, app-store redirects) where control leaves the tested app. +- OS-level permission dialogs that vary by device vendor, OS version, and locale (flows include best-effort conditionals only). +- Network-dependent outcomes that require deterministic on-chain or Electrum state (broadcast timing, mempool confirmation, fiat provider responses). +- Secure recovery phrase verification depth (flows only check navigation/visibility and never export or persist seed content). diff --git a/flows/_common_enter_passcode_1111.yaml b/flows/_common_enter_passcode_1111.yaml new file mode 100644 index 0000000000..2a0ad6bc62 --- /dev/null +++ b/flows/_common_enter_passcode_1111.yaml @@ -0,0 +1,29 @@ +appId: ${APPID} +--- +- runFlow: + when: + visible: + id: "key_1" + commands: + - tapOn: + id: "key_1" + - tapOn: + id: "key_1" + - tapOn: + id: "key_1" + - tapOn: + id: "key_1" +- runFlow: + when: + notVisible: + id: "key_1" + commands: + - tapOn: "1" + - tapOn: "1" + - tapOn: "1" + - tapOn: "1" +- runFlow: + when: + visible: "Proceed" + commands: + - tapOn: "Proceed" diff --git a/flows/_common_handle_runtime_permissions.yaml b/flows/_common_handle_runtime_permissions.yaml new file mode 100644 index 0000000000..2a23541134 --- /dev/null +++ b/flows/_common_handle_runtime_permissions.yaml @@ -0,0 +1,26 @@ +appId: ${APPID} +--- +- runFlow: + when: + visible: + id: "com.android.permissioncontroller:id/permission_allow_foreground_only_button" + commands: + - tapOn: + id: "com.android.permissioncontroller:id/permission_allow_foreground_only_button" +- runFlow: + when: + visible: + id: "com.android.permissioncontroller:id/permission_allow_button" + commands: + - tapOn: + id: "com.android.permissioncontroller:id/permission_allow_button" +- runFlow: + when: + visible: "Allow While Using App" + commands: + - tapOn: "Allow While Using App" +- runFlow: + when: + visible: "Allow Once" + commands: + - tapOn: "Allow Once" diff --git a/flows/_common_open_manage_keys.yaml b/flows/_common_open_manage_keys.yaml new file mode 100644 index 0000000000..962622d84f --- /dev/null +++ b/flows/_common_open_manage_keys.yaml @@ -0,0 +1,18 @@ +appId: ${APPID} +--- +- runFlow: _common_unlock_if_needed.yaml +- runFlow: + when: + visible: + id: "btn_Manage Keys" + commands: + - tapOn: + id: "btn_Manage Keys" +- runFlow: + when: + visible: "Manage Keys" + commands: + - tapOn: "Manage Keys" +- extendedWaitUntil: + visible: "Manage Keys" + timeout: 15000 diff --git a/flows/_common_open_wallet.yaml b/flows/_common_open_wallet.yaml new file mode 100644 index 0000000000..ee0386e4e9 --- /dev/null +++ b/flows/_common_open_wallet.yaml @@ -0,0 +1,20 @@ +appId: ${APPID} +--- +- runFlow: _common_unlock_if_needed.yaml +- tapOn: + id: "view_wallet_0" + index: 0 +- waitForAnimationToEnd: + timeout: 2000 +- runFlow: + when: + visible: + id: "list_transactions" + commands: + - swipe: + from: + id: "list_transactions" + direction: DOWN + duration: 1500 + - waitForAnimationToEnd: + timeout: 3000 diff --git a/flows/_common_unlock_if_needed.yaml b/flows/_common_unlock_if_needed.yaml new file mode 100644 index 0000000000..6194c4d747 --- /dev/null +++ b/flows/_common_unlock_if_needed.yaml @@ -0,0 +1,16 @@ +appId: ${APPID} +--- +- runFlow: + when: + visible: "Enter your passcode" + commands: + - runFlow: _common_enter_passcode_1111.yaml +- runFlow: + when: + visible: "Proceed" + commands: + - tapOn: "Proceed" +- extendedWaitUntil: + visible: + id: "view_wallet_0" + timeout: 30000 diff --git a/flows/addNewKey.yaml b/flows/addNewKey.yaml index 1e9cec9615..7063949150 100644 --- a/flows/addNewKey.yaml +++ b/flows/addNewKey.yaml @@ -1,30 +1,32 @@ appId: ${APPID} --- -- tapOn: - id: 'btn_Manage\nKeys' +- runFlow: _common_open_manage_keys.yaml - assertVisible: - id: 'btn_Add Key' + id: "btn_Add Key" - tapOn: - id: 'btn_Add Key' + id: "btn_Add Key" - waitForAnimationToEnd: - timeout: 5000 -- scroll -- tapOn: - id: 'btn_KEEPER' + timeout: 3000 +- runFlow: + when: + visible: + id: "btn_KEEPER" + commands: + - tapOn: + id: "btn_KEEPER" - assertVisible: - id: 'btn_Add a New Mobile Key' -- tapOn: - id: 'btn_Add a New Mobile Key' -- assertVisible: Next + id: "btn_Add a New Mobile Key" - tapOn: - id: 'modal_primary_btn' -- waitForAnimationToEnd: - timeout: 20000 + id: "btn_Add a New Mobile Key" +- runFlow: + when: + visible: + id: "modal_primary_btn" + commands: + - tapOn: + id: "modal_primary_btn" - extendedWaitUntil: visible: "Manage Keys" timeout: 20000 -- assertVisible: - id: 'btn_back' - tapOn: - id: 'btn_back' -- runFlow: hidendeletekey.yaml + id: "btn_back" diff --git a/flows/addwallet.yaml b/flows/addwallet.yaml index 38c897339b..8390e84873 100644 --- a/flows/addwallet.yaml +++ b/flows/addwallet.yaml @@ -1,51 +1,50 @@ appId: ${APPID} --- -- assertTrue: ${output.text_HotWallet = "1 Wallet"} +- runFlow: _common_unlock_if_needed.yaml - assertVisible: - id: 'wallet_list' + id: "wallet_list" - swipe: - from: - id: 'wallet_list' - direction: LEFT + from: + id: "wallet_list" + direction: LEFT - assertVisible: - id: 'btn_add_wallet' + id: "btn_add_wallet" - tapOn: - id: 'btn_add_wallet' + id: "btn_add_wallet" - waitForAnimationToEnd: - timeout: 1000 -- assertTrue: ${output.text_modal_title = "Add or Import Wallet"} -- assertTrue: ${output.text_modal_subtitle = "Create purpose specific wallets having dedicated UTXOs. Manage other app wallets by importing them"} + timeout: 3000 +- assertVisible: "Add or Import Wallet" - assertVisible: - id: 'btn_Hot Wallet' + id: "btn_Hot Wallet" - assertVisible: - id: 'btn_2-of-3 Vault' + id: "btn_2-of-3 Vault" - assertVisible: - id: 'btn_3-of-5 Vault' + id: "btn_3-of-5 Vault" - assertVisible: - id: 'btn_Collaborative' + id: "btn_Collaborative" - tapOn: - id: 'btn_Hot Wallet' + id: "btn_Hot Wallet" - waitForAnimationToEnd: - timeout: 2000 + timeout: 3000 - tapOn: - id: 'input_transfer_policy' -- 'eraseText' -- inputText: '21000' + id: "input_transfer_policy" +- eraseText +- inputText: "21000" - hideKeyboard - assertVisible: - id: 'btn_primaryText' -- assertTrue: ${output.btn_primaryText = "Create"} + id: "btn_primaryText" - tapOn: - id: 'btn_primaryText' -- assertVisible: - id: modal_loading + id: "btn_primaryText" - waitForAnimationToEnd: timeout: 20000 -- assertVisible: - id: 'modal_primary_btn' -- tapOn: - id: 'modal_primary_btn' -- assertVisible: - id: 'btn_back' +- runFlow: + when: + visible: + id: "modal_primary_btn" + commands: + - tapOn: + id: "modal_primary_btn" +- assertVisible: + id: "btn_back" - tapOn: - id: 'btn_back' + id: "btn_back" diff --git a/flows/appsettings.yaml b/flows/appsettings.yaml index d4aec33bf3..c450fa71db 100644 --- a/flows/appsettings.yaml +++ b/flows/appsettings.yaml @@ -1,43 +1,49 @@ appId: ${APPID} --- -# - runFlow: login.yaml +- runFlow: _common_unlock_if_needed.yaml - tapOn: - id: btn_AppSettingsIcon -- assertVisible: - id: 'btn_back' -- assertVisible: 'App Settings' -- assertVisible: 'Configure your app here' -- assertVisible: - id: 'btn_App_Backup}' -- assertVisible: - id: 'view_Biometrics' -- assertVisible: - id: 'view_Dark_Mode' -- assertVisible: - id: 'view_Node_Settings' -- assertVisible: - id: 'view_Version_History' -- assertVisible: - id: 'view_Tor_Settings' -- assertVisible: - id: 'view_Language_&_Currency' -- assertVisible: - id: 'view_ KeeperTelegram' -- assertVisible: - id: 'view_keeperTwitter' -- assertVisible: - id: 'btn_FAQ' -- assertVisible: - id: 'text_termsCondition' -- assertVisible: - id: 'text_privacyPolicy' + id: "btn_AppSettingsIcon" +- assertVisible: + id: "btn_back" +- assertVisible: "App Settings" +- runFlow: + when: + visible: + id: "btn_App_Backup" + commands: + - assertVisible: + id: "btn_App_Backup" +- runFlow: + when: + visible: "Backup Wallet" + commands: + - assertVisible: "Backup Wallet" +- assertVisible: + id: "view_Biometrics" +- assertVisible: + id: "view_Dark_Mode" +- assertVisible: + id: "view_Node_Settings" +- assertVisible: + id: "view_Version_History" +- assertVisible: + id: "view_Tor_Settings" +- assertVisible: + id: "view_Language_&_Currency" +- runFlow: + when: + visible: + id: "view_KeeperTelegram" + commands: + - assertVisible: + id: "view_KeeperTelegram" +- assertVisible: + id: "view_keeperTwitter" - tapOn: - id: 'view_Dark_Mode' - delay: 1000 + id: "view_Dark_Mode" - tapOn: - id: 'view_Dark_Mode' - delay: 1000 + id: "view_Dark_Mode" - runFlow: exportseed.yaml - runFlow: versionhistory.yaml - tapOn: - id: 'btn_back' + id: "btn_back" diff --git a/flows/buyBTC.yaml b/flows/buyBTC.yaml index a946893831..89b71fdd5a 100644 --- a/flows/buyBTC.yaml +++ b/flows/buyBTC.yaml @@ -1,25 +1,21 @@ appId: ${APPID} --- +- runFlow: _common_open_wallet.yaml +- assertVisible: + id: "btn_Buy" - tapOn: - id: 'view_wallet_0' - index: 0 -- swipe: - from: - id: list_transactions - direction: DOWN - duration: 2000 -- waitForAnimationToEnd: - timeout: 5000 -- repeat: - while: + id: "btn_Buy" +- runFlow: + when: visible: - id: 'icon_unconfirmed_0' + id: "btn_Buy Bitcoin" commands: - - runFlow: refreshwallet.yaml -- assertVisible: - id: 'btn_Buy Bitcoin' -- tapOn: - id: 'btn_Buy Bitcoin' -- tapOn: - id: 'btn_primaryText' - + - tapOn: + id: "btn_Buy Bitcoin" +- runFlow: + when: + visible: + id: "btn_primaryText" + commands: + - tapOn: + id: "btn_primaryText" diff --git a/flows/cancellationNavigation.yaml b/flows/cancellationNavigation.yaml new file mode 100644 index 0000000000..f27d945b1b --- /dev/null +++ b/flows/cancellationNavigation.yaml @@ -0,0 +1,24 @@ +appId: ${APPID} +--- +- runFlow: _common_open_wallet.yaml +- tapOn: + id: "btn_Receive" +- assertVisible: + id: "btn_back" +- tapOn: + id: "btn_back" +- tapOn: + id: "btn_Send" +- runFlow: _common_handle_runtime_permissions.yaml +- assertVisible: + id: "btn_back" +- tapOn: + id: "btn_back" +- tapOn: + id: "btn_Settings" +- assertVisible: + id: "btn_back" +- tapOn: + id: "btn_back" +- tapOn: + id: "btn_back" diff --git a/flows/copywalletaddress.yaml b/flows/copywalletaddress.yaml index e646f386c0..bad36d29bd 100644 --- a/flows/copywalletaddress.yaml +++ b/flows/copywalletaddress.yaml @@ -1,24 +1,16 @@ appId: ${APPID} --- -# - runFlow: login.yaml +- runFlow: _common_open_wallet.yaml - tapOn: - id: 'view_wallet_0' - index: 0 + id: "btn_Receive" - tapOn: - id: 'btn_Receive' -- tapOn: - id: 'btn_copy_address' -- repeat: - while: - visible: 'Address Copied Successfully' + id: "btn_copy_address" +- runFlow: + when: + visible: "Address Copied Successfully" commands: - - tapOn: - id: 'btn_copy_address' + - assertVisible: "Address Copied Successfully" - tapOn: - id: 'btn_back' -- waitForAnimationToEnd: - timeout: 1000 + id: "btn_back" - tapOn: - id: 'btn_back' -- waitForAnimationToEnd: - timeout: 1000 + id: "btn_back" diff --git a/flows/editwallet.yaml b/flows/editwallet.yaml index d3ae9c2884..4b36755bd5 100644 --- a/flows/editwallet.yaml +++ b/flows/editwallet.yaml @@ -1,10 +1,15 @@ appId: ${APPID} --- -- runFlow: login.yaml +- runFlow: _common_unlock_if_needed.yaml +- runFlow: + when: + visible: + id: "btn_LinkedWallet" + commands: + - tapOn: + id: "btn_LinkedWallet" - tapOn: - id: 'btn_LinkedWallet' + id: "btn_walletSettings" - tapOn: - id: 'btn_walletSettings' -- tapOn: - id: 'btn_Wallet_Details' -- assertVisible: 'Edit wallet name and description' + id: "btn_Wallet_Details" +- assertVisible: "Edit wallet name and description" diff --git a/flows/editwalletdetails.yaml b/flows/editwalletdetails.yaml index 919e1e9fcb..cadb599fb7 100644 --- a/flows/editwalletdetails.yaml +++ b/flows/editwalletdetails.yaml @@ -1,67 +1,45 @@ appId: ${APPID} --- -# - runFlow: login.yaml +- runFlow: _common_open_wallet.yaml - tapOn: - id: 'view_wallet_0' - index: 0 -- tapOn: - id: 'btn_Settings' -- waitForAnimationToEnd: - timeout: 1000 -- assertVisible: - id: 'btn_back' -- assertTrue: ${output.text_header_title = "Wallet Settings"} -- assertTrue: ${output.text_header_subtitle = "Setting for the wallet only"} + id: "btn_Settings" - assertVisible: - id: 'view_Wallet_Details' + id: "btn_back" +- assertVisible: "Wallet Settings" - tapOn: - id: 'view_Wallet_Details' - delay: 500 -- waitForAnimationToEnd: - timeout: 1000 -- assertVisible: - id: 'btn_back' -- assertTrue: ${output.text_header_title = "Wallet Details"} -- assertTrue: ${output.text_header_subtitle = "Name, details and transfer policy"} -- assertVisible: - id: 'view_Edit_wallet_name_and_description' -- assertVisible: - id: 'view_Show_xPub' -- assertVisible: - id: 'view_Derivation_Path' -- assertVisible: - id: view_Transfer_Policy + id: "view_Wallet_Details" +- assertVisible: "Wallet Details" - assertVisible: - id: 'text_note_title' -- assertTrue: ${output.text_note_title = "Note"} -- assertTrue: ${output.text_note_subtitle = "These settings are for your selected wallet only and does not affect other wallets"} + id: "view_Edit_wallet_name_and_description" - tapOn: - id: 'view_Edit_wallet_name_and_description' -- assertTrue: ${output.text_header_subtitle = "Edit wallet name and description"} + id: "view_Edit_wallet_name_and_description" +- assertVisible: "Edit wallet name and description" - tapOn: - id: 'input_walletName' -- 'eraseText' + id: "input_walletName" +- eraseText - inputRandomPersonName -- inputText: "'s wallet" +- inputText: " wallet" - tapOn: - id: 'input_walletDescription' -- 'eraseText' + id: "input_walletDescription" +- eraseText - inputRandomText -- inputRandomEmail -- inputRandomNumber - hideKeyboard -- assertVisible: 'Cancel' - tapOn: - id: 'btn_primaryText' -- assertVisible: - id: modal_loading + id: "btn_primaryText" +- runFlow: + when: + visible: + id: "modal_loading" + commands: + - waitForAnimationToEnd: + timeout: 5000 - runFlow: when: - notVisible: - id: 'modal_loading' + visible: "Wallet details updated" commands: - - assertVisible: 'Wallet details updated' - tapOn: - id: 'btn_back' - repeat: 3 - delay: 500 + id: "btn_back" +- tapOn: + id: "btn_back" +- tapOn: + id: "btn_back" diff --git a/flows/exportseed.yaml b/flows/exportseed.yaml index 6c2b3501c3..49f4682446 100644 --- a/flows/exportseed.yaml +++ b/flows/exportseed.yaml @@ -1,48 +1,55 @@ appId: ${APPID} --- -- tapOn: - id: 'btn_App_Backup}' -- waitForAnimationToEnd: - timeout: 1000 -- assertVisible: - id: 'btn_back' -- assertVisible: 'Backup Wallet' -- assertVisible: 'Setup backup for Keeper' -- assertVisible: - id: 'view_Export_app_individual_phrase' -- tapOn: - id: 'view_Export_app_individual_phrase' - waitToSettleTimeoutMs: 500 -- waitForAnimationToEnd: - timeout: 5000 -- assertVisible: 'Confirm Passcode' -- assertVisible: 'To backup app recovery phrase' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_2' -- tapOn: - id: 'key_3' -- tapOn: - id: 'key_4' -- assertVisible: - id: 'btn_primaryText' -- tapOn: - id: 'btn_primaryText' -- assertVisible: 'Recovery Phrase' -- tapOn: 'Make sure you keep them safe' -- tapOn: - id: 'btn_seed_word_0' -- assertTrue: '${output.text_seed_word_0 != "*****"}' -- tapOn: - id: 'btn_seed_word_3' -- assertTrue: '${output.text_seed_word_0 ="*****"}' -- assertTrue: '${output.text_seed_word_3 != "*****"}' -- tapOn: - id: 'btn_back' -- waitForAnimationToEnd: - timeout: 1000 -- tapOn: - id: 'btn_back' -- waitForAnimationToEnd: - timeout: 1000 +- runFlow: + when: + visible: + id: "view_Export_app_individual_phrase" + commands: + - tapOn: + id: "view_Export_app_individual_phrase" +- runFlow: + when: + visible: + id: "btn_App_Backup" + commands: + - tapOn: + id: "btn_App_Backup" + - tapOn: + id: "view_Export_app_individual_phrase" +- runFlow: + when: + visible: "Backup Wallet" + commands: + - tapOn: "Backup Wallet" + - tapOn: + id: "view_Export_app_individual_phrase" +- extendedWaitUntil: + visible: "Confirm Passcode" + timeout: 15000 +- runFlow: _common_enter_passcode_1111.yaml +- runFlow: + when: + visible: + id: "btn_primaryText" + commands: + - tapOn: + id: "btn_primaryText" +- extendedWaitUntil: + visible: "Recovery Phrase" + timeout: 20000 +- runFlow: + when: + visible: + id: "btn_seed_word_0" + commands: + - tapOn: + id: "btn_seed_word_0" +- runFlow: + when: + visible: + id: "btn_back" + commands: + - tapOn: + id: "btn_back" + - tapOn: + id: "btn_back" diff --git a/flows/healthCheckKey.yaml b/flows/healthCheckKey.yaml index c5bba973b6..ac76c5c469 100644 --- a/flows/healthCheckKey.yaml +++ b/flows/healthCheckKey.yaml @@ -1,29 +1,31 @@ appId: ${APPID} --- +- runFlow: _common_open_manage_keys.yaml - tapOn: - id: 'btn_Manage\nKeys' -- tapOn: - id: 'btn_Mobile Key' + id: "btn_Mobile Key" index: 0 - tapOn: - id: 'btn_Health Check' -- assertVisible: - id: 'modal_secondary_btn' -- tapOn: - id: 'modal_secondary_btn' + id: "btn_Health Check" +- runFlow: + when: + visible: + id: "modal_secondary_btn" + commands: + - tapOn: + id: "modal_secondary_btn" +- runFlow: + when: + visible: + id: "modal_secondary_btn" + commands: + - tapOn: + id: "modal_secondary_btn" - assertVisible: - id: 'modal_secondary_btn' + id: "btn_back" - tapOn: - id: 'modal_secondary_btn' -- assertVisible: - id: 'btn_back' -- tapOn: - id: 'btn_back' + id: "btn_back" - extendedWaitUntil: visible: "Manage Keys" timeout: 20000 -- assertVisible: - id: 'btn_back' - tapOn: - id: 'btn_back' - + id: "btn_back" diff --git a/flows/hidendeletekey.yaml b/flows/hidendeletekey.yaml index cd27efbd4f..a30f6b4ecd 100644 --- a/flows/hidendeletekey.yaml +++ b/flows/hidendeletekey.yaml @@ -1,84 +1,34 @@ appId: ${APPID} --- +- runFlow: _common_open_manage_keys.yaml - tapOn: - id: 'btn_Manage\nKeys' -- tapOn: - id: 'btn_Mobile Key' - index: 0 -- tapOn: - id: 'btn_Settings' -- tapOn: - id: 'btn_Hide signer' -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'btn_primaryText' -- assertVisible: - id: 'btn_manage_singner_setting' -- tapOn: - id: 'btn_manage_singner_setting' -- assertVisible: - id: 'btn_Show and delete keys' -- tapOn: - id: 'btn_Show and delete keys' -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'btn_primaryText' -- assertVisible: - id: 'btn_Delete' - index: 0 -- tapOn: - id: 'btn_Delete' + id: "btn_Mobile Key" index: 0 -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'btn_primaryText' -- assertVisible: - id: 'btn_back' -- tapOn: - id: 'btn_back' -- assertVisible: - id: 'btn_back' - tapOn: - id: 'btn_back' + id: "btn_Settings" +- runFlow: + when: + visible: + id: "btn_Hide signer" + commands: + - tapOn: + id: "btn_Hide signer" + - assertVisible: + id: "modal_passcode_verify" + - runFlow: _common_enter_passcode_1111.yaml + - tapOn: + id: "btn_primaryText" +- runFlow: + when: + visible: + id: "btn_Show and delete keys" + commands: + - assertVisible: + id: "btn_Show and delete keys" +- tapOn: + id: "btn_back" - extendedWaitUntil: visible: "Manage Keys" - timeout: 20000 -- assertVisible: - id: 'btn_back' + timeout: 15000 - tapOn: - id: 'btn_back' -- runFlow: healthCheckKey.yaml - + id: "btn_back" diff --git a/flows/keySetting.yaml b/flows/keySetting.yaml index df63ceeeb0..6b47dda6c4 100644 --- a/flows/keySetting.yaml +++ b/flows/keySetting.yaml @@ -1,9 +1,12 @@ appId: ${APPID} --- +- runFlow: _common_open_manage_keys.yaml - tapOn: - id: 'btn_Manage\nKeys' -- tapOn: - id: 'btn_Mobile Key' + id: "btn_Mobile Key" index: 0 - tapOn: - id: 'btn_Settings' + id: "btn_Settings" +- assertVisible: + id: "btn_back" +- tapOn: + id: "btn_back" diff --git a/flows/login.yaml b/flows/login.yaml index fa63365825..6194c4d747 100644 --- a/flows/login.yaml +++ b/flows/login.yaml @@ -1,32 +1,16 @@ appId: ${APPID} --- +- runFlow: + when: + visible: "Enter your passcode" + commands: + - runFlow: _common_enter_passcode_1111.yaml +- runFlow: + when: + visible: "Proceed" + commands: + - tapOn: "Proceed" - extendedWaitUntil: - visible: 'Enter your passcode' - timeout: 20000 -- assertNotVisible: 'Proceed' -- tapOn: '1' -- tapOn: '2' -- tapOn: '3' -- tapOn: '7' -- assertVisible: 'Proceed' -- tapOn: 'Proceed' -- waitForAnimationToEnd: - timeout: 5000 -- assertVisible: 'Incorrect password' -- assertNotVisible: 'Proceed' -- assertVisible: 'Retry' -- tapOn: 'Retry' -- tapOn: '1' -- tapOn: '1' -- tapOn: '1' -- tapOn: '1' -- assertVisible: 'Proceed' -- tapOn: 'Proceed' -- waitForAnimationToEnd: - timeout: 5000 -- extendedWaitUntil: - visible: 'Next' + visible: + id: "view_wallet_0" timeout: 30000 -- tapOn: 'Next' -- waitForAnimationToEnd: - timeout: 2000 diff --git a/flows/newapp.yaml b/flows/newapp.yaml index a2c18a6dad..b9da60dca8 100644 --- a/flows/newapp.yaml +++ b/flows/newapp.yaml @@ -2,19 +2,19 @@ appId: ${APPID} --- - runFlow: setpin.yaml - extendedWaitUntil: - visible: 'Welcome' - timeout: 5000 + visible: "Welcome" + timeout: 15000 - assertVisible: - id: 'view_startNewTile' + id: "view_startNewTile" - tapOn: - id: 'view_startNewTile' + id: "view_startNewTile" - extendedWaitUntil: - visible: 'Next' + visible: "Next" timeout: 30000 -- tapOn: 'Next' +- tapOn: "Next" - waitForAnimationToEnd: timeout: 2000 - extendedWaitUntil: - notVisible: - id: 'toast_message' - timeout: 20000 + visible: + id: "view_wallet_0" + timeout: 30000 diff --git a/flows/permissionHandling.yaml b/flows/permissionHandling.yaml new file mode 100644 index 0000000000..9d57a55d37 --- /dev/null +++ b/flows/permissionHandling.yaml @@ -0,0 +1,22 @@ +appId: ${APPID} +--- +- runFlow: _common_open_wallet.yaml +- tapOn: + id: "btn_Send" +- runFlow: + when: + visible: + id: "com.android.permissioncontroller:id/permission_deny_button" + commands: + - tapOn: + id: "com.android.permissioncontroller:id/permission_deny_button" + - assertVisible: "Scan a bitcoin address" +- runFlow: + when: + visible: "Don’t Allow" + commands: + - tapOn: "Don’t Allow" + - assertVisible: "Scan a bitcoin address" +- runFlow: _common_handle_runtime_permissions.yaml +- tapOn: + id: "btn_back" diff --git a/flows/receive.yaml b/flows/receive.yaml index e05bb99d0d..17f087ddc6 100644 --- a/flows/receive.yaml +++ b/flows/receive.yaml @@ -1,26 +1,13 @@ appId: ${APPID} --- -- tapOn: - id: 'view_wallet_0' - index: 0 -- swipe: - from: - id: list_transactions - direction: DOWN - duration: 2000 -- waitForAnimationToEnd: - timeout: 5000 -- repeat: - while: - visible: - id: 'icon_unconfirmed_0' - commands: - - runFlow: refreshwallet.yaml +- runFlow: _common_open_wallet.yaml - assertVisible: - id: 'btn_Receive' + id: "btn_Receive" - tapOn: - id: 'btn_Receive' + id: "btn_Receive" +- assertVisible: + id: "btn_copy_address" - tapOn: - id: 'btn_back' + id: "btn_back" - tapOn: - id: 'btn_back' + id: "btn_back" diff --git a/flows/receivesats.yaml b/flows/receivesats.yaml index d2c5cbd286..9da9727887 100644 --- a/flows/receivesats.yaml +++ b/flows/receivesats.yaml @@ -1,24 +1,22 @@ appId: ${APPID} --- -# - runFlow: login.yaml +- runFlow: _common_open_wallet.yaml - tapOn: - id: 'view_wallet_0' - index: 0 -- tapOn: - id: btn_Settings -- assertVisible: - id: 'view_Receive_Test_Sats' -- tapOn: - id: 'view_Receive_Test_Sats' -- extendedWaitUntil: - visible: '5000 Sats Received' - timeout: 30000 -- repeat: - while: - notVisible: - id: 'btn_transaction_0' + id: "btn_Settings" +- runFlow: + when: + visible: + id: "view_Receive_Test_Sats" + commands: + - tapOn: + id: "view_Receive_Test_Sats" + - extendedWaitUntil: + visible: "5000 Sats Received" + timeout: 30000 +- runFlow: + when: + visible: + id: "btn_back" commands: - - swipe: - from: - id: list_transactions - direction: DOWN + - tapOn: + id: "btn_back" diff --git a/flows/refreshwallet.yaml b/flows/refreshwallet.yaml index 61fc93321c..f7ed08e5a2 100644 --- a/flows/refreshwallet.yaml +++ b/flows/refreshwallet.yaml @@ -1,7 +1,14 @@ appId: ${APPID} --- -- swipe: - from: - id: list_transactions - direction: DOWN - duration: 15000 +- runFlow: + when: + visible: + id: "list_transactions" + commands: + - swipe: + from: + id: "list_transactions" + direction: DOWN + duration: 1500 +- waitForAnimationToEnd: + timeout: 2000 diff --git a/flows/sanity.yaml b/flows/sanity.yaml index 8bac3e6114..66b09a54ed 100644 --- a/flows/sanity.yaml +++ b/flows/sanity.yaml @@ -2,5 +2,15 @@ appId: ${APPID} --- - runFlow: newapp.yaml - runFlow: addwallet.yaml +- runFlow: viewwallet.yaml +- runFlow: walletSetting.yaml +- runFlow: receive.yaml +- runFlow: copywalletaddress.yaml +- runFlow: sendInvalidInput.yaml +- runFlow: cancellationNavigation.yaml - runFlow: addNewKey.yaml - +- runFlow: keySetting.yaml +- runFlow: healthCheckKey.yaml +- runFlow: appsettings.yaml +- runFlow: buyBTC.yaml +- runFlow: subscription.yaml diff --git a/flows/send.yaml b/flows/send.yaml index 2e553e5a80..36555ebabd 100644 --- a/flows/send.yaml +++ b/flows/send.yaml @@ -1,96 +1,51 @@ appId: ${APPID} --- -- tapOn: - id: 'view_wallet_0' - index: 0 -- swipe: - from: - id: list_transactions - direction: DOWN - duration: 2000 -- waitForAnimationToEnd: - timeout: 5000 -- repeat: - while: - visible: - id: 'icon_unconfirmed_0' - commands: - - runFlow: refreshwallet.yaml +- runFlow: _common_open_wallet.yaml - assertVisible: - id: 'btn_Send' + id: "btn_Send" - tapOn: - id: 'btn_Send' -- waitForAnimationToEnd: - timeout: 2000 -- runFlow: - when: - visible: - id: 'com.android.permissioncontroller:id/grant_dialog' - commands: - - tapOn: - id: 'com.android.permissioncontroller:id/permission_allow_foreground_only_button' -- assertTrue: ${output.text_header_title = "Send"} -- assertTrue: ${output.text_header_subtitle = "Scan a bitcoin address"} -- assertVisible: - id: 'qrscanner' -- assertVisible: - id: 'btn_upload_image' + id: "btn_Send" +- runFlow: _common_handle_runtime_permissions.yaml - assertVisible: - id: 'input_receive_address' + id: "input_receive_address" - tapOn: - id: 'input_receive_address' -- inputText: 'tb1qq4yupzkhnzlz8kva9udnud6rw5vezk5qr7kp7s' -- waitForAnimationToEnd: - timeout: 2000 -- assertTrue: ${output.text_header_title = "Enter the Amount"} + id: "input_receive_address" +- inputText: "tb1qq4yupzkhnzlz8kva9udnud6rw5vezk5qr7kp7s" - assertVisible: - id: 'view_wallet_info' -- assertVisible: - id: 'input_amount' -- assertVisible: - id: 'text_sendmax' -- assertVisible: - id: 'input_note' -- assertVisible: - id: 'input_amount' + id: "input_amount" - tapOn: - id: 'input_amount' -- inputText: '0.00001100' + id: "input_amount" +- eraseText +- inputText: "0.00001100" - tapOn: - id: 'input_note' -- inputText: 'Testing with maestro' -- tapOn: - id: 'input_amount' -- inputText: 'Test' + id: "input_note" +- inputText: "Maestro send flow" - hideKeyboard - tapOn: - id: 'btn_primaryText' -- waitForAnimationToEnd: - timeout: 2000 -- assertTrue: ${output.text_header_title = "Sending to address"} -- assertTrue: ${output.text_header_subtitle = "Choose priority and fee"} -- assertVisible: 'tb1qq4yupzkhnzlz8kva9udnud6rw5vezk5qr7kp7s' -- assertVisible: 'Transaction Priority' -- tapOn: - id: 'btn_primaryText' -- assertVisible: - id: 'modal_passcode_verify' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- tapOn: - id: 'key_1' -- assertVisible: - id: 'btn_primaryText' -- tapOn: - id: 'btn_primaryText' -- extendedWaitUntil: - visible: 'Send Successful' - timeout: 30000 -- assertVisible: 'The transaction has been successfully broadcasted' -- tapOn: - text: 'View Details' - index: 1 + id: "btn_primaryText" +- runFlow: + when: + visible: "Insufficient balance" + commands: + - assertVisible: "Insufficient balance" + - tapOn: + id: "btn_back" +- runFlow: + when: + visible: "Sending to address" + commands: + - tapOn: + id: "btn_primaryText" + - assertVisible: + id: "modal_passcode_verify" + - runFlow: _common_enter_passcode_1111.yaml + - tapOn: + id: "btn_primaryText" + - extendedWaitUntil: + visible: "Send Successful" + timeout: 30000 + - runFlow: + when: + visible: "View Details" + commands: + - tapOn: "View Details" diff --git a/flows/sendInvalidInput.yaml b/flows/sendInvalidInput.yaml new file mode 100644 index 0000000000..4373801440 --- /dev/null +++ b/flows/sendInvalidInput.yaml @@ -0,0 +1,22 @@ +appId: ${APPID} +--- +- runFlow: _common_open_wallet.yaml +- tapOn: + id: "btn_Send" +- runFlow: _common_handle_runtime_permissions.yaml +- assertVisible: + id: "btn_primaryText" +- tapOn: + id: "btn_primaryText" +- runFlow: + when: + visible: "Scan a bitcoin address" + commands: + - assertVisible: "Scan a bitcoin address" +- runFlow: + when: + visible: "Enter bitcoin address" + commands: + - assertVisible: "Enter bitcoin address" +- tapOn: + id: "btn_back" diff --git a/flows/setpin.yaml b/flows/setpin.yaml index a91611fb2d..7087e25aef 100644 --- a/flows/setpin.yaml +++ b/flows/setpin.yaml @@ -1,40 +1,39 @@ appId: ${APPID} --- - extendedWaitUntil: - visible: 'Create a passcode' + visible: "Create a passcode" timeout: 20000 -- assertVisible: 'Create' +- assertVisible: "Create" - tapOn: - id: 'key_1' + id: "key_1" - tapOn: - id: 'key_1' + id: "key_1" - tapOn: - id: 'key_1' + id: "key_1" - tapOn: - id: 'key_1' + id: "key_1" - waitForAnimationToEnd: timeout: 2000 -- assertVisible: 'Create' -- assertVisible: 'Confirm your passcode' +- assertVisible: "Create" +- assertVisible: "Confirm your passcode" - tapOn: - id: 'key_1' + id: "key_1" - tapOn: - id: 'key_1' + id: "key_1" - tapOn: - id: 'key_1' + id: "key_1" - tapOn: - id: 'key_4' -- assertVisible: 'Passcodes do NOT match' + id: "key_4" +- assertVisible: "Passcodes do NOT match" - tapOn: - id: 'btn_clear' -- assertNotVisible: 'Passcodes do NOT match' -- tapOn: - id: 'key_1' -- tapOn: 'Create' + id: "btn_clear" +- assertNotVisible: "Passcodes do NOT match" +- runFlow: _common_enter_passcode_1111.yaml +- tapOn: "Create" - waitForAnimationToEnd: timeout: 5000 -- assertVisible: 'Continue' -- tapOn: 'Continue' +- assertVisible: "Continue" +- tapOn: "Continue" - swipe: direction: LEFT - swipe: @@ -43,5 +42,5 @@ appId: ${APPID} direction: LEFT - waitForAnimationToEnd: timeout: 5000 -- assertVisible: 'Start App' -- tapOn: 'Start App' +- assertVisible: "Start App" +- tapOn: "Start App" diff --git a/flows/subscription.yaml b/flows/subscription.yaml index 4ef8508cb3..908134ac17 100644 --- a/flows/subscription.yaml +++ b/flows/subscription.yaml @@ -1,11 +1,22 @@ appId: ${APPID} --- -- assertVisible: - id: 'btn_choosePlan' -- tapOn: - id: 'btn_choosePlan' -- tapOn: - id: 'btn_Mobile Key' - index: 0 -- tapOn: - id: 'btn_Settings' +- runFlow: _common_unlock_if_needed.yaml +- runFlow: + when: + visible: + id: "btn_choosePlan" + commands: + - tapOn: + id: "btn_choosePlan" +- runFlow: + when: + visible: "Subscription" + commands: + - assertVisible: "Subscription" +- runFlow: + when: + visible: + id: "btn_back" + commands: + - tapOn: + id: "btn_back" diff --git a/flows/versionhistory.yaml b/flows/versionhistory.yaml index 6642c91e4a..ae812bd390 100644 --- a/flows/versionhistory.yaml +++ b/flows/versionhistory.yaml @@ -1,19 +1,13 @@ appId: ${APPID} --- - tapOn: - id: 'view_Version_History' + id: "view_Version_History" - waitForAnimationToEnd: - timeout: 1000 + timeout: 1500 - assertVisible: - id: 'btn_back' -- assertTrue: ${output.text_header_title = "Version History"} -- assertTrue: ${output.text_header_subtitle = "You can verify the history of your app upgrades here"} + id: "btn_back" +- assertVisible: "Version History" - assertVisible: - id: 'view_VersionHistoryList' -- assertVisible: 'Initially installed' -- assertVisible: - id: 'text_appid' + id: "view_VersionHistoryList" - tapOn: - id: 'btn_back' -- waitForAnimationToEnd: - timeout: 1000 + id: "btn_back" diff --git a/flows/viewwallet.yaml b/flows/viewwallet.yaml index c82f285532..d3e05702bf 100644 --- a/flows/viewwallet.yaml +++ b/flows/viewwallet.yaml @@ -1,46 +1,41 @@ appId: ${APPID} --- -# - runFlow: login.yaml +- runFlow: _common_unlock_if_needed.yaml - tapOn: - id: 'view_wallet_0' -- assertVisible: 'Bip-85 Wallets' -- assertVisible: 'Create as many (hot) wallets as you want, and backup with a single Recovery Phrase' -- assertVisible: 'You can use the individual wallet’s Recovery Phrases to connect other bitcoin apps to Keeper' -- assertVisible: 'When the funds in a wallet cross a threshold, a transfer to the Vault is triggered. This ensures you don’t have more sats in hot wallets than you need.' + id: "view_wallet_0" + index: 0 +- runFlow: + when: + visible: + id: "btn_close_modal" + commands: + - assertVisible: "Continue" + - tapOn: + id: "btn_close_modal" - assertVisible: - id: 'btn_close_modal' -- assertVisible: 'See FAQs' -- assertVisible: Continue -- tapOn: - id: 'btn_close_modal' -- assertVisible: - id: 'btn_back' + id: "btn_back" - assertVisible: - id: 'btn_learnMore' -- assertVisible: 'Wallet 1' -- assertVisible: 'Single-sig bitcoin wallet' -- assertVisible: 'Unconfirmed' -- assertVisible: 'Available Balance' -- assertVisible: 'Transfer Policy is set at ' -- assertVisible: 'Transactions' -- assertVisible: 'No transactions yet.' + id: "btn_learnMore" +- assertVisible: "Available Balance" +- assertVisible: "Transactions" - assertVisible: - id: 'btn_Send' + id: "btn_Send" - assertVisible: - id: 'btn_Receive' + id: "btn_Receive" - assertVisible: - id: 'btn_Buy' + id: "btn_Buy" - assertVisible: - id: 'btn_Settings' -- tapOn: - id: 'btn_learnMore' -- assertVisible: 'Bip-85 Wallets' -- assertVisible: 'Create as many (hot) wallets as you want, and backup with a single Recovery Phrase' -- assertVisible: 'You can use the individual wallet’s Recovery Phrases to connect other bitcoin apps to Keeper' -- assertVisible: 'When the funds in a wallet cross a threshold, a transfer to the Vault is triggered. This ensures you don’t have more sats in hot wallets than you need.' + id: "btn_Settings" - tapOn: - id: 'btn_close_modal' + id: "btn_learnMore" +- runFlow: + when: + visible: + id: "btn_close_modal" + commands: + - tapOn: + id: "btn_close_modal" - waitForAnimationToEnd: - timeout: 3000 + timeout: 2000 - tapOn: - id: 'btn_back' + id: "btn_back" diff --git a/flows/walletSetting.yaml b/flows/walletSetting.yaml index fbd85fc9ae..44e9fdd02a 100644 --- a/flows/walletSetting.yaml +++ b/flows/walletSetting.yaml @@ -1,22 +1,12 @@ appId: ${APPID} --- +- runFlow: _common_open_wallet.yaml +- assertVisible: + id: "btn_Settings" - tapOn: - id: 'view_wallet_0' - index: 0 -- swipe: - from: - id: list_transactions - direction: DOWN - duration: 2000 -- waitForAnimationToEnd: - timeout: 5000 -- repeat: - while: - visible: - id: 'icon_unconfirmed_0' - commands: - - runFlow: refreshwallet.yaml + id: "btn_Settings" +- assertVisible: "Wallet Settings" - assertVisible: - id: 'btn_Settings' + id: "view_Wallet_Details" - tapOn: - id: 'btn_Settings' + id: "btn_back"