75 lines
4.2 KiB
TypeScript
75 lines
4.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { openDatabase } from "../src/db/database.js";
|
|
import { createTempDir } from "./utils/fs.js";
|
|
|
|
describe("SQLite migration", () => {
|
|
it("creates the normative schema with foreign keys enabled", () => {
|
|
const dir = createTempDir();
|
|
const db = openDatabase({ dbPath: `${dir}/progress.db` });
|
|
const fk = db.query<{ foreign_keys: number }>("PRAGMA foreign_keys").get();
|
|
expect(fk?.foreign_keys).toBe(1);
|
|
|
|
const tables = db.query<{ name: string }>("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((row) => row.name);
|
|
expect(tables).toContain("local_profile");
|
|
expect(tables).toContain("project_step_submissions");
|
|
expect(tables).toContain("tool_audit_logs");
|
|
expect(tables).toContain("intent_routes");
|
|
expect(tables).toContain("context_traces");
|
|
expect(tables).toContain("tool_evidence");
|
|
expect(tables).toContain("diagnostic_sessions");
|
|
expect(tables).toContain("diagnostic_concept_state");
|
|
expect(tables).toContain("generated_items");
|
|
expect(tables).toContain("generated_exercises");
|
|
expect(tables).toContain("generated_exercise_evaluators");
|
|
expect(tables).toContain("learning_evidence");
|
|
expect(tables).toContain("practice_contracts");
|
|
expect(tables).toContain("agent_practice_reviews");
|
|
|
|
const projectSteps = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'project_steps'").get();
|
|
expect(projectSteps?.sql).toContain("UNIQUE(id, project_plan_id)");
|
|
|
|
const routes = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'intent_routes'").get();
|
|
expect(routes?.sql).toContain("schema_version");
|
|
expect(routes?.sql).toContain("allowed_tool_group");
|
|
|
|
const traces = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'context_traces'").get();
|
|
expect(traces?.sql).toContain("trace_contains_sensitive_data");
|
|
|
|
const evaluatorStore = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'generated_exercise_evaluators'").get();
|
|
expect(evaluatorStore?.sql).toContain("evaluator_private");
|
|
|
|
const relations = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'concept_relations'").get();
|
|
expect(relations?.sql).toContain("'progression'");
|
|
expect(relations?.sql).toContain("'remediation'");
|
|
|
|
const evidence = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'learning_evidence'").get();
|
|
expect(evidence?.sql).toContain("source_type");
|
|
expect(evidence?.sql).toContain("validity_state");
|
|
|
|
const contracts = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'practice_contracts'").get();
|
|
expect(contracts?.sql).toContain("expected_behavior");
|
|
expect(contracts?.sql).toContain("acceptance_checklist_json");
|
|
expect(contracts?.sql).toContain("progress_eligible");
|
|
|
|
const reviews = db.query<{ sql: string }>("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'agent_practice_reviews'").get();
|
|
expect(reviews?.sql).toContain("submitted_code_hash");
|
|
expect(reviews?.sql).toContain("evidence_refs_json");
|
|
expect(reviews?.sql).not.toContain("submitted_code_snapshot");
|
|
|
|
const masteryColumns = db.query<{ name: string }>("PRAGMA table_info(concept_mastery)").all().map((column) => column.name);
|
|
expect(masteryColumns).toContain("readiness");
|
|
expect(masteryColumns).toContain("last_evidence_at");
|
|
|
|
const indexes = db.query<{ name: string }>("SELECT name FROM sqlite_master WHERE type = 'index'").all().map((row) => row.name);
|
|
expect(indexes).toContain("idx_session_sse_events_session_seq");
|
|
expect(indexes).toContain("idx_project_submissions_step_plan");
|
|
expect(indexes).toContain("idx_intent_routes_session_turn");
|
|
expect(indexes).toContain("idx_context_traces_session_turn");
|
|
expect(indexes).toContain("idx_generated_exercise_evaluators_exercise");
|
|
expect(indexes).toContain("idx_learning_evidence_concept_created");
|
|
expect(indexes).toContain("idx_practice_contracts_session_status");
|
|
expect(indexes).toContain("idx_agent_practice_reviews_contract_created");
|
|
db.close();
|
|
});
|
|
});
|