import { cleanup, render } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; import { MarkdownFileLinkContext } from "./markdown-components"; import { MarkdownPreviewRenderer } from "@/components/task/markdown-preview-content"; import { MarkdownComment } from "@/components/task/simple/markdown-comment"; import { MemoizedMarkdown } from "./memoized-markdown"; afterEach(cleanup); // @covers AC-UI-MARKDOWN-MATH-001.3, AC-UI-MARKDOWN-MATH-002.4 describe("sanitized Markdown math renderers", () => { it("renders formulas in file previews while stripping executable HTML", () => { render( alert("xss")', ].join("\n")} /> , ); expect(document.querySelector(".katex")).not.toBeNull(); expect(document.querySelector(".katex-display")).not.toBeNull(); expect(document.querySelector('a[href^="javascript:"]')).toBeNull(); expect(document.querySelector("script")).toBeNull(); }); it("renders formulas in sanitized comments", () => { render(); expect(document.querySelector(".katex")).not.toBeNull(); }); // @covers AC-UI-MARKDOWN-MATH-001.5, AC-UI-MARKDOWN-MATH-001.6 it("does not add chat motion spans inside generated KaTeX markup", () => { const view = render(); view.rerender(); expect(view.container.querySelector(".katex")).not.toBeNull(); expect(view.container.querySelector(".katex [data-chat-text-motion]")).toBeNull(); }); });