/** * Vitest per-file test setup for apps/api. * * 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. * * 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: * 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'; import { db } from '../src/db/client.js'; import { lists, listItems, listShares, pushSubscriptions } from '../src/db/schema.js'; /** * Truncate list and push tables in FK-safe order after each test. * list_items and list_shares have FK to lists; delete children first. * pushSubscriptions has FK to users via user_id; deleted before lists (no FK to lists). * Called automatically via afterEach — no per-test setup needed. */ afterEach(async () => { try { // Delete child rows first to avoid FK constraint violations await db.delete(listItems); await db.delete(listShares); await db.delete(pushSubscriptions); await db.delete(lists); } catch { // DB may not be available in pure-unit test runs (no DB_HOST configured). // Swallow the error — pure-logic tests do not need cleanup. } });