package management import ( "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/router-for-me/CLIProxyAPI/v7/internal/redisqueue" ) func TestGetUsageQueuePopsRequestedRecords(t *testing.T) { gin.SetMode(gin.TestMode) withManagementUsageQueue(t, func() { redisqueue.Enqueue([]byte(`{"id":1}`)) redisqueue.Enqueue([]byte(`{"id":2}`)) redisqueue.Enqueue([]byte(`{"id":3}`)) rec := httptest.NewRecorder() ginCtx, _ := gin.CreateTestContext(rec) ginCtx.Request = httptest.NewRequest(http.MethodGet, "/v0/management/usage-queue?count=2", nil) h := &Handler{} h.GetUsageQueue(ginCtx) if rec.Code != http.StatusOK { t.Fatalf("status = %d, want %d body=%s", rec.Code, http.StatusOK, rec.Body.String()) } var payload []json.RawMessage if errUnmarshal := json.Unmarshal(rec.Body.Bytes(), &payload); errUnmarshal != nil { t.Fatalf("unmarshal response: %v", errUnmarshal) } if len(payload) != 2 { t.Fatalf("response records = %d, want 2", len(payload)) } requireRecordID(t, payload[0], 1) requireRecordID(t, payload[1], 2) remaining := redisqueue.PopOldest(10) if len(remaining) != 1 || string(remaining[0]) != `{"id":3}` { t.Fatalf("remaining queue = %q, want third item only", remaining) } }) } func TestGetUsageQueueInvalidCountDoesNotPop(t *testing.T) { gin.SetMode(gin.TestMode) withManagementUsageQueue(t, func() { redisqueue.Enqueue([]byte(`{"id":1}`)) rec := httptest.NewRecorder() ginCtx, _ := gin.CreateTestContext(rec) ginCtx.Request = httptest.NewRequest(http.MethodGet, "/v0/management/usage-queue?count=0", nil) h := &Handler{} h.GetUsageQueue(ginCtx) if rec.Code != http.StatusBadRequest { t.Fatalf("status = %d, want %d body=%s", rec.Code, http.StatusBadRequest, rec.Body.String()) } remaining := redisqueue.PopOldest(10) if len(remaining) != 1 || string(remaining[0]) != `{"id":1}` { t.Fatalf("remaining queue = %q, want original item", remaining) } }) } func withManagementUsageQueue(t *testing.T, fn func()) { t.Helper() prevQueueEnabled := redisqueue.Enabled() redisqueue.SetEnabled(false) redisqueue.SetEnabled(true) defer func() { redisqueue.SetEnabled(false) redisqueue.SetEnabled(prevQueueEnabled) }() fn() } func requireRecordID(t *testing.T, raw json.RawMessage, want int) { t.Helper() var payload struct { ID int `json:"id"` } if errUnmarshal := json.Unmarshal(raw, &payload); errUnmarshal != nil { t.Fatalf("unmarshal record: %v", errUnmarshal) } if payload.ID != want { t.Fatalf("record id = %d, want %d", payload.ID, want) } }