Skip to content

Caseworker โ€” tests

The caseworker portal is the oldest and largest board, and the one whose end-to-end journeys exercise the full Operaton stack.

Frontend: 52 files ยท 587 tests, including the shared process view. E2E: 4 specs ยท 4 tests, all passing on 9 October 2026.


Frontend

Re-derived on 9 October 2026 at ebec288 (v2026.10.1). The frontend package was measured the same day โ€” 130 files, 1540 tests, all passing โ€” but Vitest's console reports only that total, so the per-file and per-area counts below are taken from the source, each test file parsed with its .each tables expanded. Summed over the whole package the method gives exactly the runner's 1540.

v2026.10.1 took eleven tests off this board and added none of its own. The DVTP sections went from the caseworker dashboard, and their two test files with them โ€” CaseworkerDashboard/DvtpStartSection.test.tsx (5) and DvtpTakenSection.test.tsx (7). pages/CaseworkerDashboardV2.test.tsx went from 14 to 15: logging out now returns to the landing page of the user's own tenant, or to the plain landing page without a tenant claim. SectionRouter.test.tsx kept its 31, the two DVTP section cases folded into one it.each that checks neither is routed any more, and TakenInbox.test.tsx its 32, with the decline message now reading "Niet ondertekend โ€” het proces gaat verder via de afwijzingsroute." The release's new frontend tests โ€” the organisation landing pages, the no-access dialog and the citizen services โ€” belong to no board; see Overview.

The CaseworkerDashboard/ directory is not only this board's: it is the shared section-component library, reused across three of the four V2 dashboards. Changes there ripple, which is why it carries 232 tests across 26 files on its own. components/process/ is shared the same way: the caseworker's process view is built from it, and the Infra-board's project detail draws its phase stepper and swimlane with the same components.

The signing panel is shared too, and counted on the Infra-board page

Since v2026.10.0 the caseworker inbox renders the same signing panel as the Infra-board: SigningPanel and useTaskSignature moved to the shared components/signing/, and TakenInbox asks useTaskSignature whether a claimed task signs through ValidSign before it renders a form. That directory's 3 files and 25 tests are counted once, on Infra-board, where the panel started โ€” not here as well. What this board adds is in TakenInbox.test.tsx, below.

Area Files Tests
components/CaseworkerDashboard (shared section library) 26 232
components/CaseworkerDashboardV2 (including regelsimulatie/) 16 193
components/process (the process view, shared with the Infra-board) 8 123
pages/caseworker-v2 (modes.config) 1 24
pages/CaseworkerDashboardV2.test.tsx 1 15

Besluitvorming โ€” new in v2026.10.0, in the shared section library:

File Tests Covers
CaseworkerDashboard/BesluitOverzichtSection.test.tsx 7 Lopende and Afgeronde besluiten: refused without a besluit role, running besluiten with their current step, completed ones with their outcome, a besluit opened to its details with the empty ones left out, and a retry when the list cannot be loaded
CaseworkerDashboard/BesluitStartSection.test.tsx 3 Besluit voorbereiden: refused without besluit-indiener, the process started and confirmed, and a failed start reported

pages/caseworker-v2/modes.config.test.ts gained three with them โ€” the two besluit lists in the tenant sections, and Flevoland offering the start to its indieners โ€” and CaseworkerDashboardV2/SectionRouter.test.tsx three, one per besluit section.

Largest files outside components/process/:

File Tests Covers
CaseworkerDashboardV2/TakenInbox.test.tsx 32 The task list โ€” filters, the phase hint, the Procesgegevens bar, the process view a selected task opens, and since v2026.10.0 the signing panel in place of the form for a task that must be signed, nothing while the signing spec is still loading, the fallback form when it cannot be fetched, and a refreshed list after a decline (28 on 30 September)
CaseworkerDashboardV2/SectionRouter.test.tsx 31 Section routing and the shell's state machine
pages/caseworker-v2/modes.config.test.ts 24 Mode configuration, a pure data module, read against the real tenants.json
CaseworkerDashboardV2/regelsimulatie/simEngine.test.ts 22 The deterministic budget-exhaustion simulator
CaseworkerDashboard/McpChatSection.test.tsx 20 The MCP chat surface
CaseworkerDashboard/IouGebruiksscenarioSection.test.tsx 17 Usage-scenario section
CaseworkerDashboard/RegelCatalogus.test.tsx 16 The rule catalogue
CaseworkerDashboardV2/RegelSimulatie.test.tsx 16 The rule-simulation section
CaseworkerDashboard/GereedschapSection.test.tsx 15 Tools section
CaseworkerDashboardV2/regelsimulatie/SimTweak.test.tsx 15 Adjusting the simulation's parameters
CaseworkerDashboard/TaskFormViewer.test.tsx 14 Rendering and submitting an Operaton task form
pages/CaseworkerDashboardV2.test.tsx 15 The page container โ€” since v2026.10.1 logging out to the user's own tenant landing page

The process view โ€” new in v2026.09.14, all but one file new then:

File Tests Covers
process/PhaseSwimlane.test.tsx 38 The swimlane renderer, moved here from InfraBoardDashboard/ (22 tests there): collision stacking, the caseworker additions, readable gateway labels (edgeLabelText) and the roomier density
process/laneSteps.test.ts 19 Pure step-list logic: lane metadata, which lanes are the user's, the trail and the hand-overs between lanes
process/ProcessLaneSteps.test.tsx 13 Processtappen per rol โ€” the steps grouped by role
process/ProcessOverlay.test.tsx 13 The whole-process overlay with its stepper and swimlane
process/ProcessWhere.test.tsx 12 Waar sta ik โ€” the phase and the step on the stepper; since v2026.10.0 nothing for a process without phases, and a process's own declared phases numbered and captioned under its own label (9 on 30 September)
process/useTaskProcessContext.test.ts 11 Loading a task's process context across the call chain
process/processContext.test.ts 10 buildProcessContext โ€” splicing a sub-process's history into its parent's, in engine order, and carrying a declared phase set (9 on 30 September)
process/PhaseStepper.test.tsx 7 The phase stepper, shared with the Infra-board

Coverage on 9 October (statements / branches): components/CaseworkerDashboard 94.2 / 94.51, components/CaseworkerDashboardV2 91.98 / 93.22, the regelsimulatie sub-directory 98.33 / 88.59, and components/process 99.16 / 91.18. BesluitOverzichtSection.tsx is still the lowest file in the frontend by branches, at 80.43% โ€” half a point above the floor โ€” and process/phaseSet.ts, the phase set a process declares, is at 83.33%; they are the only two files below 85 in the repository; see Coverage.

The simulator carries a real performance budget

simEngine.ts must process the default 3,150-application population in under 250ms. That assertion does not run in the default suite โ€” it lives in simEngine.perf.test.ts and runs via npm run test:perf, without file parallelism, as its own CI step. The reasoning is on Overview.


E2E

Four specs drive this board specifically: caseworker-journey.spec.ts (the Kapvergunning roundtrip), zorgtoeslag-journey.spec.ts (a citizen submitting through a commercial organisation, handled by the competent authority's caseworker), thuisbatterij-journey.spec.ts (a Thuisbatterij subsidy application reviewed by a caseworker, new in v2026.09.11) and heusdenpas-journey.spec.ts, new in v2026.10.1: a Gemeente Heusden citizen applies for a Heusdenpas, and test-caseworker-heusden checks completeness, reviews the outcome of the untenanted SVB, SZW and Heusdenpas decisions, and informs the applicant โ€” the first journey on this board for an organisation other than Flevoland and Dienst Toeslagen.

All four were measured on 9 October 2026, as part of the full frontend run against the developer's already-running local stack (42 passed, 5 skipped, 2.6m): one test each, all passing โ€” caseworker-journey in 15.0s, heusdenpas-journey in 11.8s, thuisbatterij-journey in 7.7s and zorgtoeslag-journey in 6.2s. On 3 October the first three passed in 24.5s, 8.4s and 6.1s. See E2E & live smoke, which also tabulates v2026.10.1's specs for the citizen portal and the landing pages โ€” they reach this board's login but belong to no board.

The first three accept the task names linked-data-explorer's swimlane redesign introduced โ€” Beoordeling behandelaar: โ€ฆ and Fase 6: Aanvrager informeren over besluit โ€” as well as the old English ones, so they pass against either deployment: thuisbatterij-journey since v2026.09.12, the other two since v2026.09.14. In v2026.10.1 caseworker-journey also began filling the Kapvergunning forms by their Dutch labels, which linked-data-explorer's fixtures now carry.

No spec drives Besluitvorming yet: the Besluit voorbereiden start and the Lopende and Afgeronde besluiten lists are covered by the unit tests above only, and so is the signing panel in the caseworker inbox.

The other three specs measured here before are cross-cutting, not caseworker

This section used to read "five specs, twelve tests", counting login-redirect, protected-route, tenant-isolation and smoke towards this board. Those four cut across every board and belong to none โ€” they are now attributed as such in Coverage per board, which is why this figure dropped without any test being removed.

The 30 August run was against the corrected e2e-fixtures BPMNs redeployed from the Linked Data Explorer, which confirmed that chain end to end; the 3 and 9 October runs passed the same globalSetup gates, which refuse to start unless those fixtures are deployed โ€” and, since v2026.10.1, the Heusden bundle as well, which e2e:deploy-fixtures does not deploy; see Deploying the E2E fixtures.

Spec Covers
smoke.spec.ts App loads at /, LoginChoice renders, no console errors
login-redirect.spec.ts One test per role (citizen / caseworker / infra / woo / PA) against the Flevoland tenant, driving the real Keycloak hosted login โ€” 5 tests
protected-route.spec.ts Cross-role ProtectedRoute redirect behaviour, and DigiD login still working after an unauthenticated visit to a protected route โ€” 3 tests
caseworker-journey.spec.ts A citizen submits a real Kapvergunning request via Operaton/DMN; the caseworker claims and completes both resulting tasks โ€” a genuinely finalised roundtrip
zorgtoeslag-journey.spec.ts A second deep journey โ€” a commercial-org citizen submits a Zorgtoeslag claim, and the toeslagen caseworker completes both steps
thuisbatterij-journey.spec.ts A third deep journey โ€” a citizen applies for a Thuisbatterij subsidy, the six-decision DRD evaluates, and the caseworker reviews the resulting task
heusdenpas-journey.spec.ts A fourth deep journey, new in v2026.10.1 โ€” a Heusden citizen applies for a Heusdenpas, the Heusden caseworker checks, decides and informs, and the citizen sees the decided application once in Mijn aanvragen. Every step also submits a form with a required but hidden field
tenant-isolation.spec.ts A real cross-tenant fixture โ€” confirms a wrong-tenant caseworker does not see a task, and the right one does. Since v2026.09.14 it matches the review task by its English or Dutch name, so the negative check cannot pass on a name that no longer exists

tenant-isolation.spec.ts is the empirical proof of the tenancy-scoping behaviour described in Processes โ†’ Tenancy and Tasks โ†’ Visibility: a task raised under one tenant is visible only to that tenant's caseworker.

What the suite needs running, and why it fails fast rather than starting anything itself, is on E2E & live smoke.