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" }); });