import { describe, expect, it } from "vitest"; import { applyUiBranding, getWorktreeUiBranding, isWorktreeUiBrandingEnabled, renderFaviconLinks, renderRuntimeBrandingMeta, } from "../ui-branding.js"; const TEMPLATE = ` `; describe("ui branding", () => { it("detects worktree mode from PAPERCLIP_IN_WORKTREE", () => { expect(isWorktreeUiBrandingEnabled({ PAPERCLIP_IN_WORKTREE: "true" })).toBe(true); expect(isWorktreeUiBrandingEnabled({ PAPERCLIP_IN_WORKTREE: "1" })).toBe(true); expect(isWorktreeUiBrandingEnabled({ PAPERCLIP_IN_WORKTREE: "false" })).toBe(false); }); it("resolves name, color, and text color for worktree branding", () => { const branding = getWorktreeUiBranding({ PAPERCLIP_IN_WORKTREE: "true", PAPERCLIP_WORKTREE_NAME: "paperclip-pr-432", PAPERCLIP_WORKTREE_COLOR: "#4f86f7", }); expect(branding.enabled).toBe(true); expect(branding.name).toBe("paperclip-pr-432"); expect(branding.color).toBe("#4f86f7"); expect(branding.textColor).toMatch(/^#[0-9a-f]{6}$/); expect(branding.faviconHref).toContain("data:image/svg+xml,"); }); it("renders a dynamic worktree favicon when enabled", () => { const links = renderFaviconLinks( getWorktreeUiBranding({ PAPERCLIP_IN_WORKTREE: "true", PAPERCLIP_WORKTREE_NAME: "paperclip-pr-432", PAPERCLIP_WORKTREE_COLOR: "#4f86f7", }), ); expect(links).toContain("data:image/svg+xml,"); expect(links).toContain('rel="shortcut icon"'); }); it("renders runtime branding metadata for the ui", () => { const meta = renderRuntimeBrandingMeta( getWorktreeUiBranding({ PAPERCLIP_IN_WORKTREE: "true", PAPERCLIP_WORKTREE_NAME: "paperclip-pr-432", PAPERCLIP_WORKTREE_COLOR: "#4f86f7", }), ); expect(meta).toContain('name="paperclip-worktree-name"'); expect(meta).toContain('content="paperclip-pr-432"'); expect(meta).toContain('name="paperclip-worktree-color"'); }); it("rewrites the favicon and runtime branding blocks for worktree instances only", () => { const branded = applyUiBranding(TEMPLATE, { PAPERCLIP_IN_WORKTREE: "true", PAPERCLIP_WORKTREE_NAME: "paperclip-pr-432", PAPERCLIP_WORKTREE_COLOR: "#4f86f7", }); expect(branded).toContain("data:image/svg+xml,"); expect(branded).toContain('name="paperclip-worktree-name"'); expect(branded).not.toContain('href="/favicon.svg"'); const defaultHtml = applyUiBranding(TEMPLATE, {}); expect(defaultHtml).toContain('href="/favicon.svg"'); expect(defaultHtml).not.toContain('name="paperclip-worktree-name"'); }); });