import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; import path from "node:path"; import test from "node:test"; import { productIds, productRegistry } from "../src/lib/product-domain-registry.ts"; import { consultationDomainIds } from "../src/lib/consultation-domain-registry.ts"; const root = path.resolve(import.meta.dirname, ".."); async function source(relative: string) { return readFile(path.join(root, relative), "utf8"); } test("independent products stay separate from ordinary consultation domains", () => { assert.deepEqual(productIds, [ "report_center", "rectification", "compatibility", "prashna", "muhurta", "annual_report", ]); assert.equal(productIds.some((id) => consultationDomainIds.includes(id as never)), false); assert.equal(consultationDomainIds.includes("annual"), true); assert.equal(productIds.includes("annual_report"), true); }); test("unreleased products default closed while existing product surfaces remain explicitly registered", () => { const enabled = productRegistry.filter((item) => item.defaultEnabled).map((item) => item.id); const disabled = productRegistry.filter((item) => !item.defaultEnabled).map((item) => item.id); assert.deepEqual(enabled, ["report_center", "rectification", "compatibility"]); assert.deepEqual(disabled, ["prashna", "muhurta", "annual_report"]); }); test("migration publishes the exact product flags and keeps unreleased products disabled", async () => { const sql = await source("supabase/migrations/20260814060000_product_feature_flags.sql"); for (const product of productRegistry) { assert.match(sql, new RegExp(`'${product.featureFlagKey.replaceAll(".", "\\.")}'`)); } for (const product of ["prashna", "muhurta", "annual_report"]) { assert.match(sql, new RegExp(`\\('product\\.${product}', 1, false, 0`)); } }); test("write and compute APIs enforce their independent product gates", async () => { const expected: Array<[string, string]> = [ ["src/app/api/rectification/agent/route.ts", 'isProductEnabled("rectification")'], ["src/app/api/rectification/cases/open/route.ts", 'isProductEnabled("rectification")'], ["src/app/api/rectification/cases/[caseId]/candidates/accept/route.ts", 'isProductEnabled("rectification")'], ["src/app/api/synastry/route.ts", 'isProductEnabled("compatibility")'], ["src/app/api/synastry-reports/route.ts", 'isProductEnabled("compatibility")'], ["src/app/api/reports/route.ts", 'isProductEnabled("report_center")'], ]; for (const [relative, gate] of expected) { assert.match(await source(relative), new RegExp(gate.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))); } });