chore(quick-260613-ndv-02): clean-slate comment in setup.ts + README local-test docs

- Update apps/api/test/setup.ts header: clarify tests run against familysync_test
  (provisioned by global-setup.ts), document users-cleanup decision (intact across
  tests), and note CI-vs-local env difference
- Add apps/api/README.md "Running API tests locally" section: documents the test
  DB isolation, run command, DB_ROOT_PASSWORD requirement, and CI no-op behaviour
- Fix apps/api/test/global-setup.ts: switch from drizzle({ client, mode }) to
  drizzle(pool, { mode }) — drizzle-orm@0.45.2 isConfig() has a tautological OR
  in the `mode` branch that always returns false, causing the combined-config form
  to pass the config object as the client (client.query is not a function); two-arg
  form routes correctly; 244/244 tests pass against familysync_test
This commit is contained in:
Lucas Berger
2026-06-13 17:02:50 -04:00
parent 8453b9751e
commit 4740d86701
3 changed files with 50 additions and 13 deletions
+17 -10
View File
@@ -1,18 +1,25 @@
/**
* Vitest global test setup for apps/api.
* Vitest per-file test setup for apps/api.
*
* Establishes shared test infrastructure for API tests:
* - DB pool access via the existing client.ts (DB_HOST/DB_NAME from env)
* - Per-test cleanup for list tables (truncate between tests so state is isolated)
* Tests now run against the isolated `familysync_test` database, which is
* auto-provisioned and migrated by `test/global-setup.ts` before the suite
* starts. The dev `familysync` database is never touched by a local test run.
*
* Usage:
* This file is referenced in vitest.config.ts via test.setupFiles.
* Pure-logic tests (listEmitter, fractional rank) do NOT require DB — the
* cleanup function is a no-op when the tables are empty.
* Cleanup strategy:
* - afterEach truncates list/push tables in FK-safe order so each test
* starts with a clean slate for those tables.
* - `users` is intentionally left intact across tests within a single run.
* Many tests seed user id=1 once and reuse it; deleting users between tests
* would break FK-dependent rows mid-suite. The globalSetup provides a fresh
* migrated `familysync_test` at run start, so `users` starts empty and any
* seed inserted by the first test that needs it persists for the session.
* If a specific test leaks `users` rows that affect another test, scope a
* targeted delete inside that test's own beforeEach/afterEach instead.
*
* Environment:
* Set DB_HOST, DB_USER, DB_PASSWORD, DB_NAME in the test environment.
* Tests run against a local MariaDB dev database; production data is never touched.
* DB_HOST, DB_USER, DB_PASSWORD, and DB_NAME=familysync_test are injected by
* vitest.config.ts (test.env) for local runs. Under CI, DB_NAME=familysync is
* preserved from the job-level env and globalSetup is a no-op.
*/
import { afterEach } from 'vitest';