Table of contents

Test scenarios

Precium S2S Testing Checklist

This document provides a comprehensive testing checklist to ensure your integration handles all payment scenarios correctly before going live.

Pre-Testing Setup

Before running tests, ensure you have:

  • Sandbox API credentials configured
  • Standard API Key and S2S API Key available
  • Brand ID configured for sandbox
  • Webhook endpoint deployed and accessible
  • Logging enabled for all API calls and responses
  • Test card numbers ready (see Test Cards Reference below)

Test Categories Overview

CategoryTestsPriority
Happy Path8Critical
Pre-Authorization & Capture6Critical
Void/Cancel Operations4High
Refund Scenarios5High
Error Handling12Critical
3DS Scenarios5Critical
Webhook Integration8Critical
Edge Cases7Medium
External Integrations4Conditional
Security & Compliance6Critical

Total: 65 test cases

1. Happy Path Tests

1.1 Standard CIT Payment with Internal 3DS

Test Card:4000000000001091 (3DS required)

StepActionExpected Result
1Create clientReturns client ID
2Create purchase (amount: 10000, force_recurring: true)Returns purchase ID and direct_post_url
3Submit card data with browser fingerprintReturns 3DS parameters or ready status
4Complete 3DS challengeRedirects to callback URL
5POST to callback with MD and PaResReturns success
6Verify purchase statusStatus: "paid"
7Check for tokenpayment_method_details.card.token present
8Check for network_transaction_idValue present for MIT use

1.2 Standard CIT Payment without 3DS Challenge

Test Card:4000000000001000 (No 3DS)

StepActionExpected Result
1Create clientReturns client ID
2Create purchaseReturns purchase ID
3Submit card dataNo 3DS parameters returned
4Charge purchaseStatus: "paid"

1.3 Zero Authorization (Card Validation)

Test Card:4000000000001091

StepActionExpected Result
1Create clientReturns client ID
2Create purchase with amount: 0Returns purchase ID
3Submit card data3DS flow initiated
4Complete 3DSSuccess
5Verify no chargeAmount authorized: 0
6Verify token generatedToken present (if force_recurring: true)

1.4 MIT Recurring Charge

Prerequisite: Completed CIT with token stored

StepActionExpected Result
1Create MIT purchase with token referenceReturns purchase ID
2Include previous_network_transaction_idAccepted
3Include original_amount_centsAccepted
4Submit with stored token (no CVV)Ready for charge
5Charge purchaseStatus: "paid"
6Verify no 3DS requiredNo 3DS challenge

1.5 Mastercard Payment

Test Card:5555555555554444

StepActionExpected Result
1Complete standard flowSuccess
2Verify card brand in responsebrand: "mastercard"

1.6 Multiple Products in Single Purchase

StepActionExpected Result
1Create purchase with multiple productsTotal calculated correctly
2Complete paymentFull amount charged

1.7 Payment with Metadata

StepActionExpected Result
1Create purchase with metadataAccepted
2Complete paymentSuccess
3Retrieve purchaseMetadata preserved
4Receive webhookMetadata included

1.8 Different Currency (if supported)

StepActionExpected Result
1Create purchase with USD currencyAccepted
2Complete paymentCharged in USD

2. Pre-Authorization & Capture Tests

2.1 Pre-Auth with Full Capture

Test Card:4000000000001091

StepActionExpected Result
1Create purchase (amount: 50000)Returns purchase ID
2Submit card and complete 3DSAuthorization successful
3Verify statusStatus: "authorized"
4Capture full amountStatus: "paid"
5Verify captured amountamount: 50000

2.2 Pre-Auth with Partial Capture

StepActionExpected Result
1Create and authorize (amount: 50000)Status: "authorized"
2Capture partial amount (35000)Status: "paid"
3Verify captured amountamount: 35000
4Verify remaining releasedNo hold for remaining 15000

2.3 Pre-Auth with Multiple Partial Captures

StepActionExpected Result
1Authorize 100000Status: "authorized"
2First capture: 30000Success, remaining: 70000
3Second capture: 40000Success, remaining: 30000
4Third capture: 30000Success, fully captured
5Fourth capture attemptError: nothing remaining

2.4 Pre-Auth without CVV (Token-based)

Prerequisite: Stored token from previous CIT

StepActionExpected Result
1Create purchase with is_recurring: trueAccepted
2Submit with token, CVV: "000"Accepted
3Authorization completesStatus: "authorized"
4CaptureStatus: "paid"

2.5 Capture Exceeding Authorization

StepActionExpected Result
1Authorize 50000Status: "authorized"
2Attempt capture of 60000Error: capture_amount_exceeds_authorization

2.6 Authorization Expiry Handling

StepActionExpected Result
1Note: May require waiting or test mode
2Attempt capture on expired authError: authorization_expired
3Verify appropriate error handlingUser-friendly message

3. Void/Cancel Tests

3.1 Void Pre-Authorization

StepActionExpected Result
1Create and authorize purchaseStatus: "authorized"
2Call cancel endpointStatus: "cancelled"
3Verify funds releasedNo hold on card
4Attempt capture after voidError: already_voided

3.2 Void Capture (Same Day, Before Settlement)

StepActionExpected Result
1Complete paymentStatus: "paid"
2Void same dayStatus: "cancelled"
3Verify immediate reversalFunds released

3.3 Void After Settlement (Should Fail)

StepActionExpected Result
1Attempt void on settled transactionError: void_not_permitted
2Verify error messageSuggests using refund

3.4 Void Refund (Before Settlement)

StepActionExpected Result
1Process refundRefund ID returned
2Void refund same daySuccess
3Verify original charge intactFull amount charged

4. Refund Scenarios

4.1 Full Refund

StepActionExpected Result
1Complete payment (29900)Status: "paid"
2Request full refundStatus: "refunded"
3Verify refund amountamount: 29900
4Receive webhookEvent: purchase.refunded

4.2 Partial Refund

StepActionExpected Result
1Complete payment (50000)Status: "paid"
2Request partial refund (20000)Success
3Verify remaining30000 still charged
4Verify refund detailsRefund ID, amount: 20000

4.3 Multiple Partial Refunds

StepActionExpected Result
1Complete payment (100000)Status: "paid"
2First refund (25000)Success, remaining: 75000
3Second refund (25000)Success, remaining: 50000
4Third refund (50000)Success, remaining: 0
5Fourth refund attemptError: nothing to refund

4.4 Refund Exceeding Original Amount

StepActionExpected Result
1Complete payment (30000)Status: "paid"
2Request refund (40000)Error: exceeds original

4.5 Refund Exceeding Remaining Amount

StepActionExpected Result
1Complete payment (50000)Status: "paid"
2First refund (30000)Success
3Second refund (30000)Error: exceeds remaining

5. Error Handling Tests

5.1 Card Declined - Generic

Test Card:4000000000000002

StepActionExpected Result
1Submit declined cardError returned
2Verify error codedo_not_honour
3Verify user-friendly messageAppropriate message

5.2 Expired Card

Test Card:4000000000000069

StepActionExpected Result
1Submit expired cardError: expired_card
2Verify message"Card has expired"

5.3 Insufficient Funds

StepActionExpected Result
1Submit card with insufficient fundsError: insufficient_funds
2Verify soft declineCan retry later

5.4 Invalid CVC

Test Card:4000000000000127

StepActionExpected Result
1Submit with wrong CVCError: cvc_check_failed

5.5 Invalid Card Number

Test Input:4111111111111112 (fails Luhn)

StepActionExpected Result
1Submit invalid card numberError: invalid_card_number
2Verify validation messageClear error message

5.6 Invalid Expiry Format

StepActionExpected Result
1Submit wrong formatError: invalid_expires
2Test: "2028/12", "1228"All fail
3Correct: "12/28"Success

5.7 Processing Error

Test Card:4000000000000119

StepActionExpected Result
1Trigger processing errorError returned
2Verify retry logicExponential backoff

5.8 Missing Required Fields

StepActionExpected Result
1Submit without client_idValidation error
2Submit without brand_idValidation error
3Submit without currencyValidation error
4Submit without productsValidation error

5.9 Invalid API Key

StepActionExpected Result
1Use invalid API keyHTTP 401
2Use wrong key typeError returned
3Use expired keyHTTP 401

5.10 Network Timeout Handling

StepActionExpected Result
1Simulate network timeoutError caught
2Verify retry logicRetries with backoff
3Verify idempotencyNo duplicate charges

5.11 Duplicate Charge Prevention

StepActionExpected Result
1Submit charge requestSuccess
2Resubmit same requestIdempotent response
3Verify only one chargeSingle transaction

5.12 Expired Direct Post URL

StepActionExpected Result
1Create purchaseGet direct_post_url
2Use URL onceSuccess
3Reuse URLError: expired

6. 3DS Scenarios

6.1 3DS Challenge Flow (Internal)

Test Card:4000000000001091

StepActionExpected Result
1Submit card requiring 3DS3DS parameters returned
2Verify 3DS fieldsMD, PaReq, URL, callback_url
3Redirect to 3DS URLBank page loads
4Complete challengeRedirects to callback
5Submit callbackPayment completes

6.2 3DS Authentication Failed

StepActionExpected Result
1Initiate 3DSChallenge presented
2Fail authenticationError: 3ds_authentication_failed
3Verify retry availableCan retry

6.3 3DS Timeout

StepActionExpected Result
1Initiate 3DSChallenge presented
2Allow timeoutError: timeout
3Verify graceful handlingUser-friendly message

6.4 Frictionless 3DS

Test Card:4000000000001000

StepActionExpected Result
1Submit low-risk transactionNo challenge
2Verify frictionlessSuccess without redirect

6.5 3DS Data in Response

StepActionExpected Result
1Complete 3DS transactionSuccess
2Verify ECI valuePresent
3Verify CAVVPresent

7. Webhook Tests

7.1 Receive purchase.paid Event

StepActionExpected Result
1Complete paymentWebhook received
2Verify event typepurchase.paid
3Verify payloadAll fields present
4Verify purchase_idMatches transaction

7.2 Receive purchase.payment_failure Event

StepActionExpected Result
1Submit declined cardPayment fails
2Receive webhookpurchase.payment_failure
3Verify error detailsError code included

7.3 Receive purchase.refunded Event

StepActionExpected Result
1Process refundCompletes
2Receive webhookpurchase.refunded
3Verify detailsAmount, refund_id

7.4 Receive purchase.authorized Event

StepActionExpected Result
1Complete pre-authHolds funds
2Receive webhookpurchase.authorized
3Verify detailsAmount, expiry

7.5 Signature Verification - Valid

StepActionExpected Result
1Receive webhookHeaders present
2Verify signatureMatches computed
3Verify timestampWithin 5 minutes
4Process webhookSuccess

7.6 Signature Verification - Invalid

StepActionExpected Result
1Receive tampered webhook
2Verify signatureMismatch detected
3Reject webhookHTTP 401
4No processingNo action taken

7.7 Duplicate Webhook Handling

StepActionExpected Result
1Receive webhookProcess
2Receive same againDetect duplicate
3Return HTTP 200Acknowledge
4Do not reprocessIdempotent

7.8 Webhook Timeout Recovery

StepActionExpected Result
1Simulate timeoutPrecium retries
2Fix endpointNext retry succeeds
3Verify no data lossEvent processed

8. Edge Cases

8.1 Very Small Amount

StepActionExpected Result
1Create purchase (amount: 1)Accepted
2Complete paymentSuccess

8.2 Very Large Amount

StepActionExpected Result
1Create large purchaseAccepted or limit error
2Verify handlingAppropriate response

8.3 Special Characters in Fields

StepActionExpected Result
1Name with accentsHandled
2Special charactersHandled
3Verify encodingUTF-8 preserved

8.4 Token Expiry

StepActionExpected Result
1Use expired tokenError: token_expired
2Verify handlingPrompts re-tokenization

8.5 Concurrent Requests

StepActionExpected Result
1Send multiple simultaneousAll handled
2Verify no race conditionsNo duplicates
3Verify data integrityAll correct

8.6 Client Reuse

StepActionExpected Result
1Create client onceID stored
2Use for multiple purchasesAll succeed
3Verify consistencyData unchanged

8.7 Browser Fingerprint Variations

StepActionExpected Result
1Minimal fingerprintAccepted
2Full fingerprintAccepted
3Missing optional fieldsHandled

9. External Integration Tests

Complete if using external 3DS or network tokens

9.1 External 3DS (MPI) Flow

StepActionExpected Result
1Complete 3DS with MPIAuth data obtained
2Create purchase (is_external_3DS: true)Accepted
3Include CAVV, ECI, transaction IDValidated
4Complete paymentSuccess

9.2 External 3DS - Invalid Data

StepActionExpected Result
1Submit invalid CAVVError
2Submit missing fieldsError
3Submit wrong ECI formatError

9.3 Network Token Provisioning

StepActionExpected Result
1Submit network tokenAccepted
2Include cryptogramValidated
3Complete paymentSuccess

9.4 Network Token - Expired Cryptogram

StepActionExpected Result
1Submit expired cryptogramError
2Verify handlingPrompts refresh

10. Security & Compliance Tests

10.1 API Key Security

StepActionExpected Result
1Check client-side codeKeys not exposed
2Check logsKeys masked
3Verify HTTPS onlyNo HTTP

10.2 Card Data Handling

StepActionExpected Result
1Check logsCard numbers masked
2Check storageCVV not stored
3Check URLsCard data in POST only

10.3 Token Storage Security

StepActionExpected Result
1Verify encryptionEncrypted at rest
2Verify access controlAuth required
3Verify UITokens masked

10.4 Webhook Endpoint Security

StepActionExpected Result
1Verify HTTPSHTTP rejected
2Verify signatureInvalid rejected
3Verify timestampOld rejected

10.5 Error Message Security

StepActionExpected Result
1Check errorsNo sensitive data
2Check responsesNo internal details
3Check customer messagesGeneric/friendly

10.6 Rate Limiting Handling

StepActionExpected Result
1Exceed rate limitsHTTP 429
2Verify backoffImplements retry
3Verify recoveryResumes normally

Test Cards Reference

Success Cards

Card NumberBrand3DSBehavior
4000000000001091VisaYesSuccess with 3DS
4000000000001000VisaNoSuccess without 3DS
5555555555554444MastercardYesSuccess

Decline Cards

Card NumberError CodeDescription
4000000000000002do_not_honourGeneric decline
4000000000000069expired_cardExpired card
4000000000000127cvc_check_failedInvalid CVC
4000000000000119processing_errorProcessing error

Test CVCs

CVCBehavior
123Success
000Bypass (recurring)

Test Expiry

Use any future date in MM/YY format. Recommended: 12/28

Go-Live Checklist

Before going live, ensure:

  • All critical tests passed
  • All high-priority tests passed
  • Known issues documented and accepted
  • Production credentials obtained
  • Production webhook URL configured
  • Monitoring and alerting configured
  • Support contact information documented