import { afterEach, describe, expect, it, rs } from "@rstest/core"; import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import { ToolSettingsPage } from "@/components/workspace/settings/tool-settings-page"; const mcpMockState = rs.hoisted(() => ({ isPending: false, mutate: rs.fn(), })); rs.mock("@/core/i18n/hooks", () => ({ useI18n: () => ({ t: { common: { loading: "Loading" }, settings: { tools: { title: "Tools", description: "Manage MCP tools", adminRequired: "Admin required", empty: "No tools", }, }, }, }), })); rs.mock("@/core/mcp/hooks", () => ({ useMCPConfig: () => ({ config: { mcp_servers: { github: { enabled: true, description: "GitHub tools" }, remote: { enabled: false, description: "Remote tools" }, }, }, isLoading: false, error: null, }), useEnableMCPServer: () => ({ isPending: mcpMockState.isPending, mutate: mcpMockState.mutate, }), })); rs.mock("@/env", () => ({ env: { NEXT_PUBLIC_STATIC_WEBSITE_ONLY: "false" }, })); afterEach(() => { mcpMockState.isPending = false; mcpMockState.mutate.mockReset(); cleanup(); }); describe("ToolSettingsPage MCP switches", () => { it("disables every switch while a targeted update is pending", () => { mcpMockState.isPending = true; render(); const switches = screen.getAllByRole("switch"); expect(switches).toHaveLength(2); for (const item of switches) { expect((item as HTMLButtonElement).disabled).toBe(true); } }); it("submits only the selected server state when idle", () => { render(); const switches = screen.getAllByRole("switch"); const githubSwitch = switches[0]; expect(githubSwitch).toBeDefined(); expect((githubSwitch as HTMLButtonElement).disabled).toBe(false); fireEvent.click(githubSwitch!); expect(mcpMockState.mutate).toHaveBeenCalledWith({ serverName: "github", enabled: false, }); }); });