// @vitest-environment jsdom import { act } from "react"; import type { ReactNode } from "react"; import { createRoot } from "react-dom/client"; import { renderToStaticMarkup } from "react-dom/server"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { ThemeProvider } from "../context/ThemeContext"; import { ApprovalPayloadRenderer, approvalLabel } from "./ApprovalPayload"; vi.mock("@/lib/router", () => ({ Link: ({ children, to }: { children: ReactNode; to: string }) => {children}, })); vi.mock("../api/issues", () => ({ issuesApi: { get: vi.fn() }, })); // eslint-disable-next-line @typescript-eslint/no-explicit-any (globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; function withProviders(children: ReactNode) { return ( {children} ); } describe("approvalLabel", () => { it("uses payload titles for generic board approvals", () => { expect( approvalLabel("request_board_approval", { title: "Reply with an ASCII frog", }), ).toBe("Board Approval: Reply with an ASCII frog"); }); }); describe("ApprovalPayloadRenderer", () => { let container: HTMLDivElement; beforeEach(() => { container = document.createElement("div"); document.body.appendChild(container); }); afterEach(() => { container.remove(); }); it("renders request_board_approval payload fields without falling back to raw JSON", () => { const root = createRoot(container); act(() => { root.render( withProviders( , ), ); }); expect(container.textContent).toContain("Reply with an ASCII frog"); expect(container.textContent).toContain("Board asked for approval before posting the frog."); expect(container.textContent).toContain("Approve the frog reply."); expect(container.textContent).toContain("Post the frog comment on the issue."); expect(container.textContent).toContain("The frog might be too powerful."); expect(container.textContent).toContain("(o)<"); expect(container.textContent).not.toContain("\"recommendedAction\""); act(() => { root.unmount(); }); }); it("can hide the repeated title when the card header already shows it", () => { const root = createRoot(container); act(() => { root.render( withProviders( , ), ); }); expect(container.textContent).toContain("Board asked for approval before posting the frog."); expect(container.textContent).not.toContain("TitleReply with an ASCII frog"); act(() => { root.unmount(); }); }); }); describe("BoardApprovalPayloadContent markdown rendering", () => { it("renders a ## header in summary as an h2 element", () => { const html = renderToStaticMarkup( withProviders( , ), ); expect(html).toContain(" { const html = renderToStaticMarkup( withProviders( , ), ); expect(html).toContain(" { const html = renderToStaticMarkup( withProviders( , ), ); expect(html).toContain(" { const html = renderToStaticMarkup( withProviders( , ), ); expect(html).toContain(" { const html = renderToStaticMarkup( withProviders( , ), ); expect(html).toContain("This is a simple one-line summary."); expect(html).not.toContain(" { const html = renderToStaticMarkup( withProviders( , ), ); expect(html).toContain("Approve the deployment."); expect(html).not.toContain("