// @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");
});
});