Joint Account QA Testing Guide
This document outlines all test scenarios for the Joint Account feature.
Joint Account Creation
Joint Account Invitation
Inbox & Notifications
Transaction Signing
Ledger Hardware Wallet
Deep Link Flows
WalletConnect with Joint Account
Export/Share Account
Account Management
Limitations & Constraints Testing
Edge Cases & Error Handling
Multi-Device Scenarios
Performance & Stress Testing
1. Joint Account Creation
#
Scenario
Steps
Expected Result
1.1.1
Create 2-of-2 joint account
1. Add Account → Joint Account 2. Select 2 participant accounts 3. Set threshold to 2 4. Enter name 5. Confirm
Joint account created successfully, appears in account list
1.1.2
Create 2-of-3 joint account
1. Select 3 participants 2. Set threshold to 2 3. Complete creation
Joint account created with 2-of-3 threshold
1.1.3
Create 3-of-3 joint account
Select 3 participants, threshold 3
Joint account created
1.1.4
Create with minimum participants (2)
Select exactly 2 participants
Should work
1.1.5
Create with maximum participants
Select maximum allowed participants
Should work or show limit error
1.2 Participant Selection
#
Scenario
Steps
Expected Result
1.2.1
Select local accounts only
Choose from local accounts
Works correctly
1.2.2
Add external address manually
Enter external Algorand address
Address added to participants
1.2.3
Add contact as participant
Select from contacts list
Contact added as participant with name
1.2.4
Mix of local + external participants
Select 1 local + 1 external address
Both added correctly
1.2.5
Duplicate participant prevention
Try to add same address twice
Should prevent/show error
1.2.6
Invalid address format
Enter invalid Algorand address
Show validation error
1.2.7
Add multiple contacts
Select several contacts as participants
All contacts added correctly
1.2.8
Contact without valid address
Select contact with invalid/empty address
Show error or prevent selection
1.2.9
Search contacts
Search for contact by name
Matching contacts shown
1.2.10
Add participant via NFD name
Enter "alice.algo" instead of address
NFD resolved, participant added
1.2.11
Invalid NFD name
Enter non-existent NFD
Error message shown
1.2.12
Paste NFD name
Paste NFD name from clipboard
NFD resolved correctly
#
Scenario
Steps
Expected Result
1.3.1
Threshold = participants
Set threshold equal to participant count
Valid
1.3.2
Threshold < participants
Set threshold less than participant count
Valid
1.3.3
Threshold > participants
Try to set threshold higher than participants
Should be prevented
1.3.4
Threshold = 1
Set threshold to 1
Should this be allowed? Verify behavior
#
Scenario
Steps
Expected Result
1.4.1
Custom name
Enter custom account name
Name saved and displayed
1.4.2
Empty name
Leave name empty
Default name assigned or validation error
1.4.3
Long name
Enter very long name (100+ chars)
Truncated or validation error
1.4.4
Special characters
Use emojis, symbols in name
Should handle gracefully
2. Joint Account Invitation
2.1 Receiving Invitations
#
Scenario
Steps
Expected Result
2.1.1
Receive invitation as participant
Other user creates joint account with your address
Invitation appears in inbox
2.1.2
Accept invitation
Click "Add" on invitation
Joint account added locally
2.1.3
Reject/Ignore invitation
Click "Ignore" on invitation
Invitation dismissed, not added
2.1.4
View invitation details
Open invitation
Shows threshold, all participants
2.1.5
Multiple pending invitations
Receive multiple invitations
All appear in inbox separately
2.2 Invitation Persistence
#
Scenario
Steps
Expected Result
2.2.1
Invitation persists after app restart
Receive invitation → close app → reopen
Invitation still in inbox
2.2.2
Invitation after accepting
Accept invitation
Invitation removed from inbox
2.2.3
Invitation after ignoring
Ignore invitation
Invitation removed from inbox
#
Scenario
Steps
Expected Result
3.1.1
Empty inbox
No pending items
Shows empty state
3.1.2
Joint account invitations
Pending invitations exist
Shows in inbox with correct info
3.1.3
Sign requests
Pending sign requests exist
Shows in inbox with status
3.1.4
Mixed inbox items
Invitations + sign requests + asset inbox
All displayed correctly
3.1.5
Inbox badge count
Multiple pending items
Badge shows correct count
#
Scenario
Steps
Expected Result
3.2.1
Pending sign request
Sign request waiting for signatures
Shows "Pending", signature count (e.g., "1 of 4 signed")
3.2.2
Time remaining
Sign request with expiration
Shows time left (e.g., "≈ 2h left")
3.2.3
Expired sign request
Sign request past expiration
[KNOWN ISSUE] Currently still shows as "Pending"
3.2.4
Fully signed request
All signatures collected
Should show completed or be removed
#
Scenario
Steps
Expected Result
3.3.1
Pull to refresh
Pull down on inbox
Refreshes inbox items
3.3.2
Auto-refresh on open
Open inbox tab
Fetches latest items
3.3.3
Background refresh
App in background, new item arrives
Shows on next app open
4.1 Initiating Transactions
#
Scenario
Steps
Expected Result
4.1.1
Send ALGO from joint account
Joint Account → Send → Enter amount → Confirm
Sign request created
4.1.2
Send ASA from joint account
Send asset from joint account
Sign request created
4.1.3
Opt-in to ASA
Add asset to joint account
Sign request created
4.1.4
Opt-out of ASA
Remove asset from joint account
Sign request created
#
Scenario
Steps
Expected Result
4.2.1
Sign with local account
Open sign request → Sign
Signature submitted
4.2.2
Sign with Ledger
Sign request requires Ledger account
Ledger signing flow works
4.2.3
Decline sign request
Click "Decline"
Request declined, removed from inbox
4.2.4
Sign partial (2-of-3)
1st signer signs, 2nd signer signs
Each signature recorded
4.2.5
Complete signing
All required signatures collected
[KNOWN ISSUE] Transaction may not be submitted to blockchain
#
Scenario
Steps
Expected Result
4.3.1
View transaction details
Open sign request
Shows amount, recipient, fees
4.3.2
View signer status
Open sign request
Shows who signed, who pending
4.3.3
View expiration
Open sign request
Shows time remaining
#
Scenario
Steps
Expected Result
4.4.1
Sign expired request
Try to sign after expiration
Should show error
4.4.2
Sign already-signed request
Same account tries to sign twice
Should prevent/show already signed
4.4.3
Sign with insufficient balance
Joint account has insufficient funds
Error before or during signing
4.4.4
Network error during signing
Lose connection while signing
Graceful error handling
5. Ledger Hardware Wallet
5.1 Joint Account Creation with Ledger
#
Scenario
Steps
Expected Result
5.1.1
Create with Ledger account as participant
Select Ledger account + standard account
Joint account created
5.1.2
Create with multiple Ledger accounts
Select 2+ Ledger accounts as participants
Joint account created
5.1.3
Create with only Ledger accounts
All participants are Ledger accounts
Joint account created
5.1.4
Mix Ledger + Algo25 + HD Key
Different account types as participants
Joint account created
#
Scenario
Steps
Expected Result
5.2.1
Sign request with Ledger
Open sign request → Connect Ledger → Approve
Signature submitted via Ledger
5.2.2
Ledger not connected
Try to sign, Ledger disconnected
Prompt to connect Ledger
5.2.3
Ledger app not open
Ledger connected but Algorand app not open
Prompt to open Algorand app
5.2.4
User rejects on Ledger
User presses reject on Ledger device
Transaction cancelled gracefully
5.2.5
Ledger timeout
User doesn't respond on Ledger
Timeout error with retry option
5.2.6
Wrong Ledger account
Connected Ledger doesn't have required account
Show error, prompt correct Ledger
5.3 Ledger Connection Scenarios
#
Scenario
Steps
Expected Result
5.3.1
Bluetooth Ledger (Nano X)
Connect via Bluetooth
Signing works
5.3.2
USB Ledger (Nano S/S+)
Connect via USB-C/OTG
Signing works (if supported)
5.3.3
Ledger disconnects mid-signing
Ledger disconnects during sign
Error with reconnect option
5.3.4
Multiple Ledger devices
Multiple Ledgers paired
Correct Ledger selected
5.3.5
Ledger battery low
Low battery during signing
Warning or graceful handling
5.4 Multi-Signature with Ledger
#
Scenario
Steps
Expected Result
5.4.1
2-of-2: Ledger + Standard
Sign with standard first, then Ledger
Both signatures collected
5.4.2
2-of-2: Both Ledger
Two different Ledger accounts need to sign
Can sign with both Ledgers
5.4.3
2-of-3: Mixed accounts
Ledger + Standard + HD Key
Any 2 can complete signing
5.4.4
Same Ledger, multiple accounts
One Ledger has 2 participant accounts
Can sign for both accounts
#
Scenario
Steps
Expected Result
5.5.1
Ledger firmware update needed
Outdated Ledger firmware
Prompt to update or graceful error
5.5.2
Algorand app update needed
Outdated Ledger Algorand app
Prompt to update
5.5.3
Blind signing disabled
Transaction requires blind signing
Clear instructions to enable
5.5.4
Ledger in another app
Ledger busy with another app
Wait or error message
5.5.5
Large transaction on Ledger
Many operations in one transaction
Ledger can display/approve all
5.6 Ledger Arbitrary Data / Blind Signing
#
Scenario
Steps
Expected Result
5.6.1
Transaction with note field
Sign tx with arbitrary data/note
May require blind signing enabled
5.6.2
Blind signing disabled - with note
Sign tx with note, blind signing OFF
Ledger rejects, show enable instructions
5.6.3
Blind signing enabled - with note
Sign tx with note, blind signing ON
Transaction signs successfully
5.6.4
App call transaction
Sign application call transaction
May require blind signing
5.6.5
Asset config transaction
Sign asset configuration tx
Verify Ledger can process
5.6.6
Clear instructions
User needs to enable blind signing
App shows clear step-by-step instructions
5.6.7
Verify Ledger settings
Check if blind signing is enabled
Inform user of current setting if possible
5.7 Ledger + Rekeyed Accounts
#
Scenario
Steps
Expected Result
5.7.1
Rekeyed to Ledger as participant
Account rekeyed to Ledger is participant
Signing uses Ledger
5.7.2
Ledger rekeyed to standard
Ledger account rekeyed to standard
Signing uses new auth
5.7.3
Joint account with rekeyed participants
Mix of rekeyed accounts
Correct signing flow for each
6.1 Joint Account Import Deep Link
#
Scenario
Steps
Expected Result
6.1.1
Valid deep link - participant
Open perawallet://joint-account-import?address=... as participant
Shows invitation details
6.1.2
Valid deep link - non-participant
Open deep link, user is NOT a participant
Shows error or empty state
6.1.3
Invalid address in deep link
Open deep link with malformed address
Shows error
6.1.4
Deep link - account already added
Open deep link for already-added joint account
Shows account details (no Add button)
6.1.5
Deep link - app not installed
Open deep link without Pera installed
Redirects to app store
#
Scenario
Steps
Expected Result
6.2.1
Deep link - app in foreground
Click deep link while app open
Navigates to joint account
6.2.2
Deep link - app in background
Click deep link, app in background
App opens, navigates correctly
6.2.3
Deep link - app killed
Click deep link, app not running
App starts, navigates correctly
6.2.4
Deep link - not logged in
Click deep link, user not authenticated
Handle auth first, then navigate
7. WalletConnect with Joint Account
7.1 WalletConnect Connection
#
Scenario
Steps
Expected Result
7.1.1
Connect joint account to dApp
Scan WC QR with joint account selected
Connection established
7.1.2
dApp shows joint account address
Connect and check dApp UI
Joint account address displayed
7.1.3
Multiple accounts including joint
Connect with standard + joint accounts
Both accounts available
7.1.4
Disconnect joint account
Disconnect WC session
Session terminated cleanly
7.2 WalletConnect Transaction Requests
#
Scenario
Steps
Expected Result
7.2.1
dApp requests signature
dApp sends tx request to joint account
Shows multi-sig requirement
7.2.2
Sign request handling
Receive WC tx request for joint account
Creates sign request for participants
7.2.3
Immediate response
dApp expects immediate signature
Handle timeout/pending state
7.2.4
Transaction rejection
Reject WC transaction
dApp receives rejection
7.2.5
Partial signing
One participant signs via WC
Other participants notified
7.3 WalletConnect Limitations Testing
#
Scenario
Steps
Expected Result
7.3.1
dApp timeout
dApp times out waiting for multi-sig
Graceful handling
7.3.2
Session expires during signing
WC session expires before all sign
Clear error messaging
7.3.3
dApp doesn't support multi-sig
Standard dApp + joint account tx
Show limitation message
7.3.4
Complex dApp transaction
DeFi swap via joint account
May not be supported
7.3.5
Multiple tx request
dApp sends batch transactions
Handle appropriately
7.4 WalletConnect v2 Specifics
#
Scenario
Steps
Expected Result
7.4.1
WC v2 pairing
Pair with WC v2 dApp
Pairing works
7.4.2
WC v2 session
Establish session with joint account
Session established
7.4.3
WC v2 namespaces
Joint account in Algorand namespace
Properly configured
7.4.4
WC v2 events
dApp events to joint account
Events received
#
Scenario
Steps
Expected Result
8.1.1
Copy export URL
Joint Account → Options → Export → Copy
URL copied to clipboard
8.1.2
Share export URL
Joint Account → Options → Export → Share
Share sheet opens with URL
8.1.3
Export URL format
Check exported URL
Format: perawallet://joint-account-import?address=...
8.2 QR Code (if applicable)
#
Scenario
Steps
Expected Result
8.2.1
Generate QR code
Export joint account as QR
QR code displayed
8.2.2
Scan QR code
Scan joint account QR
Import flow initiated
#
Scenario
Steps
Expected Result
9.1.1
Joint account in list
View accounts list
Joint account shows with correct icon/badge
9.1.2
Joint account balance
View joint account
Shows correct ALGO and ASA balances
9.1.3
Joint account details
Open joint account
Shows threshold, participants
#
Scenario
Steps
Expected Result
9.2.1
Rename joint account
Edit account name
Name updated
9.2.2
Remove joint account
Remove from device
Account removed locally (not on-chain)
9.2.3
View participants
Open joint account details
All participants listed with names/addresses
9.2.4
Edit participant contact
Click participant → Edit
Can update contact name/image
#
Scenario
Steps
Expected Result
9.3.1
View assets
Open joint account
All opted-in assets displayed
9.3.2
Add asset (opt-in)
Add asset to joint account
Creates sign request for opt-in
9.3.3
Remove asset (opt-out)
Remove asset from joint account
Creates sign request for opt-out
#
Scenario
Steps
Expected Result
9.4.1
View participant as contact
Joint account with contact as participant
Shows contact name and image
9.4.2
Add participant as new contact
Tap external participant → Add to Contacts
Contact created with address
9.4.3
Edit participant contact
Tap participant → Edit Contact
Can update name/image
9.4.4
Participant already a contact
View participant who is saved contact
Shows existing contact info
9.4.5
Delete contact used as participant
Delete contact from contacts list
Participant shows address only
9.4.6
Update contact name
Change contact name in contacts
Participant name updates in joint account
9.4.7
Contact with profile image
Add contact with image as participant
Image shows in participant list
9.4.8
Local account vs contact
Same address as local account and contact
Prioritize local account display
9.5 NFD (NFDomains) Integration
#
Scenario
Steps
Expected Result
9.5.1
Participant with NFD name
View participant who has NFD registered
Shows NFD name (e.g., "alice.algo")
9.5.2
NFD avatar display
Participant has NFD with avatar
Shows NFD avatar image
9.5.3
Add participant via NFD
Enter "alice.algo" as participant
Resolves to address, adds participant
9.5.4
Invalid NFD name
Enter non-existent NFD name
Shows error "NFD not found"
9.5.5
NFD resolution failure
Network error during NFD lookup
Graceful error handling
9.5.6
Display priority: Local > Contact > NFD
Participant has local name, contact, and NFD
Shows local account name first
9.5.7
Display priority: Contact > NFD
Participant has contact name and NFD
Shows contact name
9.5.8
Display priority: NFD > Address
Participant has only NFD, no contact
Shows NFD name
9.5.9
NFD name updates
Participant changes their NFD name
Updated name reflects in app
9.5.10
Multiple NFD segments
NFD with segments (e.g., "alice.wallet.algo")
Displays correctly
9.5.11
NFD in sign request
Sign request from participant with NFD
Shows NFD name in signer list
9.5.12
NFD in inbox
Inbox item from participant with NFD
Shows NFD name in inbox list
10. Limitations & Constraints Testing
#
Scenario
Steps
Expected Result
10.1.1
Sign without local joint account
Try to sign request without joint account added
Cannot sign, prompt to add account
10.1.2
Inbox without local joint account
Check inbox without joint account added
Sign requests may not appear (known issue)
10.1.3
Different devices, same participant
Same account on 2 devices
Must add joint account on each device
10.1.4
Remove and re-add joint account
Remove joint account, then re-add via invitation
Should work, data restored
10.1.5
Offline account addition
Try to add joint account while offline
Should fail gracefully
10.2 Transaction Expiration
#
Scenario
Steps
Expected Result
10.2.1
Sign just before expiration
Sign with seconds remaining
Should succeed if submitted in time
10.2.2
Sign after expiration
Try to sign expired request
Clear error message
10.2.3
Expiration during signing
Request expires while user is signing
Handle gracefully
10.2.4
Long Ledger signing
Ledger takes time, request expires
Handle expiration gracefully
10.2.5
Threshold not met before expiry
Only 1 of 2 signed before expiration
Transaction fails, clear messaging
#
Scenario
Steps
Expected Result
10.3.1
Try single participant
Attempt to create with 1 participant
Should be prevented
10.3.2
Maximum participants
Create with maximum allowed participants
Should work or show limit
10.3.3
Change threshold after creation
Look for option to change threshold
Not possible (by design)
10.3.4
Add participant after creation
Look for option to add participant
Not possible (by design)
10.3.5
Remove participant after creation
Look for option to remove participant
Not possible (by design)
10.3.6
Minimum balance
Joint account below minimum balance
Prevent transactions appropriately
11. Edge Cases & Error Handling
#
Scenario
Steps
Expected Result
11.1.1
No internet - create joint account
Try to create without network
Appropriate error message
11.1.2
No internet - sign request
Try to sign without network
Appropriate error message
11.1.3
No internet - fetch inbox
Open inbox without network
Shows cached data or error
11.1.4
Timeout during operation
Slow network causes timeout
Graceful error, retry option
#
Scenario
Steps
Expected Result
11.2.1
Participant account removed
Remove local account that's a participant
Handle gracefully
11.2.2
Joint account closed on-chain
Joint account closed externally
Show appropriate state
11.2.3
Corrupted local data
Local joint account data corrupted
Error handling, recovery option
11.3 Concurrent Operations
#
Scenario
Steps
Expected Result
11.3.1
Multiple users sign simultaneously
2 users sign at same time
Both signatures recorded
11.3.2
Create while offline, sync later
Create joint account offline
Syncs when online
12. Multi-Device Scenarios
12.1 Same Account on Multiple Devices
#
Scenario
Steps
Expected Result
12.1.1
Sign request on both devices
Same participant account on 2 devices
Sign request appears on both
12.1.2
Sign on one device
Sign on Device A
Status updates on Device B
12.1.3
Add joint account on one device
Add on Device A
Should appear on Device B (if synced)
12.2 Multiple Participants on Same Device
#
Scenario
Steps
Expected Result
12.2.1
Both participants on same phone
Account A and B on same device, both are participants
[KNOWN ISSUE] Inbox items may not display correctly
12.2.2
Sign with both accounts
Sign request needs both A and B
Can sign with both from same device
13. Performance & Stress Testing
#
Scenario
Steps
Expected Result
13.1.1
Many joint accounts
Add 20+ joint accounts
App performs well
13.1.2
Many pending sign requests
50+ pending sign requests
Inbox loads reasonably
13.1.3
Large participant list
Joint account with many participants
Details load correctly
#
Scenario
Steps
Expected Result
13.2.1
Extended inbox polling
Leave app open on inbox
No excessive battery drain
13.2.2
Background operation
App in background for hours
No memory leaks
These issues are documented in BACKEND_FEEDBACK.md:
Expired inbox items still listed as pending - Expired sign requests show "Pending" with "≈ 0m left"
Missing sign request creation time - Cannot show "time ago" in inbox
No batch signature submission - Must submit signatures one request at a time
Multiple participants on same device - Inbox items not received correctly
Inbox items require local joint account - Can't receive invitations without joint account added
Signed transactions not submitted - Completed sign requests may not be broadcast to blockchain
Export/Import security model unclear - Need clarification on validation
Test Environment Checklist
When reporting issues, please include:
Device model and Android version
App version
Steps to reproduce
Expected vs actual behavior
Screenshots/screen recordings
Logs (if available)