// @vitest-environment jsdom
import { act, type ComponentProps } from "react";
import { createRoot } from "react-dom/client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { afterEach, expect, it, vi } from "vitest";
import { ThemeProvider } from "@/context/ThemeContext";
import { MarkdownBody } from "./MarkdownBody";
const getIssue = vi.hoisted(() => vi.fn());
vi.mock("../api/issues", () => ({ issuesApi: { get: getIssue } }));
vi.mock("@/lib/router", () => ({
Link: ({ to, ...props }: ComponentProps<"a"> & { to: string }) => ,
useCaseHref: () => () => "",
}));
vi.mock("../context/CompanyContext", () => ({ useOptionalCompany: () => null }));
afterEach(() => vi.clearAllMocks());
it.each(["pointerover", "focusin"])("fetches mentioned task details only on %s", async (event) => {
const container = document.createElement("div");
document.body.append(container);
const root = createRoot(container);
const client = new QueryClient({ defaultOptions: { queries: { retry: false } } });
getIssue.mockResolvedValue({ id: "task-72", identifier: "PAP-72", title: "Mentioned task", status: "done" });
try {
await act(async () => root.render(
{"See PAP-72 and PAP-73 for background."}
,
));
expect(getIssue).not.toHaveBeenCalled();
const link = container.querySelector('a[href="/issues/PAP-72"]')!;
expect(link).not.toBeNull();
await act(async () => {
link.dispatchEvent(new MouseEvent(event, { bubbles: true }));
});
expect(getIssue).toHaveBeenCalledExactlyOnceWith("PAP-72");
} finally {
act(() => root.unmount());
client.clear();
container.remove();
}
});