picoclaw/pkg/mcp/manager_test.go

101 lines
2.5 KiB
Go

package mcp
import (
"context"
"testing"
)
type fakeClient struct {
tools []RemoteTool
callResult CallResult
callErr error
lastToolName string
lastArgs map[string]any
}
func (f *fakeClient) Start(_ context.Context) error { return nil }
func (f *fakeClient) ListTools(_ context.Context) ([]RemoteTool, error) {
return f.tools, nil
}
func (f *fakeClient) CallTool(_ context.Context, toolName string, arguments map[string]any) (CallResult, error) {
f.lastToolName = toolName
f.lastArgs = arguments
if f.callErr != nil {
return CallResult{}, f.callErr
}
return f.callResult, nil
}
func (f *fakeClient) Close() error { return nil }
func TestManager_DiscoverTools_FilterAndCall(t *testing.T) {
serverCfg := map[string]ServerConfig{
"Local Dev": {
Command: "fake",
IncludeTools: []string{"alpha", "beta"},
ExcludeTools: []string{"beta"},
},
}
manager := NewManager(serverCfg)
client := &fakeClient{
tools: []RemoteTool{
{Name: "alpha", Description: "tool alpha"},
{Name: "beta", Description: "tool beta"},
{Name: "gamma", Description: "tool gamma"},
},
callResult: CallResult{Content: "ok"},
}
manager.newClient = func(_ ServerConfig) Client {
return client
}
tools, err := manager.DiscoverTools(context.Background())
if err != nil {
t.Fatalf("DiscoverTools() error = %v", err)
}
if len(tools) != 1 {
t.Fatalf("DiscoverTools() returned %d tools, want 1", len(tools))
}
tool := tools[0]
if tool.ToolName != "alpha" {
t.Fatalf("discovered tool = %q, want alpha", tool.ToolName)
}
result, err := manager.CallTool(context.Background(), tool.QualifiedName, map[string]any{"x": 1})
if err != nil {
t.Fatalf("CallTool() error = %v", err)
}
if result.Content != "ok" {
t.Fatalf("CallTool() content = %q, want ok", result.Content)
}
if client.lastToolName != "alpha" {
t.Fatalf("called MCP tool = %q, want alpha", client.lastToolName)
}
}
func TestManager_NormalizeEmptySchema(t *testing.T) {
serverCfg := map[string]ServerConfig{
"srv": {Command: "fake"},
}
manager := NewManager(serverCfg)
manager.newClient = func(_ ServerConfig) Client {
return &fakeClient{
tools: []RemoteTool{{Name: "empty_schema", InputSchema: nil}},
}
}
tools, err := manager.DiscoverTools(context.Background())
if err != nil {
t.Fatalf("DiscoverTools() error = %v", err)
}
if len(tools) != 1 {
t.Fatalf("DiscoverTools() returned %d tools, want 1", len(tools))
}
parameters := tools[0].Parameters
if parameters["type"] != "object" {
t.Fatalf("normalized schema type = %v, want object", parameters["type"])
}
}