103 lines
2.6 KiB
TypeScript
103 lines
2.6 KiB
TypeScript
import { render, screen, fireEvent } from "@testing-library/react";
|
|
import { describe, it, expect, jest } from "@jest/globals";
|
|
import ToolsTab from "../ToolsTab";
|
|
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
import { Tabs } from "@/components/ui/tabs";
|
|
|
|
describe("ToolsTab", () => {
|
|
const mockTools: Tool[] = [
|
|
{
|
|
name: "tool1",
|
|
description: "First tool",
|
|
inputSchema: {
|
|
type: "object" as const,
|
|
properties: {
|
|
num: { type: "number" as const },
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "tool3",
|
|
description: "Integer tool",
|
|
inputSchema: {
|
|
type: "object" as const,
|
|
properties: {
|
|
count: { type: "integer" as const },
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "tool2",
|
|
description: "Second tool",
|
|
inputSchema: {
|
|
type: "object" as const,
|
|
properties: {
|
|
num: { type: "number" as const },
|
|
},
|
|
},
|
|
},
|
|
];
|
|
|
|
const defaultProps = {
|
|
tools: mockTools,
|
|
listTools: jest.fn(),
|
|
clearTools: jest.fn(),
|
|
callTool: jest.fn(),
|
|
selectedTool: null,
|
|
setSelectedTool: jest.fn(),
|
|
toolResult: null,
|
|
nextCursor: "",
|
|
error: null,
|
|
};
|
|
|
|
const renderToolsTab = (props = {}) => {
|
|
return render(
|
|
<Tabs defaultValue="tools">
|
|
<ToolsTab {...defaultProps} {...props} />
|
|
</Tabs>,
|
|
);
|
|
};
|
|
|
|
it("should reset input values when switching tools", () => {
|
|
const { rerender } = renderToolsTab({
|
|
selectedTool: mockTools[0],
|
|
});
|
|
|
|
// Enter a value in the first tool's input
|
|
const input = screen.getByRole("spinbutton") as HTMLInputElement;
|
|
fireEvent.change(input, { target: { value: "42" } });
|
|
expect(input.value).toBe("42");
|
|
|
|
// Switch to second tool
|
|
rerender(
|
|
<Tabs defaultValue="tools">
|
|
<ToolsTab {...defaultProps} selectedTool={mockTools[2]} />
|
|
</Tabs>,
|
|
);
|
|
|
|
// Verify input is reset
|
|
const newInput = screen.getByRole("spinbutton") as HTMLInputElement;
|
|
expect(newInput.value).toBe("");
|
|
});
|
|
|
|
it("should handle integer type inputs", () => {
|
|
renderToolsTab({
|
|
selectedTool: mockTools[1], // Use the tool with integer type
|
|
});
|
|
|
|
const input = screen.getByRole("spinbutton", {
|
|
name: /count/i,
|
|
}) as HTMLInputElement;
|
|
expect(input).toHaveProperty("type", "number");
|
|
fireEvent.change(input, { target: { value: "42" } });
|
|
expect(input.value).toBe("42");
|
|
|
|
const submitButton = screen.getByRole("button", { name: /run tool/i });
|
|
fireEvent.click(submitButton);
|
|
|
|
expect(defaultProps.callTool).toHaveBeenCalledWith(mockTools[1].name, {
|
|
count: 42,
|
|
});
|
|
});
|
|
});
|