package handlers import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" ) func setupTestRunnerRouter() (*gin.Engine, *TestRunnerHandler) { gin.SetMode(gin.TestMode) h := NewTestRunnerHandler() r := gin.New() r.POST("/api/v1/admin/test-runners/results", h.StoreResults) r.GET("/api/v1/admin/test-runners/results", h.GetAllResults) r.GET("/api/v1/admin/test-runners/results/:id", h.GetRunnerResults) return r, h } func TestTestRunnerGetAllEmpty(t *testing.T) { r, _ := setupTestRunnerRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/admin/test-runners/results", nil) r.ServeHTTP(w, req) if w.Code != http.StatusNotFound { t.Fatalf("expected 404, got %d", w.Code) } } func TestTestRunnerStoreAndRetrieveAll(t *testing.T) { r, _ := setupTestRunnerRouter() results := `{"summary":{"total":5,"passed":5,"failed":0}}` body, _ := json.Marshal(map[string]interface{}{ "runner_id": "all", "results": json.RawMessage(results), }) // Store w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/admin/test-runners/results", bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") r.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Fatalf("store: expected 200, got %d: %s", w.Code, w.Body.String()) } // Retrieve w = httptest.NewRecorder() req, _ = http.NewRequest("GET", "/api/v1/admin/test-runners/results", nil) r.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Fatalf("get all: expected 200, got %d", w.Code) } var got map[string]interface{} if err := json.Unmarshal(w.Body.Bytes(), &got); err != nil { t.Fatalf("invalid JSON: %v", err) } summary, _ := got["summary"].(map[string]interface{}) if summary == nil { t.Fatal("expected summary in results") } if int(summary["failed"].(float64)) != 0 { t.Fatalf("expected 0 failures, got %v", summary["failed"]) } } func TestTestRunnerStoreAndRetrieveByID(t *testing.T) { r, _ := setupTestRunnerRouter() results := `{"runner":"notes-runner","summary":{"total":3,"passed":3,"failed":0}}` body, _ := json.Marshal(map[string]interface{}{ "runner_id": "notes-runner", "results": json.RawMessage(results), }) // Store w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/admin/test-runners/results", bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") r.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Fatalf("store: expected 200, got %d", w.Code) } // Retrieve by ID w = httptest.NewRecorder() req, _ = http.NewRequest("GET", "/api/v1/admin/test-runners/results/notes-runner", nil) r.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Fatalf("get by id: expected 200, got %d", w.Code) } // Unknown ID → 404 w = httptest.NewRecorder() req, _ = http.NewRequest("GET", "/api/v1/admin/test-runners/results/unknown", nil) r.ServeHTTP(w, req) if w.Code != http.StatusNotFound { t.Fatalf("unknown id: expected 404, got %d", w.Code) } } func TestTestRunnerStoreBadBody(t *testing.T) { r, _ := setupTestRunnerRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/admin/test-runners/results", bytes.NewReader([]byte(`{}`))) req.Header.Set("Content-Type", "application/json") r.ServeHTTP(w, req) if w.Code != http.StatusBadRequest { t.Fatalf("expected 400 for empty results, got %d", w.Code) } }