Transaction rebrand page — test report

ENGW-210 (parent) · ENGW-222 (TEST subtask) · run 2026-10-15

ScopeThe Transactions page (/transactions) — filters, exports, receipts, statement download. Merchant dashboard rebrand '26 (ENGW-69).
Environmentgo-dev.mypasspoint.com (test)
Accountherbetegui@maildrop.cc — Blockage Inc. (merchant owner; NGN + USD + KES activity)
BrowserChrome via Playwright, 1512x950
TesterChibuzor Obilom
Headline9 pass, 1 partial, 2 fail (export ignores selection; statement unusable from a saved link), 1 blocked (no role lacks view_transaction). 3 defects.

Acceptance criteria

#ACResult
AC1Page hidden without view-transaction permission⛔ Blocked — no role lacks view_transaction
AC2Defaults: last 6 months, all currencies, all types, 10 rows/page✅ Pass
AC3Filters apply immediately and are kept in the URL (reload / shared link restores)✅ Pass
AC4Summary line describes active filters; Clear filters resets✅ Pass
AC5Row details open; credits use incoming wording✅ Pass
AC6Receipts download as PDF, with loading and error feedback⚠️ Partial — loading confirmed, error path unreachable
AC7Rows selectable per page and exported; CSV keeps values in their own column❌ Fail — export ignores the selection
AC8aStatement range capped at 100 days (in-app path)✅ Pass
AC8bStatement runs in the background and can be minimised (in-app path)✅ Pass
AC8cMaximize reopens it on any page (in-app path)✅ Pass
AC8dA range with no data says so (in-app path)✅ Pass
AC8eClosing mid-download asks for confirmation (in-app path)✅ Pass
AC8Statement download from a saved / shared link or a refresh of /transactions❌ Fail — D1

AC8 is shown split. The five sub-behaviours (AC8a–e) pass, but only on the path where the statement modal is reachable — in-app navigation from the dashboard. On a direct load, refresh, or saved/shared link to /transactions the whole statement flow is unreachable (empty currency dropdown, disabled button) — that path is AC8: Fail, caused by D1. The statement-permission clause also holds: the OPERATIONS and MEMBER roles (no view_statement) get no Download Statement button.

Defects

D1Download Statement is unusable on a direct load or refresh of the Transactions page

Open the Transactions page directly (bookmark, shared link, or reload), click Download Statement, and the Currency dropdown is empty — No matches found. Currency is required, so the submit button stays disabled and no statement can be produced.

The dropdown is fed by currency-list?type=allex (HTTP 200; 23 rows, 21 FIAT). In the bundle the option list is built by Y4(), which marks a currency disabled when it has no entry in the shared wallet-balance context and then drops every disabled row. The dashboard page pushes balances into that context (setAllBalances, dashboard chunk page-28b…); no such call is reached from the Transactions page, which fetches the balances but never puts them where Y4 reads them — so a direct hit on /transactions opens the modal with an empty balance list and every currency is filtered out.

The same modal works when you reach Transactions by in-app navigation from the dashboard: 7 currencies appear and the statement downloads normally. So this breaks exactly the bookmarked/shared-link case that AC3 is meant to support, and it blocks AC8 for anyone landing on the page directly.

empty currency list on direct load same modal via in-app navigation

Fix direction: the Transactions page should populate the same balance context (or Y4 should not require it) so the currency list does not depend on which page the user landed on first.

D2Export CSV ignores the row selection

Select two rows — the UI confirms 2 Transactions Selected — then click Export CSV. The file contains the header plus all five rows on the page, not the two selected. Selection does not drive the export, so "rows can be selected per page and exported" is not met.

two rows selected exported CSV has 5 rows

D3Transaction Type = Incoming returns nothing

Filtering by Transaction Type Incoming shows No Transactions Yet (0 of 0), even though the account has three incoming credits on the page (+$1,000,000.00, +₦1,000,000.00, +₦99,800.00). The request sends transType: "Incoming" and the backend answers 0 transaction(s) found. Outgoing does return rows (the two debits); Payment also returns nothing. The credits carry transactionType: INTERNAL_COLLECTION, which the backend does not classify as incoming — so this may be a backend mapping rather than FE, but the user-facing filter is wrong either way.

Incoming filter returns no rows

Checks that passed

AC2Defaults

Fresh load: 15/04/2026 – 15/10/2026 (six months), Transaction Type All Types, Currency All Currencies, Rows per page 10. Minor: the first wallet-history call is sent with pageSize: 5 before correcting to 10 — harmless with 5 rows, worth a look.

defaults

AC3Filters apply immediately and live in the URL

Search by ID, date range, type and currency each fire a request on change and write to the URL: ?id=, ?type=, ?currency=, ?from=, ?to=. Reload restores them; opening the URL in a fresh page restores the selects, dates and the summary line.

search in URL all filters in URL shared link restores

AC4Summary line and Clear filters

The line reads Showing outgoing transaction details for … as filters change, and Clear filters resets the selects, the URL and the summary to the default six-month view.

filtered summary after clear

AC5Row details and credit wording

Clicking a row opens a details drawer with a status tracker. A credit shows Amount Received, Total Credited, Sender Details and narration Direct Credit; a debit shows Amount Sent, Total Debited, Recipient Details.

credit wording debit wording

AC6Receipts download as PDF — loading confirmed, error path not exercisable

The drawer's Download PDF Receipt downloads a real one-page PDF (wallet-transaction-CCPP-20260904190738-111800-receipt.pdf, opens and renders). Loading feedback is real but brief: a spinner replaces the button at ~300 ms and the button returns at ~760 ms (screenshots/T6b-loading.json). The error half of the AC has no reachable trigger — the PDF is rendered client-side from data already on the page, so there is no network failure to force. Note the file is 18.9 MB for one page.

receipt drawer + loading the downloaded PDF

AC7 (part)Rows selectable; CSV columns intact

Per-page checkboxes and select-all work (5 Transactions Selected). The CSV keeps each value in its own column — quoted values with commas stay in one cell, header Transaction ID, Date and Time, Payment Method, Status, Amount. The defect is that selection does not restrict the export (D2).

select all

Download Statement (AC8)

AC8Statement download from a saved / shared link — Fail

Land on /transactions directly (bookmark, shared link, or reload) and the statement flow cannot be started at all: the currency dropdown is empty and the button is disabled. The five sub-behaviours pass once you reach the page by in-app navigation, so the feature is not broken — this one entry path is. Full detail in D1.

statement unusable on a saved link

AC8a100-day cap

101 days: Date range cannot exceed 100 days, submit disabled, no request fired. Exactly 100 days is allowed (boundary correct). A reversed range is guarded with End date cannot be before start date.

101 days blocked 100 days allowed

AC8b / AC8cBackground, minimise, Maximize

Submitting minimises to a Statement in progress card. It persists across in-app navigation (Wallet, Dashboard, back to Transactions) and Maximize reopens the download. On a full page reload the job is lost (client-side state, no persistence) — acceptable reading is in-app "any page".

minimised persists across pages maximise reopens

AC8dNo-data range

A valid range with no data returns an informational No Transactions Found dialog ("We couldn't find any transactions in your NGN wallet between 1 Jan 2026 and 31 Jan 2026. Try a different date range.") with Close / Change dates. This is the empty state ENGW-191 flagged as "Download failed"; it is now correct.

no data

AC8eClose mid-download confirms

Closing while the statement is being prepared raises Cancel This Download? — "Your statement is still being prepared. If you close now, you won't receive this download when it finishes." with Keep waiting / Cancel download.

cancel confirm

Blocked

AC1Page hidden without view-transaction permission

Blocked, and creating an account will not unblock it. Every available role carries view_transaction — audited live: OPERATIONS and MEMBER (the restricted members from ENGW-169) log in, keep the Transactions nav entry, and the page renders normally; only the statement button is withheld (no view_statement). The invite flow offers the same fixed roles (FINANCE / MEMBER / OPERATIONS / OWNER / SUPPORT), so a new team member would also have view_transaction. There is no role without it, so the page can never be hidden for anyone.

Bundle evidence agrees: the dashboard gates the Recent Transactions block and the /transactions link on VIEW_TRANSACTION. Changes nothing here because nothing reaches it without the permission. Unblocking needs a role (or toggle) without view_transaction.

The guard is real and route-level, not just the nav. In the served Transactions route chunk (page-84adc…) the component reads VIEW_TRANSACTION and returns early: You do not have permission to view transactions. So AC1 should pass the moment an account without the permission exists — but that is source-level evidence, not a live pass.

OPERATIONS keeps the page, loses the statement button MEMBER keeps the page, loses the statement button

Method

ENGW-210 / ENGW-222 · 15 Oct 2026 · Chibuzor Obilom. Comments posted: ENGW-222 #24994, ENGW-210 #24995.