Annisa Nurul Islami

Home/QA case studies/1 of 6

Top Up & Linkage OVO (SNAP OVO)

A feature enabling OVO account linkage and top-up from Livin' by Mandiri, built on the SNAP (Standar Nasional Open API Pembayaran) standard by Bank Indonesia. Technically complex due to strict BI-standard API compliance and dual-system integration.

5 sample test cases2 pass3 fail3 bugs found

Note: all test cases and bug reports in this portfolio are illustrative samples reconstructed from memory after leaving Bank Mandiri. Original documents were stored in Jira, accessible only via the internal Bank Mandiri network. Feature names, flows, and defect types reflect actual work performed; sensitive internal data has been anonymized.

Sample test cases

Five cases, from linking an OVO account to unlinking it.

Scroll the table sideways to see every column.

TC IDStatusTest scenarioTest stepsExpected resultActual resultPriority
TC-OVO-01PASSOVO account linking with active Mandiri account
  1. Open Livin' app
  2. Navigate to e-Wallet menu
  3. Select OVO
  4. Enter valid OVO-registered phone number
  5. Confirm linking
OVO account successfully linked and displayed on e-Wallet dashboardOVO account linked successfullyHigh
TC-OVO-02PASSOVO top-up with valid amount (Rp 50.000)
  1. Navigate to OVO in e-Wallet
  2. Select Top Up
  3. Enter Rp 50.000
  4. Select source account
  5. Confirm transaction
OVO balance increases by Rp 50.000; transaction recorded in historyOVO balance increases by Rp 50.000; transaction recorded in historyHigh
TC-OVO-03FAILOVO top-up with frozen Mandiri account as source
  1. Select frozen account as source
  2. Enter amount
  3. Confirm transaction
Error message displayed: account frozen, transaction cannot proceedTransaction processed without error; account balance deducted despite frozen statusHigh
TC-OVO-04FAILAPI error response for invalid OVO phone number
  1. Enter non-OVO-registered phone number
  2. Attempt to link
  3. Observe API response via Postman
API returns 400 Bad Request with error code INVALID_OVO_ACCOUNTAPI returns 200 OK with empty response body instead of proper error codeHigh
TC-OVO-05FAILOVO unlink from e-Wallet
  1. Navigate to linked OVO account
  2. Select Unlink
  3. Confirm action
OVO account removed from e-Wallet; record deleted from databaseOVO account removed from UI but record still exists in databaseMedium

Bugs found

Three sample bug reports, as written for the development team.

BUG-OVO-01Severity high

Transaction proceeds on frozen source account during OVO top-up

Steps to reproduce

  1. Set source account status to Frozen in backend
  2. Initiate OVO top-up
  3. Confirm transaction

ExpectedBlocked with frozen account error.

ActualTransaction deducted balance despite frozen status.

Priority: High

BUG-OVO-02Severity high

API returns 200 OK instead of 400 for invalid OVO account

Steps to reproduce

  1. Send POST /linkage/ovo with an unregistered phone number via Postman
  2. Observe response

Expected400 Bad Request with INVALID_OVO_ACCOUNT error code.

Actual200 OK with empty response body.

Priority: High

BUG-OVO-03Severity medium

OVO linkage record persists in DB after UI unlink

Steps to reproduce

  1. Unlink OVO from e-Wallet UI
  2. Query database for OVO linkage record

ExpectedRecord deleted from DB.

ActualRecord remains with status ACTIVE in linkage table.

Priority: Medium

SQL and JQL

One query to validate the data, one to track the defects.

SQL · data validation (SQLite)
SELECT a.account_id, a.status AS account_status, o.status AS ovo_linkage_status
FROM accounts a
JOIN ovo_linkage o ON a.account_id = o.account_id
WHERE a.status = 'FROZEN'
  AND o.status = 'ACTIVE';

Used to confirm the root cause of BUG-OVO-01: checking whether frozen accounts still had an active OVO linkage that should have blocked the top-up transaction.

JQL · bug tracking
project = "LIVIN"
AND component = "OVO Linkage"
AND issuetype = Bug
AND status IN ("Open", "In Progress", "Reopened")
ORDER BY priority DESC, created ASC

Lists all open defects tagged under the OVO Linkage component, such as BUG-OVO-01 and BUG-OVO-03, for focused tracking during the sprint.

About the SQL. The query is an illustrative example reconstructed to show the type of database validation performed during testing. Table and column names have been generalized and anonymized and do not reflect the actual production schema. It uses SQLite syntax as a lightweight, portable reference; the same logic applies on MySQL or PostgreSQL with minor syntax adjustments.

About the JQL. It uses Jira's real query language and reflects the kind of filter commonly used for defect tracking. The project key ("LIVIN") and component name are illustrative. JQL filters and sorts issues; for counts by status or component, the filter is combined with Jira's "Group By" option or a dashboard gadget.