import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import type { ReactElement } from "react";
import { ArtifactGateWidget } from "./ArtifactGateWidget";
vi.mock("../viewers/mermaid", () => ({
renderMermaid: vi.fn().mockResolvedValue(''),
}));
vi.mock("../api/sessions", () => ({
getSessionDocuments: vi.fn().mockResolvedValue([
{
phase: "F3",
key: "revised_question",
title: "Revised question",
format: "markdown",
content: "## Domanda\n\nQuanti pazienti hanno avuto un impianto?",
},
]),
}));
function withClient(ui: ReactElement): ReactElement {
const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } });
return {ui};
}
test("renders inside a dialog and shows the artifact via ArtifactView (data path)", () => {
const onRespond = vi.fn();
render(
);
expect(screen.getByRole("dialog")).toBeInTheDocument();
expect(screen.getByText("SELECT 42")).toBeInTheDocument();
});
test("a file-reference artifact resolves to the session document, rendered with its path", async () => {
render(
withClient(
)
);
expect(await screen.findByText(/Quanti pazienti/)).toBeInTheDocument();
expect(screen.getByText("sessions/s-123/question.md")).toBeInTheDocument();
// The raw filename reference is no longer shown as the whole body.
expect(screen.queryByText("question.md", { exact: true })).toBeNull();
});
test("clicking an option without opens responds immediately", async () => {
const onRespond = vi.fn();
render(
);
await userEvent.click(screen.getByRole("button", { name: /Approva/ }));
expect(onRespond).toHaveBeenCalledWith({ id: "u1", kind: "artifact-gate", choices: ["approve"] });
});
test("reserved control responds with control field", async () => {
const onRespond = vi.fn();
render(
);
await userEvent.click(screen.getByRole("button", { name: /back/i }));
expect(onRespond).toHaveBeenCalledWith({ id: "u1", control: "back" });
});