package http import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" "git.kingecg.top/kingecg/gomog/internal/engine" "git.kingecg.top/kingecg/gomog/pkg/types" ) // TestHTTPUpdateWithUpsert 测试 HTTP API 的 upsert 功能 func TestHTTPUpdateWithUpsert(t *testing.T) { store := engine.NewMemoryStore(nil) crud := engine.NewCRUDHandler(store, nil) agg := engine.NewAggregationEngine(store) handler := NewRequestHandler(store, crud, agg) // Create test collection collection := "test.http_upsert" engine.CreateTestCollectionForTesting(store, collection, make(map[string]types.Document)) // Test upsert request updateReq := types.UpdateRequest{ Updates: []types.UpdateOperation{ { Q: types.Filter{"_id": "new_user"}, U: types.Update{ Set: map[string]interface{}{ "name": "New User", "status": "active", }, SetOnInsert: map[string]interface{}{ "createdAt": "2024-01-01T00:00:00Z", }, }, Upsert: true, }, }, } body, _ := json.Marshal(updateReq) req := httptest.NewRequest(http.MethodPost, "/api/v1/test/http_upsert/update", bytes.NewReader(body)) w := httptest.NewRecorder() handler.HandleUpdate(w, req, "test", "http_upsert") if w.Code != http.StatusOK { t.Errorf("HandleUpdate() status = %d, want %d", w.Code, http.StatusOK) } var response types.UpdateResult if err := json.Unmarshal(w.Body.Bytes(), &response); err != nil { t.Fatalf("Failed to parse response: %v", err) } if response.N != 1 { t.Errorf("Expected 1 document affected, got %d", response.N) } } // TestHTTPHealthCheck 测试健康检查端点 func TestHTTPHealthCheck(t *testing.T) { store := engine.NewMemoryStore(nil) crud := engine.NewCRUDHandler(store, nil) agg := engine.NewAggregationEngine(store) server := NewHTTPServer(":0", NewRequestHandler(store, crud, agg)) req := httptest.NewRequest(http.MethodGet, "/health", nil) w := httptest.NewRecorder() server.mux.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Errorf("Health check status = %d, want %d", w.Code, http.StatusOK) } var response map[string]interface{} if err := json.Unmarshal(w.Body.Bytes(), &response); err != nil { t.Fatalf("Failed to parse response: %v", err) } if response["status"] != "healthy" { t.Errorf("Expected healthy status, got %v", response["status"]) } } // TestHTTPRoot 测试根路径处理 func TestHTTPRoot(t *testing.T) { store := engine.NewMemoryStore(nil) crud := engine.NewCRUDHandler(store, nil) agg := engine.NewAggregationEngine(store) server := NewHTTPServer(":0", NewRequestHandler(store, crud, agg)) req := httptest.NewRequest(http.MethodGet, "/", nil) w := httptest.NewRecorder() server.mux.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Errorf("Root path status = %d, want %d", w.Code, http.StatusOK) } var response map[string]interface{} if err := json.Unmarshal(w.Body.Bytes(), &response); err != nil { t.Fatalf("Failed to parse response: %v", err) } if response["name"] != "Gomog Server" { t.Errorf("Expected 'Gomog Server', got %v", response["name"]) } }