test(api): Infra (health/db/schema/seed/env/migrate) — fill gaps + lifecycle test

Drives all infra src files to 100% (env.ts, db/client.ts, db/ensure-dir.ts,
db/migrate.ts, db/seed.ts, routes/health.ts).

- env.test.ts: dev defaults when unset, overrides when set (PORT coerced),
  CORS_ORIGINS parsing (trim + drop empties) and empty-fallback.
- db.test.ts: runMigrations idempotency; ensureDbDir no-op for non-file URLs
  and bare filenames (branch coverage).
- seed.test.ts: production guard — no dev users seeded when NODE_ENV=production.
- c8-ignore the migrate.ts/seed.ts CLI direct-run blocks (unreachable under vitest).

No lifecycle test (infra domain, per plan). No bugs found — infra code correct;
only coverage gaps. All 112 API tests green; typecheck + oxlint clean.
This commit is contained in:
Bas van Rossem
2026-07-22 11:39:34 +02:00
parent 0564fab1e6
commit 2fa8aa9154
6 changed files with 133 additions and 1 deletions

View File

@@ -1,8 +1,9 @@
import { describe, it, expect } from 'vitest';
import { describe, it, expect, beforeEach } from 'vitest';
import { inArray, eq } from 'drizzle-orm';
import { seed } from '../src/db/seed';
import { db } from '../src/db/client';
import { activities, user } from '../src/db/schema';
import { resetDb } from './helpers';
const SEED_NAMES = ['Leerrand', 'Frezen', 'Slijpen', 'Bekleden', 'Afwerken', 'Printen'];
@@ -37,3 +38,27 @@ describe('seed', () => {
);
});
});
describe('seed — production guard', () => {
beforeEach(resetDb);
it('seeds reference activities but never the dev users when NODE_ENV=production', async () => {
const prev = process.env.NODE_ENV;
process.env.NODE_ENV = 'production';
try {
await seed();
} finally {
if (prev === undefined) delete process.env.NODE_ENV;
else process.env.NODE_ENV = prev;
}
const devUsers = await db
.select()
.from(user)
.where(inArray(user.email, ['worker@solelog.local', 'admin@solelog.local']));
expect(devUsers).toHaveLength(0);
const acts = await db.select().from(activities).where(inArray(activities.name, SEED_NAMES));
expect(acts.length).toBe(SEED_NAMES.length);
});
});