import { Suspense } from "react"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, waitFor, fireEvent } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import App from "@/App"; import { resetProviderState, listProviders } from "../msw/state"; import { emitTauriEvent } from "../msw/tauriMocks"; const toastSuccessMock = vi.fn(); const toastErrorMock = vi.fn(); vi.mock("sonner", () => ({ toast: { success: (...args: unknown[]) => toastSuccessMock(...args), error: (...args: unknown[]) => toastErrorMock(...args), }, })); vi.mock("@/components/providers/ProviderList", () => ({ ProviderList: ({ providers, currentProviderId, onSwitch, onEdit, onDelete, onDuplicate, onConfigureUsage, onOpenWebsite, onCreate, }: any) => (
{JSON.stringify(providers)}
{currentProviderId}
), })); vi.mock("@/components/providers/AddProviderDialog", () => ({ AddProviderDialog: ({ open, onOpenChange, onSubmit, appType }: any) => open ? (
) : null, })); vi.mock("@/components/providers/EditProviderDialog", () => ({ EditProviderDialog: ({ open, provider, onSubmit, onOpenChange }: any) => open ? (
) : null, })); vi.mock("@/components/UsageScriptModal", () => ({ default: ({ isOpen, provider, onSave, onClose }: any) => isOpen ? (
{provider?.id}
) : null, })); vi.mock("@/components/ConfirmDialog", () => ({ ConfirmDialog: ({ isOpen, onConfirm, onCancel }: any) => isOpen ? (
) : null, })); vi.mock("@/components/settings/SettingsDialog", () => ({ SettingsDialog: ({ open, onOpenChange, onImportSuccess }: any) => open ? (
) : ( ), })); vi.mock("@/components/AppSwitcher", () => ({ AppSwitcher: ({ activeApp, onSwitch }: any) => (
{activeApp}
), })); vi.mock("@/components/UpdateBadge", () => ({ UpdateBadge: ({ onClick }: any) => ( ), })); vi.mock("@/components/mcp/McpPanel", () => ({ default: ({ open, onOpenChange }: any) => open ? (
) : ( ), })); const renderApp = () => { const client = new QueryClient(); return render( loading}> , ); }; describe("App Integration with MSW", () => { beforeEach(() => { resetProviderState(); toastSuccessMock.mockReset(); toastErrorMock.mockReset(); }); it("runs provider flows with mocked dialogs but real hooks", async () => { renderApp(); await waitFor(() => expect(screen.getByTestId("provider-list").textContent).toContain("claude-1"), ); fireEvent.click(screen.getByText("update-badge")); expect(screen.getByTestId("settings-dialog")).toBeInTheDocument(); fireEvent.click(screen.getByText("trigger-import-success")); fireEvent.click(screen.getByText("close-settings")); expect(screen.queryByTestId("settings-dialog")).not.toBeInTheDocument(); fireEvent.click(screen.getByText("switch-codex")); await waitFor(() => expect(screen.getByTestId("provider-list").textContent).toContain("codex-1"), ); fireEvent.click(screen.getByText("duplicate")); await waitFor(() => expect(screen.getByTestId("provider-list").textContent).toMatch(/copy/), ); fireEvent.click(screen.getByText("create")); expect(screen.getByTestId("add-provider-dialog")).toBeInTheDocument(); fireEvent.click(screen.getByText("confirm-add")); await waitFor(() => expect(screen.getByTestId("provider-list").textContent).toMatch(/New codex Provider/), ); fireEvent.click(screen.getByText("edit")); expect(screen.getByTestId("edit-provider-dialog")).toBeInTheDocument(); fireEvent.click(screen.getByText("confirm-edit")); await waitFor(() => expect(screen.getByTestId("provider-list").textContent).toMatch(/-edited/), ); fireEvent.click(screen.getByText("usage")); expect(screen.getByTestId("usage-modal")).toBeInTheDocument(); fireEvent.click(screen.getByText("save-script")); fireEvent.click(screen.getByText("close-usage")); fireEvent.click(screen.getByText("delete")); expect(screen.getByTestId("confirm-dialog")).toBeInTheDocument(); fireEvent.click(screen.getByText("confirm-delete")); await waitFor(() => expect(Object.keys(listProviders("codex"))).not.toContain("codex-1"), ); await waitFor(() => expect(screen.getByTestId("current-provider").textContent).not.toBe("codex-1"), ); fireEvent.click(screen.getByText("open-website")); emitTauriEvent("provider-switched", { appType: "codex", providerId: "codex-2" }); await waitFor(() => expect(screen.getByTestId("current-provider").textContent).toBe("codex-2"), ); expect(toastSuccessMock).toHaveBeenCalled(); expect(toastErrorMock).not.toHaveBeenCalled(); }); });