import { afterEach, describe, expect, mock, test } from "bun:test";
import TestRenderer, { act } from "react-test-renderer";
import { MemoryRouter, Route, Routes } from "react-router";
import { ToastProvider } from "../components/toast";
let currentFilesPayload: any = null;
let currentRunStatus = "succeeded";
const multiFileDiffCalls: any[] = [];
const patchDiffCalls: any[] = [];
const virtualizerCalls: any[] = [];
const providerCalls: any[] = [];
const mountedRenderers: TestRenderer.ReactTestRenderer[] = [];
mock.module("@pierre/diffs/react", () => ({
MultiFileDiff: (props: any) => {
multiFileDiffCalls.push(props);
return
{props.newFile.name}
;
},
PatchDiff: (props: any) => {
patchDiffCalls.push(props);
return {props.patch}
;
},
Virtualizer: (props: any) => {
virtualizerCalls.push(props);
return {props.children}
;
},
WorkerPoolContextProvider: (props: any) => {
providerCalls.push(props);
return {props.children}
;
},
}));
mock.module("../lib/queries", () => ({
useRun: () => ({
data: {
run_id: "run_1",
title: "Run 1",
repository: { name: "fabro" },
status: { kind: currentRunStatus },
workflow_slug: "default",
workflow_name: "Default",
duration_ms: null,
elapsed_secs: null,
source_directory: null,
},
}),
useRunFiles: () => ({
data: currentFilesPayload,
error: null,
isLoading: false,
isValidating: false,
mutate: mock(() => Promise.resolve(currentFilesPayload)),
}),
useRunQuestions: () => ({ data: [] }),
}));
const { default: RunFiles } = await import("./run-files");
function makeFiles(count: number) {
return Array.from({ length: count }, (_, index) => {
const name = `src/file-${index}.ts`;
return {
change_kind: "modified",
old_file: { name, contents: `old ${index}\n` },
new_file: { name, contents: `new ${index}\n` },
};
});
}
function makePayload(count: number) {
return {
data: makeFiles(count),
meta: {
degraded: false,
degraded_reason: null,
total_changed: count,
stats: { additions: count, deletions: count },
truncated: false,
to_sha: "abc1234",
to_sha_committed_at: "2026-05-05T12:00:00Z",
},
};
}
function renderRunFiles() {
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
let renderer: TestRenderer.ReactTestRenderer | undefined;
act(() => {
renderer = TestRenderer.create(
} />
,
);
});
mountedRenderers.push(renderer!);
return renderer!;
}
describe("RunFiles rendering", () => {
afterEach(() => {
act(() => {
for (const renderer of mountedRenderers.splice(0)) {
renderer.unmount();
}
});
currentFilesPayload = null;
currentRunStatus = "succeeded";
multiFileDiffCalls.length = 0;
patchDiffCalls.length = 0;
virtualizerCalls.length = 0;
providerCalls.length = 0;
delete (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT;
});
test("renders a one-file payload through Pierre Virtualizer", () => {
currentFilesPayload = makePayload(1);
const renderer = renderRunFiles();
expect(virtualizerCalls).toHaveLength(1);
expect(renderer.root.findAllByProps({ "data-run-file-row": "true" })).toHaveLength(1);
expect(multiFileDiffCalls[0].options.diffStyle).toBe("split");
});
test("renders a 27-file payload through one Pierre Virtualizer", () => {
currentFilesPayload = makePayload(27);
const renderer = renderRunFiles();
expect(virtualizerCalls).toHaveLength(1);
expect(renderer.root.findAllByProps({ "data-run-file-row": "true" })).toHaveLength(27);
});
test("passes stable Pierre cache keys across unrelated re-renders", () => {
currentFilesPayload = makePayload(1);
const renderer = renderRunFiles();
const firstOldKey = multiFileDiffCalls[0].oldFile.cacheKey;
const firstNewKey = multiFileDiffCalls[0].newFile.cacheKey;
act(() => {
renderer.update(
} />
,
);
});
const lastCall = multiFileDiffCalls[multiFileDiffCalls.length - 1];
expect(firstOldKey).toBe(lastCall.oldFile.cacheKey);
expect(firstNewKey).toBe(lastCall.newFile.cacheKey);
expect(firstOldKey).toContain("fabro-run-file:run_1:abc1234:old:src/file-0.ts:");
expect(firstNewKey).toContain("fabro-run-file:run_1:abc1234:new:src/file-0.ts:");
expect(lastCall.options).not.toHaveProperty("theme");
});
});