// @vitest-environment happy-dom import { cleanup, render, screen } from "@testing-library/react"; import { afterEach, describe, expect, it } from "vitest"; import { DiffView } from "./DiffView.js"; import { toolDiffMeta } from "./model.js"; afterEach(cleanup); function lines(kind: string): string[] { return [...document.querySelectorAll(`.st-ln-${kind}`)].map((el) => el.textContent ?? ""); } describe("DiffView", () => { it("marks insertions and deletions with their column prefixes", () => { render(); expect(lines("del")).toEqual(["- two"]); expect(lines("add")).toEqual(["+ TWO", "+ three"]); expect(lines("ctx")).toEqual([" one"]); expect(screen.getByText("src/a.ts")).toBeTruthy(); }); it("carries the +added −removed counts the tool head shows", () => { render(); const body = document.querySelector(".st-diff")!; expect(body.dataset.added).toBe("2"); expect(body.dataset.removed).toBe("1"); expect(toolDiffMeta([{ type: "diff", path: "a.ts", oldText: "one\ntwo\n", newText: "one\nTWO\nthree\n" }])) .toBe("+2 −1"); }); it("renders every line of a new file as added", () => { render(); expect(lines("add")).toEqual(["+ alpha", "+ beta"]); expect(lines("del")).toEqual([]); }); it("collapses a long unchanged run to a hunk summary", () => { const filler = Array.from({ length: 20 }, (_, i) => `line ${i}`).join("\n"); render(); expect(lines("hunk")).toEqual(["⋯ 17 unchanged lines ⋯"]); }); it("copies the whole diff, prefixes included", () => { render(); const body = document.querySelector(".st-diff")!; expect(body.getAttribute("aria-label")).toBe("Copy diff"); expect(body.textContent).toBe("- one+ two"); }); });