diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/mcpServers/useMCPServers.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/mcpServers/useMCPServers.test.ts index 3681ffc747..ee03a0ab7c 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/mcpServers/useMCPServers.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/mcpServers/useMCPServers.test.ts @@ -74,7 +74,7 @@ describe("useMCPServers", () => { expect(result.current.isSuccess).toBe(true); }); - expect(networking.fetchMCPServers).toHaveBeenCalledWith(mockAccessToken); + expect(networking.fetchMCPServers).toHaveBeenCalledWith(mockAccessToken, undefined); expect(result.current.data).toEqual(mockServers); }); diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.test.tsx index b7d4db2618..32ab83ea75 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AllModelsTab.test.tsx @@ -20,11 +20,15 @@ vi.mock("@/components/molecules/notifications_manager", () => ({ // Mock react-query const mockInvalidateQueries = vi.fn(); -vi.mock("@tanstack/react-query", () => ({ - useQueryClient: () => ({ - invalidateQueries: mockInvalidateQueries, - }), -})); +vi.mock("@tanstack/react-query", async (importOriginal) => { + const actual = await importOriginal() as any; + return { + ...actual, + useQueryClient: () => ({ + invalidateQueries: mockInvalidateQueries, + }), + }; +}); // Mock the useModelsInfo hook const mockUseModelsInfo = vi.fn(() => ({ @@ -553,7 +557,7 @@ describe("AllModelsTab", () => { mockUseModelsInfo.mockReturnValue({ data: modelData, isLoading: false, error: null, refetch: vi.fn() }); - render(); + renderWithProviders(); await waitFor(() => { expect(screen.getByText("gpt-4-delete-test")).toBeInTheDocument(); @@ -597,7 +601,7 @@ describe("AllModelsTab", () => { mockUseModelsInfo.mockReturnValue({ data: modelData, isLoading: false, error: null, refetch: vi.fn() }); - render(); + renderWithProviders(); await waitFor(() => { expect(screen.getByText("gpt-4-clickable")).toBeInTheDocument(); diff --git a/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.test.tsx b/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.test.tsx index 07b19cc555..5b8611f4e9 100644 --- a/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.test.tsx +++ b/ui/litellm-dashboard/src/components/mcp_server_management/MCPToolPermissions.test.tsx @@ -72,7 +72,7 @@ describe("MCPToolPermissions", () => { // Verify API calls // Note: useMCPServers uses useAuthorized() internally, which returns "123" from global mock - expect(networking.fetchMCPServers).toHaveBeenCalledWith("123"); + expect(networking.fetchMCPServers).toHaveBeenCalledWith("123", undefined); // listMCPTools uses the accessToken prop directly expect(networking.listMCPTools).toHaveBeenCalledWith(mockAccessToken, mockServerId); }); diff --git a/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.test.tsx b/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.test.tsx index 28c3b75c3a..d49c49446b 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.test.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.test.tsx @@ -53,8 +53,24 @@ const getServerNameInput = () => document.getElementById("server_name") as HTMLI /** Helper: select a dropdown option by opening a select near a label and clicking an option */ async function selectAntOption(labelText: string, optionText: string) { const label = screen.getByText(labelText); - const formItem = label.closest(".ant-form-item")!; - const select = formItem.querySelector(".ant-select"); + // First try to find a .ant-form-item ancestor (standard form fields) + let select: Element | null = null; + const formItem = label.closest(".ant-form-item"); + if (formItem) { + select = formItem.querySelector(".ant-select"); + } + // If not found, try .ant-collapse-content ancestor (auth type is inside a Collapse panel) + if (!select) { + const collapseContent = label.closest(".ant-collapse-item"); + if (collapseContent) { + select = collapseContent.querySelector(".ant-select"); + } + } + // Fallback: look for a sibling or nearby select + if (!select) { + const parent = label.closest("div"); + select = parent?.querySelector(".ant-select") ?? null; + } act(() => { fireEvent.mouseDown(select!.querySelector(".ant-select-selector")!); }); diff --git a/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.test.tsx b/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.test.tsx index 0ca3d69895..4d67456b78 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.test.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/mcp_servers.test.tsx @@ -126,7 +126,7 @@ describe("MCPServers", () => { // Verify the API was called // Note: useMCPServers uses useAuthorized() internally, which returns "123" from global mock - expect(networking.fetchMCPServers).toHaveBeenCalledWith("123"); + expect(networking.fetchMCPServers).toHaveBeenCalledWith("123", undefined); }); it("should fetch and merge health status for servers", async () => { diff --git a/ui/litellm-dashboard/src/components/molecules/models/columns.test.tsx b/ui/litellm-dashboard/src/components/molecules/models/columns.test.tsx index 0a8dacbadd..b20c85ecb3 100644 --- a/ui/litellm-dashboard/src/components/molecules/models/columns.test.tsx +++ b/ui/litellm-dashboard/src/components/molecules/models/columns.test.tsx @@ -612,18 +612,19 @@ describe("columns", () => { it("should allow Admin to delete DB models", async () => { const user = userEvent.setup(); - const setSelectedModelId = vi.fn(); + const onDeleteClick = vi.fn(); const cols = columns( "Admin", "admin-user", defaultProps.premiumUser, - setSelectedModelId, + defaultProps.setSelectedModelId, defaultProps.setSelectedTeamId, defaultProps.getDisplayModelName, defaultProps.handleEditClick, defaultProps.handleRefreshClick, defaultProps.expandedRows, defaultProps.setExpandedRows, + onDeleteClick, ); const model = createMockModel({ @@ -639,23 +640,24 @@ describe("columns", () => { expect(deleteButton).toBeInTheDocument(); await user.click(deleteButton); - expect(setSelectedModelId).toHaveBeenCalledWith("deletable-model"); + expect(onDeleteClick).toHaveBeenCalledWith("deletable-model"); }); it("should allow model creator to delete their own DB models", async () => { const user = userEvent.setup(); - const setSelectedModelId = vi.fn(); + const onDeleteClick = vi.fn(); const cols = columns( "User", "model-creator", defaultProps.premiumUser, - setSelectedModelId, + defaultProps.setSelectedModelId, defaultProps.setSelectedTeamId, defaultProps.getDisplayModelName, defaultProps.handleEditClick, defaultProps.handleRefreshClick, defaultProps.expandedRows, defaultProps.setExpandedRows, + onDeleteClick, ); const model = createMockModel({ @@ -672,7 +674,7 @@ describe("columns", () => { expect(deleteButton).toBeInTheDocument(); await user.click(deleteButton); - expect(setSelectedModelId).toHaveBeenCalledWith("user-model"); + expect(onDeleteClick).toHaveBeenCalledWith("user-model"); }); diff --git a/ui/litellm-dashboard/src/components/playground/chat_ui/ChatUI.tsx b/ui/litellm-dashboard/src/components/playground/chat_ui/ChatUI.tsx index 9936f34452..eba9d37669 100644 --- a/ui/litellm-dashboard/src/components/playground/chat_ui/ChatUI.tsx +++ b/ui/litellm-dashboard/src/components/playground/chat_ui/ChatUI.tsx @@ -60,7 +60,8 @@ import CodeInterpreterOutput from "./CodeInterpreterOutput"; import CodeInterpreterTool from "./CodeInterpreterTool"; import { generateCodeSnippet } from "./CodeSnippets"; import EndpointSelector from "./EndpointSelector"; -import MCPEventsDisplay, { MCPEvent } from "./MCPEventsDisplay"; +import MCPEventsDisplay from "./MCPEventsDisplay"; +import type { MCPEvent } from "../../mcp_tools/types"; import { EndpointType, getEndpointType } from "./mode_endpoint_mapping"; import ReasoningContent from "./ReasoningContent"; import ResponseMetrics, { TokenUsage } from "./ResponseMetrics"; diff --git a/ui/litellm-dashboard/src/components/playground/llm_calls/chat_completion.tsx b/ui/litellm-dashboard/src/components/playground/llm_calls/chat_completion.tsx index 048ea9bfa1..3197c9409c 100644 --- a/ui/litellm-dashboard/src/components/playground/llm_calls/chat_completion.tsx +++ b/ui/litellm-dashboard/src/components/playground/llm_calls/chat_completion.tsx @@ -3,8 +3,7 @@ import { ChatCompletionMessageParam } from "openai/resources/chat/completions"; import { TokenUsage } from "../chat_ui/ResponseMetrics"; import { VectorStoreSearchResponse } from "../chat_ui/types"; import { getProxyBaseUrl } from "@/components/networking"; -import { MCPServer } from "../../mcp_tools/types"; -import { MCPEvent } from "../chat_ui/MCPEventsDisplay"; +import { MCPServer, type MCPEvent } from "../../mcp_tools/types"; export async function makeOpenAIChatCompletionRequest( chatHistory: { role: string; content: string | any[] }[], diff --git a/ui/litellm-dashboard/src/components/playground/llm_calls/responses_api.test.tsx b/ui/litellm-dashboard/src/components/playground/llm_calls/responses_api.test.tsx index f14ac52b84..77ff5fd00b 100644 --- a/ui/litellm-dashboard/src/components/playground/llm_calls/responses_api.test.tsx +++ b/ui/litellm-dashboard/src/components/playground/llm_calls/responses_api.test.tsx @@ -127,15 +127,15 @@ describe("responses_api", () => { expect(callArgs.tools).toEqual([ { type: "mcp", - server_label: "litellm", - server_url: "litellm_proxy/mcp/alpha", + server_label: "Alpha", + server_url: "https://example.com/mcp/Alpha", require_approval: "never", allowed_tools: ["toolA"], }, { type: "mcp", - server_label: "litellm", - server_url: "litellm_proxy/mcp/Beta", + server_label: "Beta", + server_url: "https://example.com/mcp/Beta", require_approval: "never", allowed_tools: ["toolB", "toolC"], },