118 lines
3.0 KiB
Go
118 lines
3.0 KiB
Go
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"])
|
|
}
|
|
}
|