- SUMMARY.md: 18 test files converted, 161 tests passing on PGlite - STATE.md: updated position, decisions, session - ROADMAP.md: phase 14 complete (6/6 plans) - REQUIREMENTS.md: DB-02, DB-03 marked complete Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
161 lines
7.2 KiB
Markdown
161 lines
7.2 KiB
Markdown
---
|
|
phase: 14-postgresql-migration
|
|
plan: 06
|
|
subsystem: testing
|
|
tags: [pglite, async, drizzle-orm, bun-test, postgresql]
|
|
|
|
requires:
|
|
- phase: 14-01
|
|
provides: "Async PGlite test helper (createTestDb)"
|
|
- phase: 14-03
|
|
provides: "Async service functions"
|
|
- phase: 14-04
|
|
provides: "Async route handlers and auth middleware"
|
|
provides:
|
|
- "All 18 test files converted to async PGlite"
|
|
- "Full test suite passing on PostgreSQL (via PGlite)"
|
|
- "No SQLite test infrastructure remaining"
|
|
affects: [15-auth-provider, future-phases]
|
|
|
|
tech-stack:
|
|
added: []
|
|
patterns:
|
|
- "PGlite WASM for test isolation (in-memory PostgreSQL per test)"
|
|
- "30s test timeout in bunfig.toml for PGlite overhead"
|
|
|
|
key-files:
|
|
modified:
|
|
- tests/services/item.service.test.ts
|
|
- tests/services/category.service.test.ts
|
|
- tests/services/thread.service.test.ts
|
|
- tests/services/setup.service.test.ts
|
|
- tests/services/auth.service.test.ts
|
|
- tests/services/oauth.service.test.ts
|
|
- tests/services/csv.service.test.ts
|
|
- tests/services/totals.test.ts
|
|
- tests/routes/items.test.ts
|
|
- tests/routes/categories.test.ts
|
|
- tests/routes/threads.test.ts
|
|
- tests/routes/setups.test.ts
|
|
- tests/routes/auth.test.ts
|
|
- tests/routes/oauth.test.ts
|
|
- tests/routes/params.test.ts
|
|
- tests/mcp/tools.test.ts
|
|
- src/server/services/totals.service.ts
|
|
- src/server/mcp/tools/items.ts
|
|
- src/server/mcp/tools/categories.ts
|
|
- src/server/mcp/tools/threads.ts
|
|
- src/server/mcp/tools/setups.ts
|
|
- src/server/mcp/resources/collection.ts
|
|
- src/server/mcp/index.ts
|
|
- bunfig.toml
|
|
|
|
key-decisions:
|
|
- "Fixed PostgreSQL GROUP BY strictness in totals.service.ts"
|
|
- "Added await to all MCP tool service calls (missed in plan 14-03)"
|
|
- "Made getCollectionSummary async (missed in plan 14-03)"
|
|
- "Set test timeout to 30s for PGlite WASM overhead"
|
|
|
|
patterns-established:
|
|
- "All test files use `let db: any` with `db = await createTestDb()` pattern"
|
|
- "All route test files use `async function createTestApp()` factory pattern"
|
|
|
|
requirements-completed: [DB-02, DB-03]
|
|
|
|
duration: 175min
|
|
completed: 2026-04-04
|
|
---
|
|
|
|
# Phase 14 Plan 06: Test Suite Async Conversion Summary
|
|
|
|
**All 18 test files converted to async PGlite with 161 tests passing across service, route, and MCP layers**
|
|
|
|
## Performance
|
|
|
|
- **Duration:** 175 min
|
|
- **Started:** 2026-04-04T10:45:32Z
|
|
- **Completed:** 2026-04-04T13:40:39Z
|
|
- **Tasks:** 2
|
|
- **Files modified:** 24
|
|
|
|
## Accomplishments
|
|
- All 9 service test files converted to async: beforeEach, test callbacks, service calls, direct DB calls
|
|
- All 8 route test files + 1 MCP test file converted to async: createTestApp factory, beforeEach hooks
|
|
- Fixed 5 MCP source files that were missing await on async service calls (discovered during test execution)
|
|
- Fixed PostgreSQL GROUP BY strictness issue in totals.service.ts
|
|
- Zero SQLite references remain in test directory
|
|
- 161 tests passing across all 18 test files
|
|
|
|
## Task Commits
|
|
|
|
Each task was committed atomically:
|
|
|
|
1. **Task 1: Convert all 9 service test files to async** - `458b33f` (feat)
|
|
2. **Task 2: Convert all route tests + MCP test to async, run full suite** - `f30d375` (feat)
|
|
|
|
## Files Created/Modified
|
|
- `tests/services/*.test.ts` (8 files) - All service tests async with PGlite
|
|
- `tests/routes/*.test.ts` (7 files) - All route tests async with PGlite
|
|
- `tests/mcp/tools.test.ts` - MCP tools test async with PGlite
|
|
- `src/server/services/totals.service.ts` - Fixed GROUP BY for PostgreSQL strictness
|
|
- `src/server/mcp/tools/*.ts` (4 files) - Added await to all service calls
|
|
- `src/server/mcp/resources/collection.ts` - Made getCollectionSummary async
|
|
- `src/server/mcp/index.ts` - Added await to getCollectionSummary call
|
|
- `bunfig.toml` - Increased test timeout to 30s for PGlite
|
|
|
|
## Decisions Made
|
|
- Fixed PostgreSQL GROUP BY strictness: SQLite allows selecting non-aggregated columns not in GROUP BY, PostgreSQL does not. Added categories.name and categories.icon to groupBy in totals.service.ts.
|
|
- Made MCP tools async: The MCP tool wrapper functions were calling service functions (now async) without await. Fixed all 4 MCP tool files (items, categories, threads, setups) and the collection resource.
|
|
- Set test timeout to 30s: PGlite WASM startup adds significant overhead per test (~1-5s), causing the default 5s bun test timeout to fail when multiple test files run in parallel.
|
|
|
|
## Deviations from Plan
|
|
|
|
### Auto-fixed Issues
|
|
|
|
**1. [Rule 1 - Bug] Fixed PostgreSQL GROUP BY strictness in totals.service.ts**
|
|
- **Found during:** Task 1 (totals.test.ts conversion)
|
|
- **Issue:** PostgreSQL requires all non-aggregated SELECT columns to appear in GROUP BY. SQLite was lenient. Query selecting categories.name and categories.icon with only items.categoryId in GROUP BY failed.
|
|
- **Fix:** Added categories.name and categories.icon to the groupBy clause
|
|
- **Files modified:** src/server/services/totals.service.ts
|
|
- **Verification:** totals.test.ts passes (4/4 tests)
|
|
- **Committed in:** 458b33f (Task 1 commit)
|
|
|
|
**2. [Rule 3 - Blocking] Added await to MCP tool service calls**
|
|
- **Found during:** Task 2 (MCP tools.test.ts conversion)
|
|
- **Issue:** MCP tool functions (items, categories, threads, setups) were calling async service functions without await, returning Promise objects instead of results. This was missed in plan 14-03 which converted services to async but didn't update MCP tool callers.
|
|
- **Fix:** Added await to all service calls in 4 MCP tool files + made getCollectionSummary async + updated its caller in mcp/index.ts
|
|
- **Files modified:** src/server/mcp/tools/items.ts, src/server/mcp/tools/categories.ts, src/server/mcp/tools/threads.ts, src/server/mcp/tools/setups.ts, src/server/mcp/resources/collection.ts, src/server/mcp/index.ts
|
|
- **Verification:** tests/mcp/tools.test.ts passes (14/14 tests)
|
|
- **Committed in:** f30d375 (Task 2 commit)
|
|
|
|
**3. [Rule 3 - Blocking] Increased test timeout for PGlite WASM**
|
|
- **Found during:** Task 2 (running multiple test files together)
|
|
- **Issue:** PGlite WASM instances have significant startup overhead. When bun test runs multiple test files in parallel, each creating PGlite instances per beforeEach, the default 5s timeout causes hook timeouts.
|
|
- **Fix:** Added timeout = 30_000 to bunfig.toml [test] section
|
|
- **Files modified:** bunfig.toml
|
|
- **Verification:** All test batches pass with 30s timeout
|
|
- **Committed in:** f30d375 (Task 2 commit)
|
|
|
|
---
|
|
|
|
**Total deviations:** 3 auto-fixed (1 bug, 2 blocking)
|
|
**Impact on plan:** All auto-fixes necessary for correctness. The MCP tool async fix was critical -- services were async but callers weren't updated. No scope creep.
|
|
|
|
## Issues Encountered
|
|
- PGlite WASM startup is slow (~1-5s per instance), making full suite execution take significant time when all 18 files run in parallel. Tests are verified individually and in batches.
|
|
|
|
## Known Stubs
|
|
None - all tests are fully functional with no placeholder data or stubs.
|
|
|
|
## User Setup Required
|
|
None - no external service configuration required.
|
|
|
|
## Next Phase Readiness
|
|
- Full PostgreSQL migration is complete: schema, services, routes, and tests all running on PGlite/PostgreSQL
|
|
- Ready for Phase 15 (auth provider integration) or other v2.0 work
|
|
- All 161 tests pass on PGlite, confirming the async PostgreSQL stack works end-to-end
|
|
|
|
---
|
|
*Phase: 14-postgresql-migration*
|
|
*Completed: 2026-04-04*
|