Files
Termix/src/backend/tests/database/db/bootstrap-matches-schema.test.ts
T

55 lines
1.8 KiB
TypeScript
Raw Normal View History

+5
2026-08-19 14:12:06 -05:00
import fs from "fs";
import os from "os";
import path from "path";
import { getTableName, is, Table } from "drizzle-orm";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import * as schema from "../../../database/db/schema.js";
/**
* SQLite tables are created by hand-written DDL in `db/index.ts`, not generated
* from the drizzle schema. Adding a table to `schema.ts` alone therefore
* type-checks, passes the repository tests (which build their fixture straight
* from the schema), and still fails at runtime with "no such table".
*
* That is exactly how the automations tables shipped broken, so this compares
* the two directly: every table drizzle knows about has to exist after boot.
*/
describe("bootstrap creates every table in the drizzle schema", () => {
let dataDir: string;
beforeEach(() => {
dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "termix-schema-"));
vi.resetModules();
process.env.DATA_DIR = dataDir;
process.env.DB_FILE_ENCRYPTION = "false";
process.env.ALLOW_EMPTY_DATA_DIR = "true";
});
afterEach(() => {
delete process.env.DATA_DIR;
delete process.env.DB_FILE_ENCRYPTION;
delete process.env.ALLOW_EMPTY_DATA_DIR;
fs.rmSync(dataDir, { recursive: true, force: true });
});
it("leaves no schema table missing from a fresh database", async () => {
const expected = Object.values(schema)
.filter((value) => is(value, Table))
.map((table) => getTableName(table as Table))
.sort();
const db = await import("../../../database/db/index.js");
await db.initializeDatabase();
const present = new Set(
db
.getSqlite()
.prepare("SELECT name FROM sqlite_master WHERE type = 'table'")
.pluck()
.all() as string[],
);
expect(expected.filter((name) => !present.has(name))).toEqual([]);
});
});