import { describe, expect, it } from "vitest"; import { createAssistantMarkdownParser } from "./assistant-markdown-parser"; describe("createAssistantMarkdownParser", () => { it("keeps ordinary parsing for completed messages", () => { const parser = createAssistantMarkdownParser(); expect(parser.renderInline("**unfinished")).toBe("**unfinished"); expect(parser.renderInline("[unfinished")).toBe("[unfinished"); }); it("renders agent text verbatim", () => { const parser = createAssistantMarkdownParser(); // The reported bug, plus the substitutions that share its cause. expect(parser.renderInline("(c) (C) (r) (tm) (p)")).toBe("(c) (C) (r) (tm) (p)"); expect(parser.renderInline("wait for it...")).toBe("wait for it..."); expect(parser.renderInline("a -- b")).toBe("a -- b"); // Smart quotes are off too: a curled quote is not pasteable into a shell. expect(parser.renderInline(`run --name="my repo"`)).toBe("run --name="my repo""); expect(parser.renderInline("it's fine")).toBe("it's fine"); }); it("allows file:// links, unlike every other parser", () => { const parser = createAssistantMarkdownParser(); expect(parser.render("[open](file:///tmp/a.ts)")).toContain('href="file:///tmp/a.ts"'); }); it("still rejects javascript: links", () => { const parser = createAssistantMarkdownParser(); expect(parser.render("[x](javascript:alert(1))")).not.toContain("href"); }); });