package region_sync import ( "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestSyncClient_SyncUserCreate(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, "POST", r.Method) assert.Equal(t, "/api/internal/sync/user/create", r.URL.Path) assert.Equal(t, "test-sync-key", r.Header.Get("X-Sync-API-Key")) var req SyncUserRequest json.NewDecoder(r.Body).Decode(&req) assert.Equal(t, "testuser", req.Username) assert.Equal(t, 123, req.RemoteUserId) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(SyncUserResponse{Success: true}) })) defer server.Close() client := NewSyncClient(server.URL, "test-sync-key") resp, err := client.SyncUserCreate(&SyncUserRequest{ Username: "testuser", RemoteUserId: 123, }) require.NoError(t, err) assert.True(t, resp.Success) } func TestSyncClient_QueryQuota(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(QueryQuotaResponse{Success: true, Quota: 50000}) })) defer server.Close() client := NewSyncClient(server.URL, "test-key") resp, err := client.QueryQuota(123) require.NoError(t, err) assert.True(t, resp.Success) assert.Equal(t, 50000, resp.Quota) } func TestSyncClient_BatchDeduct(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var req BatchDeductRequest json.NewDecoder(r.Body).Decode(&req) assert.Len(t, req.Records, 2) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(BatchDeductResponse{ Success: true, Results: []DeductResult{ {UserId: 100, Success: true}, {UserId: 101, Success: true}, }, }) })) defer server.Close() client := NewSyncClient(server.URL, "test-key") resp, err := client.BatchDeduct(&BatchDeductRequest{ Records: []BatchDeductRecord{ {UserId: 100, RequestId: "req-1", Quota: 100}, {UserId: 101, RequestId: "req-2", Quota: 200}, }, }) require.NoError(t, err) assert.True(t, resp.Success) assert.Len(t, resp.Results, 2) } func TestSyncClient_UpdateQuota(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, "/api/internal/sync/quota/update", r.URL.Path) var req UpdateQuotaRequest json.NewDecoder(r.Body).Decode(&req) assert.Equal(t, 123, req.RemoteUserId) assert.Equal(t, 50000, req.Quota) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(UpdateQuotaResponse{Success: true}) })) defer server.Close() client := NewSyncClient(server.URL, "test-key") resp, err := client.UpdateQuota(123, 50000) require.NoError(t, err) assert.True(t, resp.Success) } func TestSyncClient_DoRequest_Error(t *testing.T) { // 测试请求错误处理 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 返回错误状态码 w.WriteHeader(http.StatusInternalServerError) })) defer server.Close() client := NewSyncClient(server.URL, "test-key") _, err := client.QueryQuota(123) // 应该有错误,但不是因为 marshaling/unmarshaling assert.NotNil(t, err) }