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("surfaces the runtime instance id so the UI can fail closed on copied rows", () => { const branding = getWorktreeUiBranding({ PAPERCLIP_IN_WORKTREE: "true", PAPERCLIP_WORKTREE_NAME: "paperclip-pr-432", PAPERCLIP_WORKTREE_COLOR: "#4f86f7", PAPERCLIP_INSTANCE_ID: "inst-abc123", }); expect(branding.instanceId).toBe("inst-abc123"); const meta = renderRuntimeBrandingMeta(branding); expect(meta).toContain('name="paperclip-instance-id"'); expect(meta).toContain('content="inst-abc123"'); }); it("omits the instance-id meta when the runtime id is unset", () => { const branding = getWorktreeUiBranding({ PAPERCLIP_IN_WORKTREE: "true", PAPERCLIP_WORKTREE_NAME: "paperclip-pr-432", PAPERCLIP_WORKTREE_COLOR: "#4f86f7", }); expect(branding.instanceId).toBeNull(); expect(renderRuntimeBrandingMeta(branding)).not.toContain('name="paperclip-instance-id"'); }); 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"'); }); });