import { installDom } from "./dom.ts"; import { createRequire } from "node:module"; import assert from "node:assert/strict"; import { test } from "node:test"; import { mountDashboard } from "../src/dashboard.ts"; import { blockerView, collisionHistory, reviewGate, stateView } from "../src/model.ts"; import { ownerNeeds, copyText } from "../src/needs-you-model.ts"; import { packetStatus } from "../src/view.tsx"; import { createHttpTransport } from "../src/transport.ts"; import { collisionFixtureState } from "./collision-fixtures.ts"; import { reviewFixtureDetail } from "./review-fixtures.ts"; const { JSDOM } = createRequire(import.meta.url)("jsdom"); const brand = { name: "Fixture product", tagline: "Offline fixture" }; const origin = "https://fixture.idiot.tax"; test("wire resolution, legacy fallback and pushing-fork gate share one contract", () => { const wire = collisionFixtureState(); const open = wire.blockers[0]; for (const resolution of [ undefined, null, { at: "2026-10-13T14:02:00Z", by: "owner" as const, reason: "Settled" }, ]) { open.resolved = resolution; const state = stateView(wire); const [pusher, claimant] = state.reviews; assert.equal(state.blockers[0].resolved, resolution != null); assert.equal(reviewGate(pusher, state).approve, resolution != null); assert.equal(reviewGate(claimant, state).approve, true); assert.equal(packetStatus(claimant.packet, state).label, "In review"); assert.equal(packetStatus(pusher.packet, state).label, resolution ? "In review" : "Blocked"); assert.equal( ownerNeeds(state, brand).filter((i) => i.kind === "blocker").length, resolution ? 0 : 1, ); } open.resolved = null; const state = stateView(wire); const review = state.reviews[0]; assert.equal(reviewGate({ ...review, packet: "another-packet" }, state).approve, true); state.blockers[0].pushingPacket = null; assert.equal(reviewGate({ ...review, packet: "another-packet" }, state).approve, false); assert.match(reviewGate(review, state, false).reason, /Waiting for the owner/); assert.doesNotMatch(reviewGate(review, state, false).reason, /Mark the collision/); const need = ownerNeeds(state, brand).find((n) => n.kind === "blocker")!; assert.match(copyText(need.outcome), /reviews from/); assert.deepEqual(need.target, { packet: "claimant-packet", collision: "collision-1" }); }); test("history sorts open by real push times, legacy stably, then resolved by resolution time", () => { const state = stateView(collisionFixtureState("collision-history")); const open = state.blockers[0]; const blockers = [ ...state.blockers, { ...open, id: "legacy-1", at: null }, { ...open, id: "newer", at: "2026-10-13T14:02:00Z" }, { ...open, id: "legacy-2", at: null }, ]; assert.deepEqual( collisionHistory(blockers).map((b) => b.id), [ "newer", "collision-1", "legacy-1", "legacy-2", "resolved-owner", "resolved-release", "resolved-promote", ], ); assert.equal(blockerView({ ...collisionFixtureState().blockers[0], at: undefined }).at, null); }); async function until(check: () => unknown) { for (let i = 0; i < 250; i++) { if (check()) return; await new Promise((r) => setTimeout(r, 5)); } assert.fail("Collision DOM did not settle"); } function setup({ owner = true, scenario = "collision-open", route = "work", outcome = "owner", detailMode = "complete", }: { detailMode?: "complete" | "omitted" | "stale"; owner?: boolean; scenario?: string; route?: string; outcome?: "owner" | "release" | "promote" | "missing" | "error"; } = {}) { const dom = new JSDOM('
', { url: `${origin}/#${route}` }); installDom(dom.window); const root = dom.window.document.getElementById("dashboard")! as HTMLElement; const wire = collisionFixtureState(scenario); const calls: { path: string; init?: RequestInit }[] = []; const transport = createHttpTransport({ origin, fetch: async (input, init) => { const path = new URL(String(input)).pathname; calls.push({ path, init }); if (path.endsWith("/state")) return Response.json(wire); if (path.endsWith("/activity")) return Response.json({ activity: [], nextAfter: 0 }); if (path.endsWith("/resolve")) { if (outcome === "missing") { wire.blockers = []; return Response.json({ error: "private raw error" }, { status: 404 }); } if (outcome === "error") return Response.json({ error: "private raw error" }, { status: 503 }); const blocker = wire.blockers[0]; blocker.resolved = { at: "2026-10-13T14:05:00Z", by: outcome, ...(outcome === "owner" ? { reason: JSON.parse(String(init!.body)).reason } : {}), }; return Response.json({ blocker }); } const review = wire.reviews.find((r) => path.endsWith(`/${r.id}`))!; return Response.json({ ...reviewFixtureDetail({ ...wire, reviews: [review] }), blockers: detailMode === "omitted" ? [] : detailMode === "stale" ? wire.blockers.map((b) => ({ ...b, resolved: null })) : wire.blockers.filter((b) => b.packet === review.packet), packet: wire.packets.find((p) => p.id === review.packet)!, }); }, }); const app = mountDashboard(root, { brand, fixture: true, owner, initialProject: scenario, transport, }); return { dom, root, wire, calls, app, close() { app.dispose(); dom.window.close(); }, }; } function fill(c: ReturnType