Files
kandev/apps/web/components/task/markdown-preview-content.math.test.tsx
T
2026-09-22 23:36:47 +01:00

111 lines
3.3 KiB
TypeScript

import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { TooltipProvider } from "@kandev/ui/tooltip";
import {
resolveMarkdownDomSelection,
SOURCE_END_ATTR,
SOURCE_START_ATTR,
} from "@/lib/markdown/source-line-ranges";
const showCommentsForRange = vi.fn();
vi.mock("@/hooks/domains/comments/use-markdown-preview-comments", () => ({
useMarkdownPreviewComments: () => ({
comments: [
{ id: "single-line", startLine: 3, endLine: 3 },
{ id: "multiline", startLine: 7, endLine: 9 },
],
commentView: null,
currentSelection: null,
textSelection: null,
dismissOverlays: vi.fn(),
showCommentsForRange,
closeCommentView: vi.fn(),
closeComposer: vi.fn(),
openComposer: vi.fn(),
removeComment: vi.fn(),
submitAndRunComment: vi.fn(),
submitComment: vi.fn(),
updateComment: vi.fn(),
}),
}));
vi.mock("@/components/editors/external-vcs-file-link", () => ({
ExternalVcsFileLink: () => null,
useExternalVcsFileStatus: () => ({ status: "modified" }),
}));
import { MarkdownPreviewContent } from "./markdown-preview-content";
afterEach(() => {
cleanup();
showCommentsForRange.mockClear();
});
const content = [
"Before formula",
"",
"$$\\frac{a}{b}$$",
"",
"Between formulas",
"",
"$$",
"\\frac{c}{d}",
"$$",
"After formula",
].join("\n");
describe("MarkdownPreviewContent math source ranges", () => {
it("keeps display formulas attached to source comments and selections", () => {
render(
<TooltipProvider>
<MarkdownPreviewContent
path="formula.md"
content={content}
sessionId="session-1"
taskId="task-1"
repositoryId="repo-1"
repositoryName="frontend"
enableComments
showExternalVcsLink={false}
onTogglePreview={vi.fn()}
/>
</TooltipProvider>,
);
const preview = screen.getByTestId("markdown-preview");
const displays = [...preview.querySelectorAll<HTMLElement>(".katex-display")];
expect(displays).toHaveLength(2);
const singleLineSource = displays[0].closest<HTMLElement>(`[${SOURCE_START_ATTR}]`);
const multilineSource = displays[1].closest<HTMLElement>(`[${SOURCE_START_ATTR}]`);
expect(singleLineSource?.getAttribute(SOURCE_START_ATTR)).toBe("3");
expect(singleLineSource?.getAttribute(SOURCE_END_ATTR)).toBe("3");
expect(multilineSource?.getAttribute(SOURCE_START_ATTR)).toBe("7");
expect(multilineSource?.getAttribute(SOURCE_END_ATTR)).toBe("9");
const root = preview.querySelector<HTMLElement>(".markdown-body");
expect(root).not.toBeNull();
expect(root?.querySelectorAll('[data-testid="markdown-preview-comment-badge"]')).toHaveLength(
2,
);
const range = document.createRange();
range.selectNodeContents(multilineSource!);
const selection = window.getSelection()!;
selection.removeAllRanges();
selection.addRange(range);
expect(resolveMarkdownDomSelection(root!, content, selection)).toMatchObject({
startLine: 7,
endLine: 9,
});
selection.removeAllRanges();
fireEvent.click(multilineSource!, { clientX: 10, clientY: 20 });
expect(showCommentsForRange).toHaveBeenCalledWith(
{ startLine: 7, endLine: 9 },
{ x: 10, y: 20 },
);
});
});