feat(04-01): install new deps + scaffold API test harness with Wave-0 RED stubs

- Add react-router@7, @dnd-kit/core, @dnd-kit/sortable, fractional-indexing to PWA
- Add fractional-indexing to API (rank generation server-side)
- ioredis NOT added (in-memory EventEmitter per RESEARCH Plan 02 justification)
- Create apps/api/test/setup.ts with afterEach DB cleanup for list tables
- Wire test.setupFiles in apps/api/vitest.config.ts
- Add 4 Wave-0 RED stub test files (LIST-01/02/03/04, D-04, D-11, D-07)
- All stubs run as todo, not import-error
This commit is contained in:
Lucas Berger
2026-06-09 11:49:10 -04:00
parent 95b13e6633
commit 39d4ec84c0
9 changed files with 241 additions and 2 deletions
+20
View File
@@ -0,0 +1,20 @@
/**
* Wave-0 RED stubs for useListSSE hook.
*
* Covers D-11: bounded (capped exponential) backoff before showing the
* "disconnected / updates paused" indicator.
*
* Tests use a mock EventSource that simulates connect/disconnect scenarios.
* Downstream plans implement the actual useListSSE.ts hook.
*
* Run: pnpm --filter @familysync/pwa test
*/
describe('useListSSE — D-11 bounded backoff', () => {
it.todo('starts connected when EventSource fires the open event')
it.todo('attempts to reconnect with exponential backoff on error')
it.todo('stops retrying after the configured max attempts and sets status to disconnected')
it.todo('resets backoff counter on successful reconnect')
it.todo('calls onMessage callback with parsed event data when a message arrives')
it.todo('cleans up EventSource on unmount')
})
+19
View File
@@ -0,0 +1,19 @@
/**
* Wave-0 RED stubs for ListDetail component.
*
* Covers D-07: optimistic update — the editing member's change shows instantly,
* then reconciles against the server (rollback on rejection).
*
* Downstream plans implement the actual ListDetail.tsx component.
*
* Run: pnpm --filter @familysync/pwa test
*/
describe('ListDetail — D-07 optimistic update + rollback', () => {
it.todo('checking an item immediately updates the UI before server responds')
it.todo('unchecking an item immediately updates the UI before server responds')
it.todo('rolls back the checked state if the server PATCH returns an error')
it.todo('adding an item shows it in the list immediately (optimistic insert)')
it.todo('removes the optimistically-added item if the server POST returns an error')
it.todo('completed items sink to the "completed" section at the bottom (D-05)')
})