Files
NextEdu/scripts/arch-scan/schema.test.ts

53 lines
1.9 KiB
TypeScript

import { describe, it, expect } from "vitest";
import Database from "better-sqlite3";
import { initSchema } from "./schema";
describe("initSchema", () => {
it("should create all 12 tables", () => {
const db = new Database(":memory:");
initSchema(db);
const tables = db
.prepare(
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
)
.all() as { name: string }[];
const tableNames = tables.map((t) => t.name);
expect(tableNames).toContain("modules");
expect(tableNames).toContain("files");
expect(tableNames).toContain("symbols");
expect(tableNames).toContain("calls");
expect(tableNames).toContain("file_imports");
expect(tableNames).toContain("module_deps");
expect(tableNames).toContain("tech_tags");
expect(tableNames).toContain("symbol_tech_tags");
expect(tableNames).toContain("permissions");
expect(tableNames).toContain("routes");
expect(tableNames).toContain("db_tables");
expect(tableNames).toContain("scan_meta");
});
it("should create all indexes", () => {
const db = new Database(":memory:");
initSchema(db);
const indexes = db
.prepare(
"SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%' ORDER BY name"
)
.all() as { name: string }[];
const indexNames = indexes.map((i) => i.name);
expect(indexNames).toContain("idx_symbols_file");
expect(indexNames).toContain("idx_symbols_name");
expect(indexNames).toContain("idx_calls_caller");
expect(indexNames).toContain("idx_calls_callee");
expect(indexNames).toContain("idx_file_imports_source");
expect(indexNames).toContain("idx_file_imports_target");
expect(indexNames).toContain("idx_symbol_tech_tags_tag");
});
it("should be idempotent", () => {
const db = new Database(":memory:");
expect(() => initSchema(db)).not.toThrow();
expect(() => initSchema(db)).not.toThrow();
});
});