Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d1360d0
Add a RealUnit Dilisense name-check action to compliance
TaprootFreakAI Sep 16, 2026
30ee48c
Cover RealUnit Dilisense screening with visual baselines
TaprootFreakAI Sep 16, 2026
dc78862
Show Dilisense results as matches, not sanctions
TaprootFreakAI Sep 16, 2026
5a6939d
Harden RealUnit Dilisense screening confirm and poll
TaprootFreakAI Sep 16, 2026
b2d49f3
Fix RealUnit batch poll error state for TypeScript
TaprootFreakAI Sep 16, 2026
d079ac5
Guard RealUnit screening against stale batch responses
TaprootFreakAI Sep 16, 2026
a614407
Settle RealUnit batch status in one place
TaprootFreakAI Sep 16, 2026
c37211e
Keep RealUnit screening locked on transport errors
TaprootFreakAI Sep 16, 2026
f058bc1
Declare the RealUnit visual catch-all mock and require a healthy list
TaprootFreakAI Sep 16, 2026
fcd5f9c
Match RealUnit name-check batch status to PascalCase API enums
TaprootFreakAI Sep 17, 2026
e79ba42
Treat Failed name-check batches as the error path
TaprootFreakAI Sep 17, 2026
fc2f5a9
Ignore stale customer-list responses after a newer load
TaprootFreakAI Sep 17, 2026
fb04db7
Drop stale Screen-all work after unmount and ignore late list errors
TaprootFreakAI Sep 17, 2026
288e54b
Close the Screen-all dialog before polling starts
TaprootFreakAI Sep 17, 2026
cf8a9cb
Clear a Failed batch error when a new run starts
TaprootFreakAI Sep 17, 2026
a4c4c23
Do not search again when Enter is pressed while the list is loading
TaprootFreakAI Sep 17, 2026
3b71c33
Ignore a late row-screen result after unmount
TaprootFreakAI Sep 17, 2026
1907706
Close the row-screen dialog before reloading the list
TaprootFreakAI Sep 17, 2026
e51f2d6
Ignore late screening errors after unmount
TaprootFreakAI Sep 17, 2026
d69e875
Always close the row-screen dialog and clear the last error on confirm
TaprootFreakAI Sep 17, 2026
08b36c9
Do not clear ErrorHint from a stale Failed batch closure
TaprootFreakAI Sep 17, 2026
12158f4
Disable Search while a row screen confirm is in flight
TaprootFreakAI Sep 17, 2026
9659c25
Cover Enter on Search while a row screen confirm is in flight
TaprootFreakAI Sep 17, 2026
4e2b863
Map tenant name-check wire values NoMatch and MatchWithBirthday
TaprootFreakAI Sep 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions docs/test-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,16 @@ run does not prove for each one; the taxonomy and cross-repository entries live
fixtures render. It does not prove that the live promo or relations API returns those
payloads, that login or token verification works, or that create/deactivate succeed against
the server.
- **The RealUnit compliance visual spec answers the customer list and dossier itself.**
`e2e/realunit-compliance.spec.ts` fulfils `GET /v1/realunit/compliance/customers` and
`GET /v1/realunit/compliance/customers/:id` with synthetic fixtures (including `addresses`).
A green run proves those fixtures render. It does not prove that the API returns that payload
or that the server filters to RealUnit wallets.
- **The RealUnit compliance visual spec answers the customer list, Dilisense actions, and dossier itself.**
`e2e/realunit-compliance.spec.ts` fulfils `GET /v1/realunit/compliance/customers`,
`GET /v1/realunit/compliance/customers/:id`, `GET /v1/realunit/compliance/name-check`,
`POST /v1/realunit/compliance/name-check` and `POST /v1/realunit/compliance/customers/:id/name-check`
with synthetic fixtures (including `addresses` and name-check results). Auth is a synthetic Admin
JWT plus staff bootstrap GETs. Unmatched `GET /v1/**` calls return `[]` and other unmatched
`/v1/**` methods return `{}`, so a green visual run does not prove which other staff endpoints the
screen calls. A green run proves those fixtures render, including the Screen / Screen-all confirm
dialogs and a running-batch state. It does not prove that the API returns that payload, that login
works, or that the server filters to RealUnit wallets.
- **Two specs force KYC completeness.** Both collection-invoice cases — the refused QR and the
stored-detail error — override `**/v2/user` so that `kyc.dataComplete` is read as `true`, because
the invoice button is gated on that value. A green run therefore proves nothing about the gate for
Expand Down
28 changes: 13 additions & 15 deletions e2e-stack/specs/realunit.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ test.describe('RealUnit area', () => {
`SELECT id FROM asset WHERE name = 'REALU' AND blockchain = 'Sepolia' AND type = 'Token' ORDER BY id ASC LIMIT 1`,
);
if (realu?.id == null) {
throw new Error("seedWaitingForPaymentBuyQuote: no loc REALU token on Sepolia in seed data");
throw new Error('seedWaitingForPaymentBuyQuote: no loc REALU token on Sepolia in seed data');
}

const uid = `RQ${Date.now().toString(36)}${customer.userId}`.replace(/[^a-zA-Z0-9]/g, '').slice(0, 20);
Expand Down Expand Up @@ -290,9 +290,7 @@ test.describe('RealUnit area', () => {
)
.not.toBeNull();

await expect
.poll(() => normPath(new URL(page.url()).pathname), { timeout: 15000 })
.toBe('/realunit/quotes');
await expect.poll(() => normPath(new URL(page.url()).pathname), { timeout: 15000 }).toBe('/realunit/quotes');

assertNoErrors(pageErrors, consoleErrors);
});
Expand Down Expand Up @@ -331,9 +329,7 @@ test.describe('RealUnit area', () => {
)
.not.toBeNull();

await expect
.poll(() => normPath(new URL(page.url()).pathname), { timeout: 15000 })
.toBe('/realunit/quotes');
await expect.poll(() => normPath(new URL(page.url()).pathname), { timeout: 15000 }).toBe('/realunit/quotes');

assertNoErrors(pageErrors, consoleErrors);
});
Expand Down Expand Up @@ -475,18 +471,20 @@ test.describe('RealUnit area', () => {

await expect(page.getByPlaceholder('Search by ID, email, phone or name...')).toBeVisible();
await expect(page.getByRole('button', { name: 'Search' })).toBeVisible();
// thead <th> cells map to ARIA role "cell" in this app, not "columnheader".
await expect(page.getByText('Last Dilisense check')).toBeVisible();
await expect(page.getByRole('button', { name: 'Screen all' })).toBeVisible();
await expect(
page.getByText('Something went wrong. Please try again. If the issue persists please reach out to our support.'),
).toHaveCount(0);

// Loading resolves to customers count, empty filter copy, or handled ErrorHint — not a crash.
// Empty result can show "Customers: 0" and "No entries found" at once; .first() avoids strict mode.
// Loading resolves to customers count or empty filter copy — not a crash. GET name-check on
// mount must succeed (ErrorHint is not an accepted happy-path settle). Empty result can show
// "Customers: 0" and "No entries found" at once; .first() avoids strict mode.
const settled = page
.getByText(/^Customers:/)
.or(page.getByText('No entries found'))
.or(page.getByText('All accounts are hidden by the filter above'))
.or(
page.getByText(
'Something went wrong. Please try again. If the issue persists please reach out to our support.',
),
);
.or(page.getByText('All accounts are hidden by the filter above'));
await expect(settled.first()).toBeVisible();

assertNoErrors(pageErrors, consoleErrors);
Expand Down
Loading
Loading