gomog/internal/protocol/http/batch2_test.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"])
}
}