chore: add test

This commit is contained in:
Yuta Saito 2026-01-02 11:55:55 +09:00
parent 9815b00deb
commit df4eb84498
3 changed files with 180 additions and 1 deletions

View file

@ -253,7 +253,7 @@ describe("ChatUI", () => {
};
const getMcpSelect = () =>
screen.getByText("MCP Tool").closest("div")?.querySelector(".ant-select") as HTMLElement | null;
screen.getByText("MCP Servers").closest("div")?.querySelector(".ant-select") as HTMLElement | null;
await selectEndpointOption("/v1/embeddings");

View file

@ -115,4 +115,58 @@ describe("chat_completion", () => {
max_tokens: 100,
});
});
it("should configure MCP tools per server with restrictions", async () => {
const selectedMCPServers = ["server-1", "server-2"];
const mcpServers = [
{ server_id: "server-1", alias: "alpha", server_name: "Alpha" },
{ server_id: "server-2", server_name: "Beta" },
];
const mcpServerToolRestrictions = {
"server-1": ["toolA", "toolB"],
"server-2": ["toolC"],
} as Record<string, string[]>;
await makeOpenAIChatCompletionRequest(
mockChatHistory,
mockUpdateUI,
"gpt-4",
"test-token",
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
selectedMCPServers,
undefined,
undefined,
undefined,
undefined,
undefined,
mcpServers,
mcpServerToolRestrictions,
);
const callArgs = mockCreate.mock.calls[0][0];
expect(callArgs.tool_choice).toBe("auto");
expect(callArgs.tools).toEqual([
{
type: "mcp",
server_label: "litellm",
server_url: "litellm_proxy/mcp/alpha",
require_approval: "never",
allowed_tools: ["toolA", "toolB"],
},
{
type: "mcp",
server_label: "litellm",
server_url: "litellm_proxy/mcp/Beta",
require_approval: "never",
allowed_tools: ["toolC"],
},
]);
});
});

View file

@ -0,0 +1,125 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { makeOpenAIResponsesRequest } from "./responses_api";
import { MessageType } from "../chat_ui/types";
vi.mock("@/components/networking", () => ({
getProxyBaseUrl: vi.fn(() => "https://example.com"),
}));
const mockResponsesCreate = vi.fn();
const mockClient = {
responses: {
create: mockResponsesCreate,
},
};
vi.mock("openai", () => ({
default: {
OpenAI: vi.fn(() => mockClient),
},
}));
describe("responses_api", () => {
const mockUpdateTextUI = vi.fn();
const messages: MessageType[] = [{ role: "user", content: "Hello" }];
beforeEach(() => {
const mockEvents = [
{ type: "response.output_text.delta", delta: "Hi" },
{
type: "response.completed",
response: {
id: "resp_123",
usage: { output_tokens: 2, input_tokens: 5, total_tokens: 7 },
},
},
];
async function* mockStream() {
for (const event of mockEvents) {
yield event;
}
}
mockResponsesCreate.mockResolvedValue(mockStream());
});
afterEach(() => {
vi.clearAllMocks();
});
it("should send a basic responses request", async () => {
await makeOpenAIResponsesRequest(messages, mockUpdateTextUI, "gpt-4", "test-token");
expect(mockResponsesCreate).toHaveBeenCalledTimes(1);
expect(mockResponsesCreate).toHaveBeenCalledWith(
expect.objectContaining({
model: "gpt-4",
input: [
{
role: "user",
content: "Hello",
type: "message",
},
],
stream: true,
}),
{ signal: undefined },
);
expect(mockUpdateTextUI).toHaveBeenCalledWith("assistant", "Hi", "gpt-4");
});
it("should configure MCP tools per server with restrictions", async () => {
const selectedMCPServers = ["server-1", "server-2"];
const mcpServers = [
{ server_id: "server-1", alias: "alpha", server_name: "Alpha" },
{ server_id: "server-2", server_name: "Beta" },
];
const mcpServerToolRestrictions: Record<string, string[]> = {
"server-1": ["toolA"],
"server-2": ["toolB", "toolC"],
};
await makeOpenAIResponsesRequest(
messages,
mockUpdateTextUI,
"gpt-4",
"test-token",
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
selectedMCPServers,
undefined,
undefined,
undefined,
undefined,
undefined,
mcpServers,
mcpServerToolRestrictions,
);
const callArgs = mockResponsesCreate.mock.calls[0][0];
expect(callArgs.tool_choice).toBe("auto");
expect(callArgs.tools).toEqual([
{
type: "mcp",
server_label: "litellm",
server_url: "litellm_proxy/mcp/alpha",
require_approval: "never",
allowed_tools: ["toolA"],
},
{
type: "mcp",
server_label: "litellm",
server_url: "litellm_proxy/mcp/Beta",
require_approval: "never",
allowed_tools: ["toolB", "toolC"],
},
]);
});
});