mirror of
https://github.com/YuzuZensai/Termix.git
synced 2026-11-12 14:52:13 +00:00
55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
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([]);
|
||
|
|
});
|
||
|
|
});
|