e50cabac4b
- Updated all references from v6 to v7 for `github.com/router-for-me/CLIProxyAPI`. - Ensured consistency in imports within core libraries, tests, and integration tests. - Added missing tests for new features in Redis Protocol integration.
99 lines
2.6 KiB
Go
99 lines
2.6 KiB
Go
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)
|
|
}
|
|
}
|