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