/** * lib/test-ids.ts — SSOT of the `data-testid` contract between the emitters * (scaffold-component, scaffold-ui-primitives, scaffold-frontend-auth) and the * consumers (ui-test `build-manifest` expectations, `run-ui-test` scenario * templates, the audit rules that anchor on a testid). * * Before 2026-09-24 the scenarios selected `[data-testid="row-edit"]` while the * list rendered `row-edit-${id}`, and expected `${section}-list-table` / * `${section}-detail` / `${section}-permission-denied` that NOTHING rendered: * 5 scenarios out of 6 failed by construction (audit D-CRIT-04). The rendered * ids win; `run-ui-test/__tests__/testid-contract.test.ts` renders the real * pages and pins every consumer expectation against them. */ export const TEST_IDS = { // ─── rendered by scaffold-component (list) ─── /** Prefix of the per-row edit affordance: `row-edit-`. Select with `[data-testid^="row-edit-"]`. */ rowEditPrefix: 'row-edit-', /** Prefix of the per-row delete affordance: `row-delete-`. */ rowDeletePrefix: 'row-delete-', /** The list host (table / cards / kanban) of a section's list page. */ listTable: (section: string): string => `${section}-list-table`, listStatsRow: 'list-stats-row', listSegments: 'list-segments', listKanbanBoard: 'list-kanban-board', listCardsGrid: 'list-cards-grid', cardItem: 'ss-card-item', // ─── rendered by scaffold-component (detail) ─── /** The detail page anchor (its header actions container — always rendered, even without actions). */ detailRoot: (section: string): string => `${section}-detail`, detailActionEdit: 'detail-action-edit', detailActionDelete: 'detail-action-delete', detailSummary: 'detail-summary', relatedBand: 'related-band', // ─── rendered by scaffold-component (form) + ui-primitives SectionCard ─── formSubmit: 'form-submit', formField: (camelKey: string): string => `form-field-${camelKey}`, sectionEditPrefix: 'section-edit-', sectionDonePrefix: 'section-done-', // ─── rendered by scaffold-ui-primitives (DataTable) ─── /** Every data row of the owned DataTable. Scenarios select the exact id `[data-testid="ss-list-row"]` (detail clicks the row itself; edit/delete descend into it — 2026-09-24). */ listRow: 'ss-list-row', listSkeletonRow: 'ss-list-skeleton-row', // ─── rendered by scaffold-frontend-auth (PermissionGuard fallback) ─── /** The denied placeholder the page-level PermissionGuard renders — NOT section-prefixed. */ permissionDenied: 'permission-denied', // ─── login form (package-owned, consumed by every scenario) ─── loginEmail: 'login-email', loginPassword: 'login-password', loginSubmit: 'login-submit', /** Optional confirm affordance of a delete modal. */ confirmDelete: 'confirm-delete', } as const