import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { render, screen } from "@testing-library/react"; import type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from "react"; interface MockButtonProps extends ButtonHTMLAttributes { children: ReactNode; } interface MockContainerProps extends HTMLAttributes { children: ReactNode; } type MockConnectionStatus = "connected" | "connecting" | "error"; type MockRole = "user" | "assistant" | "tool" | "system"; interface MockMessage { id: string; role: MockRole; content: string; timestamp: string; } interface MockSession { id: string; status: string; } interface MockSessionStreamResult { messages: MockMessage[]; status: MockConnectionStatus; error: string | null; } interface MockSessionsResult { sessions: MockSession[]; loading: boolean; error: Error | null; } interface MockPanelControlsProps { sessionId: string; status: string; onStatusChange?: (nextStatus: string) => void; } interface MockBargeInInputProps { sessionId: string; } const mockUseSessionStream = vi.fn<(sessionId: string) => MockSessionStreamResult>(); const mockUseSessions = vi.fn<() => MockSessionsResult>(); const mockPanelControls = vi.fn<(props: MockPanelControlsProps) => React.JSX.Element>(); const mockBargeInInput = vi.fn<(props: MockBargeInInputProps) => React.JSX.Element>(); vi.mock("date-fns", () => ({ formatDistanceToNow: (): string => "moments ago", })); vi.mock("@/hooks/useMissionControl", () => ({ useSessionStream: (sessionId: string): MockSessionStreamResult => mockUseSessionStream(sessionId), useSessions: (): MockSessionsResult => mockUseSessions(), })); vi.mock("@/components/mission-control/PanelControls", () => ({ PanelControls: (props: MockPanelControlsProps): React.JSX.Element => mockPanelControls(props), })); vi.mock("@/components/mission-control/BargeInInput", () => ({ BargeInInput: (props: MockBargeInInputProps): React.JSX.Element => mockBargeInInput(props), })); vi.mock("@/components/ui/button", () => ({ Button: ({ children, ...props }: MockButtonProps): React.JSX.Element => ( ), })); vi.mock("@/components/ui/badge", () => ({ Badge: ({ children, ...props }: MockContainerProps): React.JSX.Element => ( {children} ), })); vi.mock("@/components/ui/card", () => ({ Card: ({ children, ...props }: MockContainerProps): React.JSX.Element => (
{children}
), CardHeader: ({ children, ...props }: MockContainerProps): React.JSX.Element => (
{children}
), CardContent: ({ children, ...props }: MockContainerProps): React.JSX.Element => (
{children}
), CardTitle: ({ children, ...props }: MockContainerProps): React.JSX.Element => (

{children}

), })); vi.mock("@/components/ui/scroll-area", () => ({ ScrollArea: ({ children, ...props }: MockContainerProps): React.JSX.Element => (
{children}
), })); import { OrchestratorPanel } from "./OrchestratorPanel"; beforeAll((): void => { Object.defineProperty(window.HTMLElement.prototype, "scrollIntoView", { configurable: true, value: vi.fn(), }); }); describe("OrchestratorPanel", (): void => { beforeEach((): void => { vi.clearAllMocks(); vi.stubGlobal("fetch", vi.fn()); mockUseSessionStream.mockReturnValue({ messages: [], status: "connecting", error: null, }); mockUseSessions.mockReturnValue({ sessions: [], loading: false, error: null, }); mockPanelControls.mockImplementation( ({ status }: MockPanelControlsProps): React.JSX.Element => (
status:{status}
) ); mockBargeInInput.mockImplementation( ({ sessionId }: MockBargeInInputProps): React.JSX.Element => (