You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

114 lines
3.3 KiB

  1. package region_sync
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestSyncClient_SyncUserCreate(t *testing.T) {
  11. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  12. assert.Equal(t, "POST", r.Method)
  13. assert.Equal(t, "/api/internal/sync/user/create", r.URL.Path)
  14. assert.Equal(t, "test-sync-key", r.Header.Get("X-Sync-API-Key"))
  15. var req SyncUserRequest
  16. json.NewDecoder(r.Body).Decode(&req)
  17. assert.Equal(t, "testuser", req.Username)
  18. assert.Equal(t, 123, req.RemoteUserId)
  19. w.Header().Set("Content-Type", "application/json")
  20. json.NewEncoder(w).Encode(SyncUserResponse{Success: true})
  21. }))
  22. defer server.Close()
  23. client := NewSyncClient(server.URL, "test-sync-key")
  24. resp, err := client.SyncUserCreate(&SyncUserRequest{
  25. Username: "testuser",
  26. RemoteUserId: 123,
  27. })
  28. require.NoError(t, err)
  29. assert.True(t, resp.Success)
  30. }
  31. func TestSyncClient_QueryQuota(t *testing.T) {
  32. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  33. w.Header().Set("Content-Type", "application/json")
  34. json.NewEncoder(w).Encode(QueryQuotaResponse{Success: true, Quota: 50000})
  35. }))
  36. defer server.Close()
  37. client := NewSyncClient(server.URL, "test-key")
  38. resp, err := client.QueryQuota(123)
  39. require.NoError(t, err)
  40. assert.True(t, resp.Success)
  41. assert.Equal(t, 50000, resp.Quota)
  42. }
  43. func TestSyncClient_BatchDeduct(t *testing.T) {
  44. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  45. var req BatchDeductRequest
  46. json.NewDecoder(r.Body).Decode(&req)
  47. assert.Len(t, req.Records, 2)
  48. w.Header().Set("Content-Type", "application/json")
  49. json.NewEncoder(w).Encode(BatchDeductResponse{
  50. Success: true,
  51. Results: []DeductResult{
  52. {UserId: 100, Success: true},
  53. {UserId: 101, Success: true},
  54. },
  55. })
  56. }))
  57. defer server.Close()
  58. client := NewSyncClient(server.URL, "test-key")
  59. resp, err := client.BatchDeduct(&BatchDeductRequest{
  60. Records: []BatchDeductRecord{
  61. {UserId: 100, RequestId: "req-1", Quota: 100},
  62. {UserId: 101, RequestId: "req-2", Quota: 200},
  63. },
  64. })
  65. require.NoError(t, err)
  66. assert.True(t, resp.Success)
  67. assert.Len(t, resp.Results, 2)
  68. }
  69. func TestSyncClient_UpdateQuota(t *testing.T) {
  70. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  71. assert.Equal(t, "/api/internal/sync/quota/update", r.URL.Path)
  72. var req UpdateQuotaRequest
  73. json.NewDecoder(r.Body).Decode(&req)
  74. assert.Equal(t, 123, req.RemoteUserId)
  75. assert.Equal(t, 50000, req.Quota)
  76. w.Header().Set("Content-Type", "application/json")
  77. json.NewEncoder(w).Encode(UpdateQuotaResponse{Success: true})
  78. }))
  79. defer server.Close()
  80. client := NewSyncClient(server.URL, "test-key")
  81. resp, err := client.UpdateQuota(123, 50000)
  82. require.NoError(t, err)
  83. assert.True(t, resp.Success)
  84. }
  85. func TestSyncClient_DoRequest_Error(t *testing.T) {
  86. // 测试请求错误处理
  87. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  88. // 返回错误状态码
  89. w.WriteHeader(http.StatusInternalServerError)
  90. }))
  91. defer server.Close()
  92. client := NewSyncClient(server.URL, "test-key")
  93. _, err := client.QueryQuota(123)
  94. // 应该有错误,但不是因为 marshaling/unmarshaling
  95. assert.NotNil(t, err)
  96. }