package mcp import ( "bytes" "encoding/json" "github.com/gin-gonic/gin" "net/http" "net/http/httptest" "strings" "testing" ) // TestHTTPHandlerToolsList tests POST /mcp tools/list request func TestHTTPHandlerToolsList(t *testing.T) { gin.SetMode(gin.TestMode) router := gin.New() router.POST("/mcp", HTTPHandler()) payload := map[string]interface{}{ "jsonrpc": "2.0", "id": 1, "method": "tools/list", } body, _ := json.Marshal(payload) req := httptest.NewRequest("POST", "/mcp", bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() router.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Errorf("expected status 200, got %d", w.Code) } } // TestHTTPHandlerAPIOverviewTool tests tools/call api_overview func TestHTTPHandlerAPIOverviewTool(t *testing.T) { gin.SetMode(gin.TestMode) router := gin.New() router.POST("/mcp", HTTPHandler()) payload := map[string]interface{}{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": map[string]interface{}{ "name": "api_overview", "arguments": map[string]interface{}{}, }, } body, _ := json.Marshal(payload) req := httptest.NewRequest("POST", "/mcp", bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() router.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Errorf("expected status 200, got %d", w.Code) } } // TestHTTPHandlerInvalidJSON tests invalid JSON request func TestHTTPHandlerInvalidJSON(t *testing.T) { gin.SetMode(gin.TestMode) router := gin.New() router.POST("/mcp", HTTPHandler()) req := httptest.NewRequest("POST", "/mcp", strings.NewReader("invalid json")) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() router.ServeHTTP(w, req) if w.Code != http.StatusBadRequest { t.Errorf("expected status 400, got %d", w.Code) } } // TestStreamableHTTPDELETEHandler tests DELETE response func TestStreamableHTTPDELETEHandler(t *testing.T) { gin.SetMode(gin.TestMode) router := gin.New() router.DELETE("/api/v1/mcp", StreamableHTTPDELETEHandler()) req := httptest.NewRequest("DELETE", "/api/v1/mcp", nil) w := httptest.NewRecorder() router.ServeHTTP(w, req) if w.Code != http.StatusMethodNotAllowed { t.Errorf("expected status 405, got %d", w.Code) } } // TestMCPInitialize tests initialize method func TestMCPInitialize(t *testing.T) { gin.SetMode(gin.TestMode) router := gin.New() router.POST("/mcp", HTTPHandler()) payload := map[string]interface{}{ "jsonrpc": "2.0", "id": 1, "method": "initialize", } body, _ := json.Marshal(payload) req := httptest.NewRequest("POST", "/mcp", bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() router.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Errorf("expected status 200, got %d", w.Code) } }