- schema.ts: export localCredentials = mysqlTable('local_credentials', {...})
- user_id FK->users(cascade), username, password_hash, createdAt, updatedAt
- UNIQUE(user_id), UNIQUE(username), INDEX(user_id)
- 0003_warm_deathstrike.sql: purely additive CREATE TABLE (no ALTER/DROP/TRUNCATE on existing tables)
- Applied to dev DB: pnpm --filter @familysync/api db:migrate exits 0
- test/setup.ts: add localCredentials to afterEach delete cleanup (FK-safe ordering)
- generate-secrets.mjs: emit LOCAL_SESSION_SECRET (base64 32-byte, >=32 chars, D-05)
- .dockerignore: add apps/api/scripts/ exclusion (D-15/IMG-02) — entire break-glass dir excluded
50 lines
2.3 KiB
TypeScript
50 lines
2.3 KiB
TypeScript
/**
|
|
* 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, localCredentials } 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);
|
|
// Phase 19: local_credentials has FK to users (cascade delete via users); truncate here
|
|
// so each test starts with a clean credential slate. users intentionally left intact.
|
|
await db.delete(localCredentials);
|
|
} 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.
|
|
}
|
|
});
|