import "./dom.ts"; import assert from "node:assert/strict"; import test from "node:test"; import { createRequire } from "node:module"; const { JSDOM } = createRequire(import.meta.url)("jsdom"); import { createElement } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { TooltipProvider } from "@cloudflare/kumo"; import { installDom } from "./dom.ts"; import { raceFixtureState } from "./race-fixtures.ts"; import { stateView } from "../src/model.ts"; import { saddlecloth } from "../src/lane.tsx"; import { RaceView } from "../src/race.tsx"; import { entrantResult, ordinal, photoFinish, raceEntrants, raceSplit, raceStart, rejectionDelta, } from "../src/race-model.ts"; import { mountDashboard } from "../src/dashboard.ts"; import { renderDashboard } from "../src/render.ts"; import type { ProjectState, DashboardTransport } from "../src/contracts.ts"; import type { ViewModel } from "../src/model.ts"; import type { ViewActions } from "../src/view.tsx"; import { getByRole } from "./roles.ts"; const brand = { name: "Fixture app", tagline: "Fixture" }; const actions: ViewActions = { section: "work", owner: true, openReview() {}, openRace() {}, setSection() {}, async selectProject() {}, async action() {}, }; function view(scenario = "race-open"): ViewModel { const state = stateView(raceFixtureState(scenario)); return { brand, project: scenario, projects: [], fixture: true, state, activity: state.recentActivity ?? [], busy: false, }; } function html(value = view()) { return renderToStaticMarkup( createElement( TooltipProvider, null, createElement(RaceView, { packet: "race-01", view: value, actions }), ), ); } const until = async (check: () => boolean) => { for (let i = 0; i < 100; i++) { if (check()) return; await new Promise((resolve) => setTimeout(resolve, 10)); } assert.fail("Expected fixture UI did not appear"); }; test("race projection retains exact ledger reference, enrollment time and rejected attempt", () => { const state = view("race-photo").state!; assert.equal(state.races![0].ledgerEntryId, "ledger-race-1"); assert.equal(state.ledger[0].id, "ledger-race-1"); assert.equal(state.ledger[0].before, "a".repeat(40)); assert.equal(state.ledger[0].race, "race-01"); assert.deepEqual(state.races![0].places, [ { agent: "cedar", place: 1 }, { agent: "birch", place: 2 }, { agent: "amber", place: 3 }, ]); assert.equal(state.reviews[0].receipt?.checks[0].tier, "quick"); assert.equal(state.reviews[0].receipt?.checks[0].runtime, "dynamic-worker"); assert.equal(state.races![0].entrants[2].promoteRejected?.found, "c".repeat(40)); assert.equal(state.agents[0].createdAt, "2026-10-13T14:00:00Z"); }); test("saddlecloth identity follows enrollment and repeats independently of claim and response order", () => { const state = view().state!; assert.equal(saddlecloth(state, "amber"), 1); assert.equal(saddlecloth(state, "birch"), 2); assert.equal(saddlecloth(state, "cedar"), 3); state.agents.reverse(); state.agents.push({ name: "alder", createdAt: "2026-10-13T14:05:00Z" }); assert.equal(saddlecloth(state, "birch"), 2); assert.equal(saddlecloth(state, "alder"), 4); assert.equal(saddlecloth(state, "missing"), undefined); }); test("same-time bootstrap enrollment tie-breaks alphabetically and lane order is stable", () => { const state = view().state!; state.agents = [ { name: "birch", createdAt: "2026-10-13T14:00:00Z" }, { name: "amber", createdAt: "2026-10-13T14:00:00Z" }, ]; assert.equal(saddlecloth(state, "amber"), 1); assert.equal(saddlecloth(state, "birch"), 2); const race = state.races![0]; race.entrants[1].claimedAt = race.entrants[2].claimedAt; // Fork aliases must not override core's agent tie-break at an equal claim time. race.entrants[1].repoName = "aaa-fork"; race.entrants[2].repoName = "zzz-fork"; const before = raceEntrants(race).map((entrant) => entrant.agent); assert.deepEqual(before, ["birch", "cedar", "amber"]); race.entrants.reverse(); assert.deepEqual( raceEntrants(race).map((entrant) => entrant.agent), before, ); }); test("one recorded race clock includes late claims, seconds, hours and supplied milliseconds", () => { assert.equal(raceSplit("2026-10-13T14:03:00Z", Date.parse("2026-10-13T14:02:00Z")), "01:00"); assert.equal( raceSplit("2026-10-13T15:06:45.400Z", Date.parse("2026-10-13T14:02:00Z")), "1:04:45.4", ); assert.equal(raceSplit(null, 0), ""); assert.equal(raceSplit("invalid", 0), ""); assert.equal(rejectionDelta("2026-10-13T14:14:00.400Z", "2026-10-13T14:14:00Z"), "0.4 s after"); assert.equal(rejectionDelta("2026-10-13T14:14:13Z", "2026-10-13T14:14:00Z"), "13 s after"); assert.equal(rejectionDelta("2026-10-13T14:13:59Z", "2026-10-13T14:14:00Z"), ""); assert.deepEqual([1, 2, 3, 11, 12, 13, 21].map(ordinal), [ "1st", "2nd", "3rd", "11th", "12th", "13th", "21st", ]); }); test("semantic track keeps claim order at finish, checks after request, and real evidence", () => { const value = view("race-finished"), state = value.state!, race = state.races![0]; assert.deepEqual( raceEntrants(race).map((entry) => entry.agent), ["birch", "cedar", "amber"], ); race.entrants.find((entry) => entry.agent === "birch")!.claimedAt = "2026-10-13T14:01:59Z"; const dom = new JSDOM(html(value)); const track = dom.window.document.querySelector(".race-track")!; assert.equal(track.querySelector("caption")!.textContent, "Race progress for race-01"); assert.deepEqual( [...track.querySelectorAll("tbody tr")].map((row) => row.getAttribute("data-race-agent")), ["birch", "cedar", "amber"], ); assert.deepEqual( [...track.querySelectorAll("thead th")].map((th) => th.textContent), [ "Runner", "Claimed", "First push", "Review requested", "Checks passed", "Approved", "Promoted", "Tokens", "Result", ], ); assert.match(track.textContent!, /Checks failed, plus/); assert.match(track.textContent!, /Promoted to main aaaaaaa → ccccccc/); assert.match(track.textContent!, /Closed at the finish/); assert.equal(track.querySelector(".lane-marker-review")!.textContent, "○"); assert.equal(track.querySelector(".lane-marker-approved")!.textContent, "◆"); assert.equal(track.querySelector(".race-saddlecloth .sr-only")!.textContent, "Agent number 2"); assert.doesNotMatch(html(value), /Photo finish|progressbar|% done/); assert.equal(raceStart(race), Date.parse("2026-10-13T14:01:59Z")); }); test("photo finish requires two recorded approvals before finish; rejected rows require data", () => { const value = view("race-photo"), race = value.state!.races![0]; assert.equal(photoFinish(race), 2); assert.match(html(value), /2 entrants were approved/); assert.match( html(value), /birch.*tried to promote.*expected.*aaaaaaa.*found.*ccccccc.*0.4 s after/, ); assert.match(html(value), /Main moved/); race.entrants.forEach((entry) => (entry.promoteRejected = null)); assert.doesNotMatch(html(value), /tried to promote|s after/); race.entrants.find((entry) => entry.agent === "birch")!.approvedAt = "2026-10-13T14:15:00Z"; assert.equal(photoFinish(race), 1); assert.doesNotMatch(html(value), /Photo finish/); }); test("failed check details and later retry count come only from the entrant's own receipts", () => { const value = view(); const review = value.state!.reviews.find((candidate) => candidate.agent === "birch")!; const failed = structuredClone(review); failed.id = "earlier-failed-review"; failed.requestedAt = "2026-10-13T14:06:00Z"; failed.receipt!.status = "failed"; failed.receipt!.checks = [{ name: "brand", tier: "full", outcome: "failed", durationMs: 13000 }]; value.state!.reviews.push(failed); const dom = new JSDOM(html(value)); const hurdle = dom.window.document.querySelector( '[data-race-agent="birch"] .race-hurdle-button', )!; assert.match( hurdle.getAttribute("aria-label")!, /brand · failed · 13 s; retried, passed at \+09:00\.0/, ); assert.match(dom.window.document.querySelector(".race-results")!.textContent!, /1 of 2/); }); test("missing ledger and activity never invent before/after or push counts", () => { const value = view("race-photo"); // An unrelated first entry must not replace the exact ledger id binding. value.state!.ledger.unshift({ ...value.state!.ledger[0], id: "unrelated", before: "e".repeat(40), sha: "f".repeat(40), }); assert.match(html(value), /aaaaaaa → ccccccc/); assert.doesNotMatch(html(value), /eeeeeee → fffffff/); value.state!.ledger[1].id = "different-entry"; value.activity = []; assert.doesNotMatch(html(value), /aaaaaaa → ccccccc|]*>Pushes/); }); function resultsPushes(value: ViewModel) { const dom = new JSDOM(html(value)); const compare = dom.window.document.querySelector(".race-compare")!; const agents = [...compare.querySelectorAll("thead th")].slice(1).map((cell) => cell.textContent); const pushRow = [...compare.querySelectorAll("tbody tr")].find((row) => row.querySelector("th")?.textContent === "Recorded pushes", )!; const counts = [...pushRow.querySelectorAll(".compare-value")].map((cell) => cell.textContent); const results = [...dom.window.document.querySelectorAll(".race-results tbody tr")].map((row) => [ row.querySelector(".race-runner strong")!.textContent, row.querySelector('[data-label="Pushes"]')?.textContent, ]); for (const [agent, count] of results) assert.equal(counts[agents.indexOf(agent)], count); return results; } test("reused forks count only their race pushes, independently of loaded activity order", () => { const value = view("race-reused-forks"); const race = value.state!.races![0]; assert.deepEqual(race.entrants.map((entry) => value.activity.filter((event) => event.repoName === entry.repoName).length, ), [3, 20]); assert.deepEqual(resultsPushes(value), [["cedar", "1"], ["birch", "1"]]); value.activity.reverse(); assert.deepEqual(resultsPushes(value), [["cedar", "1"], ["birch", "1"]]); }); test("race pushes include interval endpoints, exclude unrelated Git events, and honor close/finish/now", (t) => { const value = view("race-reused-forks"); const race = value.state!.races![0]; const birch = race.entrants.find((entry) => entry.agent === "birch")!; const event = value.activity.find((entry) => entry.repoName === birch.repoName)!; const push = (at: string, fields = {}) => ({ ...event, recordedAt: at, ...fields }); birch.closedAt = "2026-10-13T14:04:00.000Z"; value.activity = [ push(birch.claimedAt), push(birch.closedAt), // Provider event time never brings an out-of-window receive back into this race. push("2026-10-13T14:01:59.999Z", { eventTimestamp: birch.claimedAt }), push("2026-10-13T14:04:00.001Z", { eventTimestamp: birch.closedAt }), push(birch.claimedAt, { ref: "refs/heads/other" }), push(birch.claimedAt, { after: "0".repeat(40) }), push(birch.claimedAt, { repoName: "unrelated-fork" }), push("invalid"), ]; assert.deepEqual(resultsPushes(value), [["cedar", "0"], ["birch", "2"]]); birch.closedAt = null; race.finishedAt = "2026-10-13T14:04:00.000Z"; assert.equal(resultsPushes(value)[1][1], "2"); race.finishedAt = null; t.mock.method(Date, "now", () => Date.parse("2026-10-13T14:04:00.000Z")); assert.equal(resultsPushes(value)[1][1], "2"); }); test("incomplete loaded race history hides the entire Pushes column and its caption", () => { const value = view("race-reused-forks"); // Coverage includes cedar's later claim, but not birch's earlier claim. const laterClaim = value.state!.races![0].entrants.find((entry) => entry.agent === "cedar")!.claimedAt; value.activity = value.activity.filter((event) => Date.parse(event.recordedAt) >= Date.parse(laterClaim), ); value.activity.unshift({ ...value.activity[0], recordedAt: laterClaim, repoName: value.state!.project.repoName }); assert.doesNotMatch(html(value), /]*>Pushes|data-label="Pushes"|Pushes from loaded activity|Recorded pushes|Push counts cover/); value.activity = []; assert.doesNotMatch(html(value), /data-label="Pushes"|Pushes from loaded activity|Recorded pushes|Push counts cover/); }); test("advisory approval skips hollow check marker with a connector and remains truthful", () => { const value = view("race-advisory"); const dom = new JSDOM(html(value)); const lane = dom.window.document.querySelector('[data-race-agent="cedar"]')!; assert.match( lane.querySelector('[data-milestone="receiptPassedAt"]')!.textContent!, /Checks failed/, ); assert.match( lane.querySelector('[data-milestone="approvedAt"]')!.getAttribute("style")!, /--race-gap:2/, ); }); test("receipt interruption fixtures use warning discs while failed checks keep the cross", () => { for (const [scenario, label, kind, glyph] of [ ["race-timed-out", "Timed out", "interrupted", "!"], ["race-couldnt-run", "Couldn't run", "interrupted", "!"], ["race-finished", "Failed", "failed", "✗"], ]) { const dom = new JSDOM(html(view(scenario))); try { const cell = dom.window.document.querySelector( '[data-race-agent="amber"] [data-milestone="receiptPassedAt"]', )!; assert.match(cell.textContent!, new RegExp(label)); assert.equal(cell.querySelector(`.lane-marker-${kind}`)!.textContent, glyph); assert.equal(cell.querySelector(".lane-marker")!.getAttribute("aria-hidden"), "true"); assert.ok(cell.querySelector(".sr-only")!.textContent!.includes(label.toLowerCase())); } finally { dom.window.close(); } } }); test("two-digit fixture keeps enrollment numbers throughout the race", () => { const value = view("race-two-digit"); const dom = new JSDOM(html(value)); try { for (const [agent, number] of [["amber", 10], ["birch", 11], ["cedar", 12]] as const) { assert.equal(saddlecloth(value.state!, agent), number); const cloth = dom.window.document.querySelector(`[data-race-agent="${agent}"] .race-saddlecloth`)!; assert.equal(cloth.querySelector('[aria-hidden="true"]')!.textContent, String(number)); assert.equal(cloth.querySelector(".sr-only")!.textContent, `Agent number ${number}`); const track = getByRole(dom.window.document.body, "table", { name: "Race progress for race-01" }); assert.ok(getByRole(track, "row", { name: new RegExp(`^Agent number ${number} ${agent}\\b`) })); } } finally { dom.window.close(); } }); test("closed provenance never labels release or owner close as closed at finish", () => { const entrant = view().state!.races![0].entrants[0]; entrant.closedAt = entrant.claimedAt; entrant.closedBy = "release"; assert.equal(entrantResult(entrant, true), "Left the race"); entrant.closedBy = "owner"; assert.equal(entrantResult(entrant, false), "Closed by the owner"); entrant.closedBy = undefined; assert.equal(entrantResult(entrant, true), "Closed"); }); test("empty, loading, error, unknown and standard pages contain no invented lanes", () => { assert.match(html(view("race-empty")), /No entrants yet. Agents join by claiming race-01./); assert.match(html({ ...view(), state: undefined, busy: true }), /Loading race…/); assert.match( html({ ...view(), state: undefined, error: "fixture error" }), /Couldn't load this race.*Try again/, ); assert.match(html(view("race-unknown")), /This race doesn't exist anymore./); assert.match(html(view("race-standard")), /This packet isn't a race./); }); test("Work and Review badges and Needs you race copy use packet mode", () => { const content = renderDashboard(view()); assert.match(content, /3 entrants/); assert.match(content, /Racing/); assert.match(content, /First promote wins the race./); assert.match(renderDashboard(view("race-photo")), /Won by cedar/); }); test("race route opens from Work, supports back/opaque history and stays read-only for agents", async () => { const dom = new JSDOM('
', { url: "https://fixture.idiot.tax/#work" }); installDom(dom.window as unknown as Window & typeof globalThis); const state: ProjectState = view().state!; const writes: string[] = []; const transport: DashboardTransport = { async getState() { return structuredClone(state); }, async getActivity() { return { activity: [], nextAfter: 0 }; }, async approve() { writes.push("approve"); }, async promote() { writes.push("promote"); return { sha: "fixture" }; }, }; const root = dom.window.document.getElementById("dashboard")! as HTMLElement; const app = mountDashboard(root, { brand, transport, initialProject: state.project.id, owner: false, }); try { await until(() => !!root.querySelector(".packet-link")); const historyLength = dom.window.history.length; root.querySelector(".packet-link")!.click(); await until(() => !!root.querySelector(".race-track")); assert.equal(dom.window.history.length, historyLength + 1); assert.equal(dom.window.location.hash, "#race/race-01"); await until(() => dom.window.document.activeElement?.id === "race-title"); assert.equal(root.querySelector("#activity-panel"), null); assert.equal(root.querySelector('[data-action="promote"]'), null); assert.equal(root.querySelector('[data-action="approve"]'), null); assert.deepEqual(writes, []); await app.refresh(); assert.ok(root.querySelector(".race-track")); [...root.querySelectorAll("button")] .find((button) => button.textContent === "← Work")! .click(); await until(() => !!root.querySelector("#view-work")); assert.equal(dom.window.location.hash, "#work"); await until(() => dom.window.document.activeElement === root.querySelector(".packet-link")); dom.window.history.pushState = () => { throw new dom.window.DOMException("Opaque", "SecurityError"); }; root.querySelector(".packet-link")!.click(); await until(() => !!root.querySelector(".race-track")); assert.equal(dom.window.location.hash, "#race/race-01"); } finally { app.dispose(); dom.window.close(); } }); test("race Promote dialog states the other open entrants before owner confirmation", async () => { const dom = new JSDOM('
', { url: "https://fixture.idiot.tax/#review" }); installDom(dom.window as unknown as Window & typeof globalThis); const state = view().state!; const root = dom.window.document.getElementById("dashboard")! as HTMLElement; const transport: DashboardTransport = { async getState() { return state; }, async getActivity() { return { activity: [], nextAfter: 0 }; }, async approve() {}, async promote() { assert.fail("Opening a dialog must never write"); }, }; const app = mountDashboard(root, { brand, transport, initialProject: state.project.id }); try { await until(() => !!root.querySelector('[data-action="promote"]')); root.querySelector('[data-action="promote"]')!.click(); await until(() => !!dom.window.document.querySelector(".promotion-dialog")); assert.match( dom.window.document.querySelector(".promotion-dialog")!.textContent!, /Promoting this finishes the race. amber and birch will be closed and placed./, ); } finally { app.dispose(); dom.window.close(); } }); test("a finished race without a recorded winner omits Won in", () => { const value = view("race-finished"); value.state!.races![0].winner = null; assert.doesNotMatch(html(value), /Won in/); value.state!.races![0].winner = "cedar"; assert.match(html(value), /Won in/); });