diff --git a/tests/e2e/registration.spec.ts b/tests/e2e/registration.spec.ts index bb88e78..e4182b7 100644 --- a/tests/e2e/registration.spec.ts +++ b/tests/e2e/registration.spec.ts @@ -59,12 +59,32 @@ test('DigiD submit → public INGEDIEND → documenten → behandelaar goedkeurt await expect(staff.getByRole('row', { name: reference }).getByRole('cell', { name: 'INGEDIEND' })) .toBeVisible(); + // A behandelaar opens the behandel-portal werkbak and approves the registration (goedkeuren) — the + // S-12 flow that replaces the temporary admin endpoint. The staff tab switches to the medewerker + // realm (a different Keycloak realm than the citizen's digid session). + // + // The werkbak is opened BEFORE the citizen supplies the documents that route the registration to + // Beoordelen, so its row cannot be there at page load: the only thing that can deliver it to this + // already-open page is the werkbak refreshing itself (S-26/#162, ADR-0032). This spec used to + // `staff.reload()` in a poll loop here; the absence of that reload is the live-refresh assertion. + await staff.goto('http://behandel/'); + // That realm enforces MFA (S-15c), so the behandelaar logs in with password + TOTP. + await loginMedewerker(staff, 'merel-behandelaar'); + + await expect(staff.getByRole('heading', { name: /Werkbak/i })).toBeVisible(); + + // Target the decide button by reference (not a generic "Goedkeuren"): the shared verify stack holds + // other open tasks, so a positional match could act on someone else's registration. + const goedkeuren = staff.getByRole('button', { name: `Goedkeuren ${reference}` }); + await expect(goedkeuren, 'the registration is not awaiting beoordeling yet').toBeHidden(); + // Provide the documents the registration is waiting for (S-10a), on the still-open self-service tab. // The process parks at WachtOpDocumenten only after the zaak is opened; the INGEDIEND row above proves // the zaak exists — so the OpenZaak worker has completed and the process is now at the wait — which is // why we supply the documents here rather than right after submit, when the trigger would race the // wait and no-op. (S-10b turns this into a real file upload; here it is the trigger that unblocks // beoordeling.) + await page.bringToFront(); await page.setInputFiles('#diploma', { name: 'diploma.pdf', mimeType: 'application/pdf', @@ -73,22 +93,10 @@ test('DigiD submit → public INGEDIEND → documenten → behandelaar goedkeurt await page.getByRole('button', { name: /documenten aanleveren/i }).click(); await expect(page.getByText(/documenten zijn aangeleverd/i)).toBeVisible(); - // A behandelaar picks the registration up in the behandel-portal werkbak and approves it (goedkeuren) - // — the S-12 flow that replaces the temporary admin endpoint. The staff tab switches to the - // medewerker realm (a different Keycloak realm than the citizen's digid session). - await staff.goto('http://behandel/'); - // That realm enforces MFA (S-15c), so the behandelaar logs in with password + TOTP. - await loginMedewerker(staff, 'merel-behandelaar'); - - await expect(staff.getByRole('heading', { name: /Werkbak/i })).toBeVisible(); - - // The registration reaches the Beoordelen user task only after its documents are provided (above), - // so it appears in the werkbak asynchronously. Since S-26 (#162) the werkbak refreshes itself, so - // this waits on the row WITHOUT reloading the page — the reload here is what the slice removes, and - // its absence is the live-refresh assertion. Target the decide button by reference (not a generic - // "Goedkeuren"): the shared verify stack holds other open tasks, so a positional match could act on - // someone else's registration. - const goedkeuren = staff.getByRole('button', { name: `Goedkeuren ${reference}` }); + // Back to the werkbak — untouched since login, never reloaded. The row arrives on its own once the + // DMN routes the registration to Beoordelen. (Foregrounded so Chromium doesn't throttle the page's + // refresh timer as a hidden tab.) + await staff.bringToFront(); await expect(goedkeuren).toBeVisible({ timeout: 30_000 }); // Click and wait for the decide POST to finish (204) BEFORE leaving the page. `click()` only