import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import test from "node:test"; import { bindFactTablePrint } from "../src/lib/report-fact-table-print"; function setup() { const details = [{ open: false }, { open: true }, { open: false }]; const outside = { open: false }; const events = new EventTarget(); const root = { querySelectorAll(selector: string) { assert.equal(selector, "details"); return details; } }; const cleanup = bindFactTablePrint(root as unknown as HTMLElement, events); return { details, outside, events, cleanup }; } test("fact table printing expands all report groups and restores mixed disclosure state", () => { const { details, outside, events, cleanup } = setup(); assert.deepEqual(details.map(item => item.open), [false, true, false]); events.dispatchEvent(new Event("beforeprint")); assert.deepEqual(details.map(item => item.open), [true, true, true]); assert.equal(outside.open, false); events.dispatchEvent(new Event("afterprint")); assert.deepEqual(details.map(item => item.open), [false, true, false]); cleanup(); }); test("fact table printing preserves the first snapshot across repeated beforeprint events", () => { const { details, events, cleanup } = setup(); events.dispatchEvent(new Event("beforeprint")); events.dispatchEvent(new Event("beforeprint")); events.dispatchEvent(new Event("afterprint")); assert.deepEqual(details.map(item => item.open), [false, true, false]); details[0].open = true; events.dispatchEvent(new Event("beforeprint")); events.dispatchEvent(new Event("afterprint")); assert.deepEqual(details.map(item => item.open), [true, true, false]); cleanup(); }); test("fact table print cleanup restores pending state and removes both event listeners", () => { const { details, events, cleanup } = setup(); events.dispatchEvent(new Event("afterprint")); events.dispatchEvent(new Event("beforeprint")); cleanup(); assert.deepEqual(details.map(item => item.open), [false, true, false]); events.dispatchEvent(new Event("beforeprint")); assert.deepEqual(details.map(item => item.open), [false, true, false]); }); test("fact table print styles remove horizontal clipping and repeat table headers", () => { const css = readFileSync(new URL("../src/app/globals.css", import.meta.url), "utf8"); const print = css.slice(css.indexOf("@media print"), css.indexOf("@theme inline")); assert.match(print, /\.personal-report-fact-table-scroll\s*\{[^}]*overflow: visible !important/); assert.match(print, /\.personal-report-fact-tables table\s*\{[^}]*table-layout: fixed/); assert.match(print, /\.personal-report-fact-tables thead\s*\{[^}]*display: table-header-group/); });