fixing ui build and tests

This commit is contained in:
yuneng-jiang
2026-03-11 12:55:16 -07:00
parent 59c24b7405
commit d415ffc70b
9 changed files with 47 additions and 25 deletions
@@ -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);
});
@@ -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(<AllModelsTab {...defaultProps} />);
renderWithProviders(<AllModelsTab {...defaultProps} />);
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(<AllModelsTab {...defaultProps} />);
renderWithProviders(<AllModelsTab {...defaultProps} />);
await waitFor(() => {
expect(screen.getByText("gpt-4-clickable")).toBeInTheDocument();
@@ -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);
});
@@ -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")!);
});
@@ -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 () => {
@@ -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");
});
@@ -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";
@@ -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[] }[],
@@ -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"],
},