## What & why Before this change the self-service confirmation and the openbaar register showed **different** identifiers, so a citizen could not look their registration back up (#78). Now both surface the same **reference**: - **domain → ACL (write):** the domain `registrationId` is set as the zaak's `identificatie` on `POST /zaken`. - **event-subscriber → ACL (read):** the subscriber reads the zaak's `identificatie` back through the ACL (§8.1 — only the ACL talks to ZGW) via a new `POST /zaken/reference`, and stores it on the projection row **and** the `processed_notifications` replay log. - **BFF + openbaar:** the public view exposes `id/status/reference` (never bsn/naam) and searches by id or reference; the register's "Referentie" column shows the reference. Storing the reference in the replay log keeps ADR-0008's **rebuild-is-log-only** invariant intact — `/admin/rebuild` reproduces the reference without re-reading the ACL. Decision recorded in **ADR-0012**. ## Definition of Done - [x] Linked issue: #78 - [x] Tests written first; red → green per layer - [x] Unit + acceptance green (`make unit`): domain 49, acl 27, bff 20, event-subscriber 19, acceptance 7 - [x] Frontend lint + test green (`nx run-many -t lint test`) - [x] Mutation ≥ break(90): acl 100%, event-subscriber 100%, bff 100%, domain 98.41% (pre-existing FlowableWorkflowClient baseline, untouched) - [x] e2e extended: confirmation reference == register reference - [x] openapi.json + api-client regenerated (drift guard green) - [x] ADR-0012 added; demo-script note appended - [x] `Acl__BaseUrl` wired for the subscriber in compose closes #78 Reviewed-on: #79
60 lines
2.2 KiB
TypeScript
60 lines
2.2 KiB
TypeScript
import { fireEvent, render, screen } from '@testing-library/angular';
|
|
import { of } from 'rxjs';
|
|
import { BffApiV1Service, type OpenbaarEntry } from 'api-client';
|
|
import { axe } from 'vitest-axe';
|
|
import { RegisterPage } from './register-page';
|
|
|
|
const sample: OpenbaarEntry[] = [
|
|
{ id: 'zaak-abc', status: 'INGEDIEND', reference: 'REG-abc' },
|
|
{ id: 'zaak-def', status: 'INGESCHREVEN', reference: 'REG-def' },
|
|
];
|
|
|
|
function providers(get = vi.fn().mockReturnValue(of(sample))) {
|
|
return {
|
|
get,
|
|
providers: [{ provide: BffApiV1Service, useValue: { getOpenbaarRegister: get } }],
|
|
};
|
|
}
|
|
|
|
describe('RegisterPage', () => {
|
|
it('lists the public register entries from the BFF on open', async () => {
|
|
const { get } = providers();
|
|
await render(RegisterPage, { providers: providers(get).providers });
|
|
|
|
expect(get).toHaveBeenCalled();
|
|
// The Referentie column shows the citizen's reference (matches the submit confirmation, #78),
|
|
// not the internal zaak id.
|
|
expect(await screen.findByText(/REG-abc/)).toBeTruthy();
|
|
expect(screen.getByText(/INGEDIEND/)).toBeTruthy();
|
|
expect(screen.getByText(/REG-def/)).toBeTruthy();
|
|
});
|
|
|
|
it('searches by the entered term', async () => {
|
|
const get = vi.fn().mockReturnValue(of(sample));
|
|
await render(RegisterPage, { providers: providers(get).providers });
|
|
|
|
fireEvent.input(screen.getByRole('searchbox'), { target: { value: 'zaak-abc' } });
|
|
fireEvent.click(screen.getByRole('button', { name: /zoek/i }));
|
|
|
|
expect(get).toHaveBeenLastCalledWith({ q: 'zaak-abc' });
|
|
});
|
|
|
|
it('shows an empty-state message when the register has no matches', async () => {
|
|
const get = vi.fn().mockReturnValue(of([] as OpenbaarEntry[]));
|
|
await render(RegisterPage, { providers: providers(get).providers });
|
|
|
|
expect(await screen.findByText(/geen inschrijvingen gevonden/i)).toBeTruthy();
|
|
});
|
|
|
|
it('has no WCAG 2.1 AA violations', async () => {
|
|
document.documentElement.lang = 'nl';
|
|
const { container } = await render(RegisterPage, { providers: providers().providers });
|
|
|
|
const results = await axe(container, {
|
|
runOnly: { type: 'tag', values: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'] },
|
|
});
|
|
|
|
expect(results.violations).toEqual([]);
|
|
});
|
|
});
|