import { readFileSync } from 'node:fs'; import { describe, expect, it } from 'vitest'; const sql = readFileSync(new URL('../../server/postgres/migrations/026_global_regulatory_mapping.sql', import.meta.url), 'utf8'); describe('global regulatory mapping persistence schema', () => { it('replaces the per-occurrence tables with global, rule-keyed tables', () => { // The prior per-occurrence tables are dropped. expect(sql).toContain('DROP TABLE IF EXISTS assessor_regulatory_mapping_decisions'); expect(sql).toContain('DROP TABLE IF EXISTS assessor_regulatory_mapping_runs'); // Mappings are global: keyed by rule identity plus pipeline versions, never by project or occurrence. expect(sql).toContain('CREATE TABLE assessor_regulatory_mappings'); expect(sql).not.toContain('project_id'); expect(sql).not.toContain('source_result_id'); expect(sql).toContain('rule_key text NOT NULL'); expect(sql).toContain('UNIQUE (rule_key, corpus_version, retrieval_version, prompt_version, model)'); // Decisions are global, append-only, keyed by rule identity and control. expect(sql).toContain('CREATE TABLE assessor_regulatory_mapping_decisions'); expect(sql).toContain('previous_decision_id text REFERENCES assessor_regulatory_mapping_decisions(id)'); expect(sql).toContain("decision text NOT NULL CHECK (decision IN ('accepted', 'rejected'))"); expect(sql).toMatch(/assessor_regulatory_mapping_decisions_rule_control_idx[\s\S]*\(rule_key, control_id/); }); });