mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-08 03:08:45 +00:00
Fix failing MCP e2e and create_mcp_server UI tests
Test 1 (test_independent_clients_no_shared_session): - Add allow_all_keys: true to MCP servers in test config. With master_key and no DB, get_allowed_mcp_servers returned empty, causing 0 tools and 403 on tool calls. allow_all_keys bypasses per-key restrictions. - Add asyncio.sleep(0.5) between client connections to allow MCP SDK TaskGroup cleanup and avoid ExceptionGroup on connection close (MCP #915). Test 2 (create_mcp_server 'auth value is provided'): - Use userEvent.setup({ delay: null }) for instant keystrokes to avoid timeout from default typing delay on CI. - Increase per-test timeout to 15000ms for CI environments. Co-authored-by: Ishaan Jaff <ishaan-jaff@users.noreply.github.com>
This commit is contained in:
parent
fd80239251
commit
92745a650b
3 changed files with 48 additions and 37 deletions
|
|
@ -18,6 +18,8 @@ mcp_servers:
|
|||
command: python3
|
||||
args:
|
||||
- tests/mcp_tests/mcp_server.py
|
||||
allow_all_keys: true # Needed for master_key auth when DB/object_permission not used
|
||||
math_streamable_http:
|
||||
transport: http
|
||||
url: http://127.0.0.1:0/mcp
|
||||
allow_all_keys: true
|
||||
|
|
|
|||
|
|
@ -274,6 +274,11 @@ class TestProxyMcpStatelessBehavior:
|
|||
text_a = getattr(result_a.content[0], "text", None)
|
||||
assert text_a == "30"
|
||||
|
||||
# Allow proxy and MCP SDK to fully clean up the first connection before
|
||||
# opening the second. Without this, the SDK's TaskGroup can raise
|
||||
# ExceptionGroup when the server closes the connection (see MCP SDK #915).
|
||||
await asyncio.sleep(0.5)
|
||||
|
||||
# --- Client B: completely independent connection ---
|
||||
async with streamablehttp_client(
|
||||
url=f"{proxy_server_url}/mcp",
|
||||
|
|
|
|||
|
|
@ -220,53 +220,57 @@ describe("CreateMCPServer", () => {
|
|||
});
|
||||
});
|
||||
|
||||
it("should successfully create a server when auth value is provided", async () => {
|
||||
await selectHttpTransport();
|
||||
it(
|
||||
"should successfully create a server when auth value is provided",
|
||||
{ timeout: 15000 },
|
||||
async () => {
|
||||
await selectHttpTransport();
|
||||
|
||||
const user = userEvent.setup();
|
||||
const user = userEvent.setup({ delay: null });
|
||||
|
||||
const nameInput = getServerNameInput();
|
||||
await user.type(nameInput, "My_Server");
|
||||
const nameInput = getServerNameInput();
|
||||
await user.type(nameInput, "My_Server");
|
||||
|
||||
const urlInput = screen.getByPlaceholderText("https://your-mcp-server.com");
|
||||
await user.type(urlInput, "https://example.com/mcp");
|
||||
const urlInput = screen.getByPlaceholderText("https://your-mcp-server.com");
|
||||
await user.type(urlInput, "https://example.com/mcp");
|
||||
|
||||
await selectAntOption("Authentication", "API Key");
|
||||
await selectAntOption("Authentication", "API Key");
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText("Authentication Value")).toBeInTheDocument();
|
||||
});
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText("Authentication Value")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
// Fill in auth value
|
||||
const authInput = screen.getByPlaceholderText("Enter token or secret");
|
||||
await user.type(authInput, "my-secret-key");
|
||||
// Fill in auth value
|
||||
const authInput = screen.getByPlaceholderText("Enter token or secret");
|
||||
await user.type(authInput, "my-secret-key");
|
||||
|
||||
vi.mocked(networking.createMCPServer).mockResolvedValue({
|
||||
server_id: "new-server-1",
|
||||
server_name: "My_Server",
|
||||
alias: "My_Server",
|
||||
url: "https://example.com/mcp",
|
||||
transport: "http",
|
||||
auth_type: "api_key",
|
||||
created_at: "2024-01-01T00:00:00Z",
|
||||
created_by: "user-1",
|
||||
updated_at: "2024-01-01T00:00:00Z",
|
||||
updated_by: "user-1",
|
||||
});
|
||||
vi.mocked(networking.createMCPServer).mockResolvedValue({
|
||||
server_id: "new-server-1",
|
||||
server_name: "My_Server",
|
||||
alias: "My_Server",
|
||||
url: "https://example.com/mcp",
|
||||
transport: "http",
|
||||
auth_type: "api_key",
|
||||
created_at: "2024-01-01T00:00:00Z",
|
||||
created_by: "user-1",
|
||||
updated_at: "2024-01-01T00:00:00Z",
|
||||
updated_by: "user-1",
|
||||
});
|
||||
|
||||
const submitButton = screen.getByRole("button", { name: "Add MCP Server" });
|
||||
await act(async () => {
|
||||
fireEvent.click(submitButton);
|
||||
});
|
||||
const submitButton = screen.getByRole("button", { name: "Add MCP Server" });
|
||||
await act(async () => {
|
||||
fireEvent.click(submitButton);
|
||||
});
|
||||
|
||||
await waitFor(() => {
|
||||
expect(networking.createMCPServer).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
await waitFor(() => {
|
||||
expect(networking.createMCPServer).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
const [token, payload] = vi.mocked(networking.createMCPServer).mock.calls[0];
|
||||
expect(token).toBe("test-token");
|
||||
expect(payload.credentials).toEqual({ auth_value: "my-secret-key" });
|
||||
});
|
||||
const [token, payload] = vi.mocked(networking.createMCPServer).mock.calls[0];
|
||||
expect(token).toBe("test-token");
|
||||
expect(payload.credentials).toEqual({ auth_value: "my-secret-key" });
|
||||
},
|
||||
);
|
||||
|
||||
it("should not show auth value field when None auth type is selected", async () => {
|
||||
await selectHttpTransport();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue