import test from "node:test"; import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; test("every preload invoke channel has a registered IPC handler", async () => { const preload = await readFile( new URL("../preload.cjs", import.meta.url), "utf8", ); const ipc = await readFile( new URL("../src/main/ipc.cjs", import.meta.url), "utf8", ); const invokes = [...preload.matchAll(/invoke\(\s*['"]([^'"]+)['"]/g)].map( (match) => match[1], ); const handlers = new Set( [...ipc.matchAll(/register\(\s*['"]([^'"]+)['"]/g)].map( (match) => match[1], ), ); assert.ok(invokes.length > 40, "expected the complete renderer API surface"); assert.deepEqual( invokes.filter((channel) => !handlers.has(channel)), [], ); }); test("every renderer bridge call is exposed by the preload contract", async () => { const renderer = await readFile( new URL("../src/renderer/app.js", import.meta.url), "utf8", ); const preload = await readFile( new URL("../preload.cjs", import.meta.url), "utf8", ); const calls = new Set( [...renderer.matchAll(/window\.forgeflow\.([A-Za-z0-9_]+)\s*\(/g)].map( (match) => match[1], ), ); const exposed = new Set( [...preload.matchAll(/^\s{2}([A-Za-z0-9_]+):/gm)].map((match) => match[1]), ); assert.ok(calls.size > 40, "expected the complete renderer bridge surface"); assert.deepEqual( [...calls].filter((method) => !exposed.has(method)), [], ); });