3.6.4 Story tests — column config service + the unmapped→mapped resolution E2E
Estimate: 18m · Depends on: 3.6.2, 3.6.3
The closing test subtask — the same split Stories 3.1.7 / 3.2.7 used: component/unit over the config logic + a Playwright E2E proving the headline resolution end-to-end (unmapped status → mapped → on the board).
Component / unit (vitest, real Postgres). The column-config service: add / rename / reorder / delete; mapStatusToColumn enforces @@unique([boardId, statusId]) (re-map replaces, never duplicates); deleteColumn unmaps its statuses and deletes no work item; the delete guard; the membership + workspace gates. The BoardConfigEditor render + the map/unmap interaction (incl. the keyboard path) + the repointed tray CTA.
E2E (Playwright) tests/e2e/board-config.spec.ts. Against a seeded project: add a custom status in Workflow settings → assert it shows in the board’s unmapped-statuses tray on /boards → open Board settings, map it to a column → assert it now renders as/in that column on /boards and the tray entry is gone. Plus: reorder a column (persists on reload); delete an empty column (its statuses return to the tray, no cards lost); a non-admin sees the surface read-only.
Acceptance criteria
pnpm testcovers the config service (add/rename/reorder/delete/map/unmap, the unique-move, the delete guard, the gates) and the editor render + map/unmap (incl. keyboard) + the repointed tray.pnpm test:e2e --grep board-configruns green over the real stack, asserting the unmapped→mapped→on-board resolution end-to-end, a column reorder persisting, a column delete returning statuses to the tray without losing work items, and the non-admin read-only gate.- Reuses the real-Postgres harness (
tests/helpers/db.ts) + the seeded project; it does NOT duplicate the 3.2.7 drag/board-UI journeys.
Context refs
tests/e2e/board-projection.spec.ts(3.1.7) +tests/e2e/board-ui.spec.ts(3.2.7) — the board E2E patterns this builds on;tests/helpers/db.ts— real-Postgres truncationtests/components/board-completeness.test.tsx(3.2.6) — the unmapped-tray component test to extend for the repointed CTA- Story 3.6.2 / 3.6.3 — the service + UI under test;
motir-core/CLAUDE.md— test conventions (real Postgres, no mocks)