import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import test from "node:test"; import { consultationDomainIds, consultationEngineDomainIds } from "../src/lib/consultation-domain-registry.ts"; const migration = readFileSync( new URL("../supabase/migrations/20260814050000_consultation_domain_registry.sql", import.meta.url), "utf8", ); function themeConstraintValues(sql: string) { const constraint = sql.match(/add constraint chat_sessions_theme_check[\s\S]*?check \(theme in \(([\s\S]*?)\)\);/i); assert.ok(constraint, "chat_sessions theme constraint must be present"); return [...constraint[1].matchAll(/'([a-z][a-z0-9_-]*)'/g)].map((match) => match[1]); } test("chat_sessions persists exactly the canonical consultation domains", () => { // 原值:CHECK 值 == consultationDomainIds。 // 新值:CHECK 值 == consultationEngineDomainIds(会话主题 / 引擎领域);parents、children 只在数据卡里区分,不落库。 // 原因:TASK-consult-evidence-card-20260927 D2,不改数据库。 assert.deepEqual(themeConstraintValues(migration), [...consultationEngineDomainIds]); assert.deepEqual( consultationDomainIds.filter((domain) => !(consultationEngineDomainIds as readonly string[]).includes(domain)), ["parents", "children"], ); }); test("chat_sessions does not persist aliases or independent product routes", () => { const values = themeConstraintValues(migration); for (const rejected of ["relationship", "finance", "health_pressure", "home", "prashna", "muhurta", "rectification", "compatibility", "spirituality"]) { assert.equal(values.includes(rejected), false, rejected); } });