import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; import { GatePanel } from "./GatePanel"; const baseProps = { gateState: null, gateStatusLabel: "Unknown", gateStatusColor: "#aaa", isGateLoading: false, gateError: null, lastGateRefresh: null, onRefresh: vi.fn(), }; describe("GatePanel", () => { it("shows 'no workflow data' when gateState is null", () => { render(); expect(screen.getByText("No workflow data yet.")).toBeInTheDocument(); }); it("shows loading message when isGateLoading is true", () => { render(); expect( screen.getByText("Loading workflow gates..."), ).toBeInTheDocument(); }); it("shows error with retry button", async () => { const onRefresh = vi.fn(); render( , ); expect(screen.getByText("Connection failed")).toBeInTheDocument(); const retryButton = screen.getByRole("button", { name: "Retry" }); await userEvent.click(retryButton); expect(onRefresh).toHaveBeenCalledOnce(); }); it("shows gate status label and color", () => { render( , ); expect(screen.getByText("Blocked")).toBeInTheDocument(); }); it("shows test summary when gateState is provided", () => { render( , ); expect( screen.getByText(/5\/5 passing, 0 failing/), ).toBeInTheDocument(); }); it("shows missing categories", () => { render( , ); expect( screen.getByText("Missing: unit, integration"), ).toBeInTheDocument(); }); it("shows warning text", () => { render( , ); expect( screen.getByText("Multiple tests failing — fix one at a time."), ).toBeInTheDocument(); }); it("shows reasons as list items", () => { render( , ); expect( screen.getByText("No approved test plan."), ).toBeInTheDocument(); expect(screen.getByText("Tests are failing.")).toBeInTheDocument(); }); it("calls onRefresh when Refresh button is clicked", async () => { const onRefresh = vi.fn(); render(); await userEvent.click( screen.getByRole("button", { name: "Refresh" }), ); expect(onRefresh).toHaveBeenCalledOnce(); }); it("disables Refresh button when loading", () => { render(); expect(screen.getByRole("button", { name: "Refresh" })).toBeDisabled(); }); });