Browse the Knowledge Hub56 resources
Test cases
Wallet and UPI test cases, where the payment ends up in limbo
Twenty eight cases covering payments that time out with no response, duplicate debits on retry, two devices racing one balance, caps across devices, collect request fraud, credential handling, mandates, refunds, reversal and reconciliation.
All 28 test cases, ready to copy
Free to use and adapt, no sign-up. Download as CSV or Markdown, or copy it straight into your own tooling.
Last updated
28 worked examples
Pay a merchant from wallet balance
TypeFunctionalPriorityHigh- Test data
- Wallet balance 2,000. Pay 500 to a verified merchant
- Expected result
- Debit of exactly 500, merchant credited, transaction reference issued, balance shows 1,500 and the ledger entry carries the same reference.
Resolve a payment that timed out with no response
TypeStatePriorityHigh- Test data
- Kill the network after the request is sent but before the response returns
- Expected result
- Payment is shown as pending, never as failed, until status is confirmed. Presenting an unknown outcome as a failure is what causes the user to pay twice.
Reconcile a pending payment on the next app launch
TypeStatePriorityHigh- Test data
- Force a timeout, close the app, reopen it
- Expected result
- Status is queried and resolved to success or failure, the balance is corrected, and the user is told the outcome rather than left with a stale pending row.
Refuse a duplicate payment on a replayed request
TypeSecurityPriorityHigh- Test data
- Replay a completed payment request with the identical payload
- Expected result
- Original result is returned and no second debit occurs. Without an idempotency key generated before the first attempt, every retry is a second payment.
Debit once when pay is pressed repeatedly
TypeFunctionalPriorityHigh- Test data
- Press pay five times in two seconds on a throttled connection
- Expected result
- Exactly one debit. The server refuses the repeat on the key rather than relying on the control being disabled in the interface.
Handle two payments racing against the same balance
TypeBoundaryPriorityHigh- Test data
- Balance 600. Fire two payments of 500 from two devices at the same instant
- Expected result
- One succeeds and one is refused for insufficient funds. The balance never goes negative and no overdraft is created.
Refuse a payment above available balance
TypeNegativePriorityHigh- Test data
- Balance 500. Attempt 501, and attempt 500 with a 5 fee applied
- Expected result
- Both refused before any debit. The check includes fees, so a payment that exactly matches the balance but carries a charge is not accepted and then reversed.
Reject malformed and out of range amounts
TypeNegativePriorityHigh- Test data
- Zero, negative, three decimal places, an amount below the minimum and one above the per transaction cap
- Expected result
- Each refused with a clear reason. Amounts are handled as integers in minor units, never as floating point values.
Enforce per transaction and daily caps across devices
TypeBoundaryPriorityHigh- Test data
- Daily cap 100,000. Send 60,000 from one device and 60,000 from another
- Expected result
- Cumulative total is enforced against the account rather than the session or device, and the second payment is refused.
Reset the daily cap at the correct boundary
TypeBoundaryPriorityMedium- Test data
- Exhaust the cap, then pay at 23:59 and again at 00:01 in the account timezone
- Expected result
- Reset occurs on the account timezone boundary rather than the device timezone, and a device with a manually altered clock cannot reset it early.
Require the payment credential before the debit
TypeSecurityPriorityHigh- Test data
- Reach the credential entry screen and abandon it
- Expected result
- No debit occurs. The credential gates the commit rather than the confirmation screen that follows it, and no reserved amount is left behind.
Lock the account after repeated wrong credential attempts
TypeSecurityPriorityHigh- Test data
- Enter an incorrect payment credential to the configured limit, then once more
- Expected result
- Payments are blocked after the threshold, the counter is held on the server, and reinstalling the app or switching device does not reset it.
Never store or log the payment credential
TypeSecurityPriorityHigh- Test data
- Inspect application logs, crash reports, analytics payloads and local storage after a payment
- Expected result
- No credential, full account number or one time code appears anywhere. Screenshots of the credential screen are blocked on platforms that support it.
Show the payee name before the payment is authorised
TypeFunctionalPriorityHigh- Test data
- Pay to an identifier whose registered name differs from what the user expects
- Expected result
- Registered payee name is displayed for confirmation before the credential is requested, because this is the last point at which a misdirected payment can be stopped.
Present a collect request without implying it is a credit
TypeSecurityPriorityHigh- Test data
- An incoming collect request phrased as if it were an incoming payment
- Expected result
- Interface states plainly that approving will take money from the account, names the requester, and does not use language that suggests receiving funds.
Expire an unanswered collect request
TypeBoundaryPriorityHigh- Test data
- Leave a request unanswered past its validity window, then approve it
- Expected result
- Approval is refused because the request has expired, and the expiry is enforced on the server rather than by hiding the request in the list.
Block or flag a payment matching a fraud pattern
TypeSecurityPriorityHigh- Test data
- A first payment to a new payee at an unusually high value, and rapid repeated payments to several new payees
- Expected result
- Held for verification or stepped up rather than processed silently, and the user is given a route to confirm legitimate activity.
Refund a payment and restore the balance exactly
TypeStatePriorityHigh- Test data
- Full refund on one payment and a partial refund on another
- Expected result
- Credited amounts are exact, both entries carry the original reference, and a partial refund cannot cumulatively exceed the original amount.
Reverse a payment that failed downstream after debit
TypeStatePriorityHigh- Test data
- Force a downstream rejection after the wallet has been debited
- Expected result
- Automatic reversal within the stated window, both entries visible in history, and the user is notified rather than discovering it in the balance.
Refuse a refund request that exceeds the original amount
TypeNegativePriorityHigh- Test data
- Original payment 500. Request a refund of 501, and two partial refunds of 300 each
- Expected result
- Both refused. The cumulative refunded total is checked against the original payment, not against each request in isolation.
Top up the wallet and reflect it once
TypeFunctionalPriorityHigh- Test data
- Top up from a linked funding source, then replay the confirmation callback
- Expected result
- Balance increases once. A duplicated provider callback must not credit the wallet twice, which is the mirror image of the duplicate debit.
Enforce the wallet balance ceiling
TypeBoundaryPriorityMedium- Test data
- A top up that would take the balance one unit above the regulatory or product cap
- Expected result
- Refused before the funding source is charged, so no money is taken for a top up that cannot be credited.
Apply mandate rules on a recurring debit
TypeStatePriorityHigh- Test data
- A mandate with a value cap and an end date, debited at the cap, above it, and after expiry
- Expected result
- Debit at the cap succeeds, above the cap is refused, and a debit after expiry is refused rather than processed on a lapsed authority.
Revoke a mandate and stop subsequent debits
TypeStatePriorityHigh- Test data
- Revoke a mandate, then trigger the next scheduled debit
- Expected result
- Debit is refused, the revocation is effective immediately rather than from the next cycle, and the user receives confirmation of the revocation.
Keep transaction history consistent with the balance
TypeStatePriorityHigh- Test data
- Twenty transactions including one reversal, one partial refund and one fee, then export the history
- Expected result
- Opening balance plus every entry equals the current balance, and the export agrees with the screen and with the downstream ledger.
Behave correctly when the app is killed mid payment
TypeStatePriorityHigh- Test data
- Force stop the app immediately after the credential is submitted
- Expected result
- On relaunch the payment resolves to one definite state, no duplicate is created, and the user is shown the actual outcome.
Refuse payment operations on a compromised device
TypeSecurityPriorityMedium- Test data
- A rooted or jailbroken device, and one with an overlay drawing over the credential screen
- Expected result
- Payment is blocked or stepped up with a clear reason, and overlay detection prevents the credential screen from being captured.
Complete a payment with a screen reader and large text
TypeAccessibilityPriorityMedium- Test data
- Screen reader navigation through amount, payee confirmation and credential entry at the largest text size
- Expected result
- Amount and payee are announced before authorisation, the credential field is reachable and does not announce its contents, and no control is clipped at large text sizes.
What goes in each field
ID
RequiredStable identifier, prefixed by module.
Test case
RequiredWhat is being verified, in one line.
Type
Functional, negative, boundary, security, state, performance, accessibility or compatibility. Use it to check coverage is spread rather than clustered on the happy path.
Priority
Risk based, measured in money and in fraud exposure. Anything that can debit twice, leave a payment in an unknown state, or let a collect request take funds without informed consent is High.
Test data
The specific values, including the invalid and boundary ones.
Expected result
RequiredThe precise observable outcome, including message text where the wording itself is the requirement.
Cut the network and watch the status
Instant payments are easy to test successfully and hard to test honestly. These four conditions are where money moves twice or disappears.
Kill the network mid payment
A timeout is not a failure. Showing an unknown outcome as failed is precisely what makes the user pay again, and now there are two debits and one of them will be disputed.
Force stop the app after the credential
On relaunch the payment must resolve to one definite state. A stale pending row that never resolves is the same defect wearing a quieter face.
Pay from two devices at once
Two payments of 500 against a 600 balance, fired simultaneously. Exactly one should succeed, and the balance must never go negative.
Read the collect request as a victim would
A request that takes money must not be phrased like an incoming payment. This is a social engineering surface, and the wording is the control.
Why payment defects reach production
The ambiguous outcome is the defining problem of instant payments. A request is sent, the network drops, and the client has no idea whether the money moved. There are only two safe behaviours: show it as pending and resolve it, or resolve it before telling the user anything. What is never safe is showing it as failed, because the user will immediately pay again and the first payment may well have succeeded. That single design decision produces most duplicate payment disputes, and it is testable by cutting the connection at one specific moment. The follow up case matters just as much: on the next app launch, any pending payment must be queried and resolved rather than left as a stale row.
Idempotency is the mechanism that makes retries safe, and it has to be a key generated before the first attempt and reused on every subsequent one. A key generated per request is not a key. Client libraries retry automatically on timeout, users press pay again, and mobile networks drop responses constantly, so the retry path is the normal path rather than the exceptional one. The mirror image is worth its own case: a duplicated provider callback on a top up must not credit the wallet twice.
Caps and counters belong to the account, not to the device or the session. A daily limit checked per device is defeated by installing the app somewhere else, and a wrong credential counter held on the client is reset by reinstalling. The timezone boundary is a related case: a cap that resets according to the device clock can be reset early by changing the clock, so the account timezone is the only correct reference.
Finally, collect requests are a fraud surface rather than a feature, and the interface wording is the control. A request that will take money from the account must say so plainly and name the requester, because the whole attack depends on the recipient believing they are receiving funds. Expiry has to be enforced on the server, the payee name has to be shown before the credential is requested, and the credential itself must never appear in logs, crash reports or analytics payloads. Those four cases are cheap to run and they cover the ground where real losses happen.
Suggest an improvementTesting a wallet or payments app?
QAble tests payment flows end to end, including timeout resolution, idempotency, concurrency, mandate handling and reconciliation between the app, the provider and the ledger.
Finance software testing servicesMore test case sets
View allTest cases for a login page
Test cases25 cases across functional, negative, boundary, security, session and accessibility paths, including account enumeration and lockout.Test cases for a registration form
Test cases28 cases covering validation, duplicate accounts, email verification, password rules and the enumeration leak most signup forms ship with.Test cases for search functionality
Test cases28 cases across relevance, partial and fuzzy matching, filters, pagination, empty states, injection attempts and performance under load.Test cases for a shopping cart
Test cases27 cases on quantity limits, price recalculation, stock changes, coupon stacking, guest to account merge and cart persistence.Test cases for checkout and payment
Test cases30 cases including 3D Secure, declines, timeouts, duplicate charges, idempotency, refunds and partial captures.Test cases for file upload
Test cases28 cases on size and type limits, spoofed content types, malicious filenames, progress, resume, virus scanning and storage limits.Test cases for forgot password
Test cases26 cases on reset token expiry, single use enforcement, session invalidation and the enumeration and rate limit gaps that are routine here.Test cases for OTP verification
Test cases26 cases on expiry, resend throttling, attempt limits, code reuse, delivery failure and the brute force window teams forget to close.Test cases for user roles and permissions
Test cases26 cases on horizontal and vertical privilege checks, direct object access, role changes mid-session and permission inheritance.Test cases for form validation
Test cases27 rules-based cases on required fields, length and numeric boundaries, client and server parity, hidden field tampering and error accessibility.Test cases for a date picker
Test cases26 cases on timezone shifts, ambiguous day and month order, impossible dates, min and max limits, leap years and keyboard operation.Test cases for pagination
Test cases24 cases on ordering stability, records changing mid-session, page size caps, deep offset cost, permission-filtered totals and state restore.Test cases for push notifications
Test cases26 cases on app states, deep link routing, token release on sign out, lock screen privacy, preferences, provider failures and platform differences.Test cases for reports and data export
Test cases25 cases on permission filtering in the file, spreadsheet formula injection, encoding, typed numbers and dates, row limits and audit logging.Test cases for a chatbot
Test cases28 cases on paraphrased intents, context, fallback loops, human handoff, policy grounding, prompt injection and data scoping.Test cases for net banking transactions
Test cases28 cases on duplicate debits from a retried request, concurrent transfers against one balance, daily limits across channels, beneficiary cooling periods, second factor binding and reconciliation.Test cases for insurance claim submission
Test cases28 cases on coverage at the date of loss, waiting periods, deductibles and sub limits, exclusions and riders, duplicate claims and settlement reconciliation.Test cases for patient records in an EHR
Test cases28 cases on duplicate detection and merge, wrong patient entry, units of measure, allergy and interaction alerting, break glass access and audit of reads.Test cases for CRM lead management
Test cases28 cases on duplicate leads under concurrency, routing and the unrouted fallback, round robin races, territory visibility, conversion and bulk import.Test cases for an ERP purchase order
Test cases28 cases on approval thresholds, amendments that must reset approval, budget commitment races, over receipt tolerance, three-way match and duplicate invoices.Test cases for OTT video playback
Test cases28 cases on bitrate recovery after a dip, DRM renewal mid stream, concurrent stream limits and leaked slots, resume conflicts, ad cue points and offline expiry.Test cases for game level progression
Test cases28 cases on save corruption during a crash write, cloud save conflicts, offline queue replay, unlock gating, currency exploits and purchase restore.Test cases for a REST API
Test cases28 cases on status code correctness, cross tenant resource access, mass assignment, idempotent retries, cursor pagination, rate limits and contract drift.Test cases for SSO and social login
Test cases28 cases on linking an account on an unverified email, state and code replay, redirect allow lists, token signature and issuer, deprovisioning and session rotation.Test cases for subscription and billing
Test cases28 cases on mid cycle proration, duplicate and out of order webhooks, renewal double charges, dunning and grace, trials, coupons, metered usage and tax.Test cases for data tables, filters and sorting
Test cases28 cases on unstable sorts across pages, filters that must reset pagination, selection surviving a filter change, bulk action scope and export fidelity.Test cases for session timeout and concurrent login
Test cases28 cases on tokens that survive sign out, refresh token reuse, idle against absolute lifetime, multi tab expiry, session limits and remote revocation.Test cases for a multi step form wizard
Test cases28 cases on values lost to back navigation, refresh and session expiry, step skipping, server side revalidation, duplicate submission and conditional branches.Test cases for email verification
Test cases28 cases on token reuse and expiry, invalidating earlier links, account enumeration, header injection, safe address change and mail scanner prefetching.Test cases for dashboards and analytics widgets
Test cases28 cases on reconciling against source rows, widgets that disagree, timezone aggregation, zero baselines, no data shown as zero and permission leaks in aggregates.Test cases for booking and reservation
Test cases28 cases on concurrent bookings for the last slot, inventory holds that leak, payment without a booking, cancellation boundaries and channel sync.Test cases for mobile app install and update
Test cases28 cases on migration chains across skipped versions, crashes during post upgrade migration, forced update lockouts, deep links and clean reinstall.Test cases for accessibility (WCAG 2.2 AA)
Test cases28 cases on keyboard only completion, focus management, live region announcements, contrast, reflow at 320 pixels, target size and screen reader verification.Test cases for performance and load
Test cases28 cases on spikes with no ramp, recovery after peak, soak and leak detection, pool exhaustion, cold caches, retry storms and data correctness under load.Test cases for the OWASP Top 10
Test cases28 cases on broken access control, mass assignment, injection across every input surface, credential stuffing, session invalidation, SSRF and exposed secrets.Test cases for cross browser compatibility
Test cases28 cases on storage that throws in private mode, blocked third party cookies, engine date parsing, mobile viewport units, in app browsers and ad blockers.Test cases for database and data integrity
Test cases28 cases on uniqueness under concurrency, lost updates, counter races, orphaned rows, migration and backfill safety, replica lag and verified restores.Test cases for localisation and multi language support
Test cases28 cases on text expansion, concatenated sentences, plural rules, locale date parsing, decimal separators, right to left layout, collation and encoding.Want payment integrity proven, not assumed?
QAble covers functional, boundary and security paths with ISTQB-certified engineers. Start with a free QA audit of your app.