Files
kandev/apps/web/components/diff/diff-viewer.test.tsx
T
José Almeida d62b51b0be fix: route controlled diff comment updates (#1599)
* fix: route controlled diff comment updates

* fix: address review comments overview feedback

* fix: address automated review feedback

* fix: keep failed controlled edits open

* fix: guard controlled comment deletes

* fix: compare controlled delete handler

* test: cover controlled update rerender
2026-07-07 10:19:56 +01:00

68 lines
2.2 KiB
TypeScript

import { cleanup, render, waitFor } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { DiffViewer } from "./diff-viewer";
import type { FileDiffData } from "@/lib/diff/types";
const fileDiffProps: Array<{ options?: { overflow?: string } }> = [];
vi.mock("@/components/theme/app-theme", () => ({
useTheme: () => ({ resolvedTheme: "dark" }),
}));
vi.mock("@pierre/diffs/react", () => ({
FileDiff: (props: { options?: { overflow?: string } }) => {
fileDiffProps.push(props);
return <div data-testid="file-diff" />;
},
}));
const data: FileDiffData = {
filePath: "src/example.ts",
diff: "diff --git a/src/example.ts b/src/example.ts\n--- a/src/example.ts\n+++ b/src/example.ts\n@@ -1 +1 @@\n-old\n+new\n",
oldContent: "old\n",
newContent: "new\n",
additions: 1,
deletions: 1,
};
afterEach(() => {
cleanup();
fileDiffProps.length = 0;
});
describe("DiffViewer", () => {
it("wraps diff lines by default", async () => {
render(<DiffViewer data={data} />);
await waitFor(() => expect(fileDiffProps.length).toBeGreaterThan(0));
expect(fileDiffProps.at(-1)?.options?.overflow).toBe("wrap");
});
it("rerenders when the controlled delete handler changes", async () => {
const firstDelete = vi.fn();
const secondDelete = vi.fn();
const { rerender } = render(<DiffViewer data={data} onCommentDelete={firstDelete} />);
await waitFor(() => expect(fileDiffProps.length).toBeGreaterThan(0));
const renderCount = fileDiffProps.length;
rerender(<DiffViewer data={data} onCommentDelete={secondDelete} />);
await waitFor(() => expect(fileDiffProps.length).toBeGreaterThan(renderCount));
});
it("rerenders when the controlled update handler changes", async () => {
const firstUpdate = vi.fn();
const secondUpdate = vi.fn();
const { rerender } = render(<DiffViewer data={data} onCommentUpdate={firstUpdate} />);
await waitFor(() => expect(fileDiffProps.length).toBeGreaterThan(0));
const renderCount = fileDiffProps.length;
rerender(<DiffViewer data={data} onCommentUpdate={secondUpdate} />);
await waitFor(() => expect(fileDiffProps.length).toBeGreaterThan(renderCount));
});
});