Files
GearBox/.planning/phases/14-postgresql-migration/14-06-SUMMARY.md
Jean-Luc Makiola 77bd3c55d0 docs(14-06): complete test suite async conversion plan
- 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>
2026-04-04 15:42:17 +02:00

7.2 KiB

phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, duration, completed
phase plan subsystem tags requires provides affects tech-stack key-files key-decisions patterns-established requirements-completed duration completed
14-postgresql-migration 06 testing
pglite
async
drizzle-orm
bun-test
postgresql
phase provides
14-01 Async PGlite test helper (createTestDb)
phase provides
14-03 Async service functions
phase provides
14-04 Async route handlers and auth middleware
All 18 test files converted to async PGlite
Full test suite passing on PostgreSQL (via PGlite)
No SQLite test infrastructure remaining
15-auth-provider
future-phases
added patterns
PGlite WASM for test isolation (in-memory PostgreSQL per test)
30s test timeout in bunfig.toml for PGlite overhead
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
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
All test files use `let db: any` with `db = await createTestDb()` pattern
All route test files use `async function createTestApp()` factory pattern
DB-02
DB-03
175min 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