129 lines
3.5 KiB
Go
129 lines
3.5 KiB
Go
package mcp
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
mcpgo "github.com/mark3labs/mcp-go/mcp"
|
|
)
|
|
|
|
// Test server creation
|
|
func TestNewMCPGoServer(t *testing.T) {
|
|
server := newMCPGoServer()
|
|
if server == nil {
|
|
t.Fatal("expected server to be created, got nil")
|
|
}
|
|
}
|
|
|
|
// Test withToolRunLog wrapper succeeds
|
|
func TestWithToolRunLogWrapper(t *testing.T) {
|
|
called := false
|
|
handler := withToolRunLog("test_tool", func(ctx context.Context, req mcpgo.CallToolRequest) (*mcpgo.CallToolResult, error) {
|
|
called = true
|
|
return mcpgo.NewToolResultText("test result"), nil
|
|
})
|
|
result, err := handler(context.Background(), mcpgo.CallToolRequest{
|
|
Params: mcpgo.CallToolParams{
|
|
Name: "test_tool",
|
|
Arguments: map[string]any{},
|
|
},
|
|
})
|
|
if err != nil {
|
|
t.Errorf("expected no error, got %v", err)
|
|
}
|
|
if !called {
|
|
t.Error("expected handler to be called")
|
|
}
|
|
if result == nil {
|
|
t.Error("expected result to be non-nil")
|
|
}
|
|
}
|
|
|
|
// Test withToolRunLog wrapper with error result
|
|
func TestWithToolRunLogWrapperErrorResult(t *testing.T) {
|
|
handler := withToolRunLog("error_tool", func(ctx context.Context, req mcpgo.CallToolRequest) (*mcpgo.CallToolResult, error) {
|
|
return mcpgo.NewToolResultError("test error"), nil
|
|
})
|
|
result, err := handler(context.Background(), mcpgo.CallToolRequest{
|
|
Params: mcpgo.CallToolParams{
|
|
Name: "error_tool",
|
|
Arguments: map[string]any{},
|
|
},
|
|
})
|
|
if err != nil {
|
|
t.Errorf("expected no error, got %v", err)
|
|
}
|
|
if result == nil {
|
|
t.Error("expected result to be non-nil")
|
|
}
|
|
if !result.IsError {
|
|
t.Error("expected IsError flag to be set")
|
|
}
|
|
}
|
|
|
|
// Test extractToolResultText with nil result
|
|
func TestExtractToolResultTextNil(t *testing.T) {
|
|
result := extractToolResultText(nil)
|
|
if result != "tool error" {
|
|
t.Errorf("expected 'tool error', got %q", result)
|
|
}
|
|
}
|
|
|
|
// Test extractToolResultText with empty content
|
|
func TestExtractToolResultTextEmpty(t *testing.T) {
|
|
toolResult := &mcpgo.CallToolResult{
|
|
Content: []mcpgo.Content{},
|
|
}
|
|
result := extractToolResultText(toolResult)
|
|
if result != "tool error" {
|
|
t.Errorf("expected 'tool error', got %q", result)
|
|
}
|
|
}
|
|
|
|
// Test getMCPGoHTTPHandler initializes once
|
|
func TestGetMCPGoHTTPHandlerOnce(t *testing.T) {
|
|
handler1 := getMCPGoHTTPHandler()
|
|
handler2 := getMCPGoHTTPHandler()
|
|
if handler1 == nil {
|
|
t.Error("expected handler1 to be non-nil")
|
|
}
|
|
if handler2 == nil {
|
|
t.Error("expected handler2 to be non-nil")
|
|
}
|
|
// Both should be the same instance (sync.Once ensures this)
|
|
if handler1 != handler2 {
|
|
t.Error("expected handlers to be the same instance")
|
|
}
|
|
}
|
|
|
|
// Test resolveBaseURLFromContext with env var
|
|
func TestResolveBaseURLFromContextEnv(t *testing.T) {
|
|
t.Setenv("GINIMAGE_API_BASE_URL", "http://api.example.com")
|
|
url := resolveBaseURLFromContext(context.Background())
|
|
expected := "http://api.example.com"
|
|
if url != expected {
|
|
t.Errorf("expected %q, got %q", expected, url)
|
|
}
|
|
}
|
|
|
|
// Test resolveBaseURLFromContext without env var
|
|
func TestResolveBaseURLFromContextDefault(t *testing.T) {
|
|
t.Setenv("GINIMAGE_API_BASE_URL", "")
|
|
t.Setenv("PORT", "")
|
|
url := resolveBaseURLFromContext(context.Background())
|
|
if url != "http://127.0.0.1:8080" {
|
|
t.Errorf("expected default URL, got %q", url)
|
|
}
|
|
}
|
|
|
|
// Test resolveBaseURLFromContext with custom port
|
|
func TestResolveBaseURLFromContextCustomPort(t *testing.T) {
|
|
t.Setenv("GINIMAGE_API_BASE_URL", "")
|
|
t.Setenv("PORT", "9090")
|
|
url := resolveBaseURLFromContext(context.Background())
|
|
expected := "http://127.0.0.1:9090"
|
|
if url != expected {
|
|
t.Errorf("expected %q, got %q", expected, url)
|
|
}
|
|
}
|