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(); }); });