import { describe, expect, it } from "vitest"; import { DEFAULT_DIFFS_TOOL_DEFAULTS, resolveDiffImageRenderOptions } from "./config.js"; import { renderDiffDocument } from "./render.js"; describe("renderDiffDocument", () => { it("renders before/after input into a complete viewer document", async () => { const rendered = await renderDiffDocument( { kind: "before_after", before: "const value = 1;\n", after: "const value = 2;\n", path: "src/example.ts", }, { presentation: DEFAULT_DIFFS_TOOL_DEFAULTS, image: resolveDiffImageRenderOptions({ defaults: DEFAULT_DIFFS_TOOL_DEFAULTS }), expandUnchanged: false, }, ); expect(rendered.title).toBe("src/example.ts"); expect(rendered.fileCount).toBe(1); expect(rendered.html).toContain("data-openclaw-diff-root"); expect(rendered.html).toContain("src/example.ts"); expect(rendered.html).toContain("/plugins/diffs/assets/viewer.js"); expect(rendered.imageHtml).not.toContain("/plugins/diffs/assets/viewer.js"); expect(rendered.imageHtml).toContain('data-openclaw-diffs-ready="true"'); expect(rendered.imageHtml).toContain("max-width: 960px;"); expect(rendered.imageHtml).toContain("--diffs-font-size: 16px;"); expect(rendered.html).toContain("min-height: 100vh;"); expect(rendered.html).toContain('"diffIndicators":"bars"'); expect(rendered.html).toContain('"disableLineNumbers":false'); expect(rendered.html).toContain("--diffs-line-height: 24px;"); expect(rendered.html).toContain("--diffs-font-size: 15px;"); expect(rendered.html).not.toContain("fonts.googleapis.com"); }); it("renders multi-file patch input", async () => { const patch = [ "diff --git a/a.ts b/a.ts", "--- a/a.ts", "+++ b/a.ts", "@@ -1 +1 @@", "-const a = 1;", "+const a = 2;", "diff --git a/b.ts b/b.ts", "--- a/b.ts", "+++ b/b.ts", "@@ -1 +1 @@", "-const b = 1;", "+const b = 2;", ].join("\n"); const rendered = await renderDiffDocument( { kind: "patch", patch, title: "Workspace patch", }, { presentation: { ...DEFAULT_DIFFS_TOOL_DEFAULTS, layout: "split", theme: "dark", }, image: resolveDiffImageRenderOptions({ defaults: DEFAULT_DIFFS_TOOL_DEFAULTS, fileQuality: "hq", fileMaxWidth: 1180, }), expandUnchanged: true, }, ); expect(rendered.title).toBe("Workspace patch"); expect(rendered.fileCount).toBe(2); expect(rendered.html).toContain("Workspace patch"); expect(rendered.imageHtml).toContain("max-width: 1180px;"); }); it("rejects patches that exceed file-count limits", async () => { const patch = Array.from({ length: 129 }, (_, i) => { return [ `diff --git a/f${i}.ts b/f${i}.ts`, `--- a/f${i}.ts`, `+++ b/f${i}.ts`, "@@ -1 +1 @@", "-const x = 1;", "+const x = 2;", ].join("\n"); }).join("\n"); await expect( renderDiffDocument( { kind: "patch", patch, }, { presentation: DEFAULT_DIFFS_TOOL_DEFAULTS, image: resolveDiffImageRenderOptions({ defaults: DEFAULT_DIFFS_TOOL_DEFAULTS }), expandUnchanged: false, }, ), ).rejects.toThrow("too many files"); }); });