Files
sub2api-cn-relay-manager/internal/store/sqlite/route_logging_repos_test.go
2026-05-28 21:24:05 +08:00

130 lines
3.8 KiB
Go

package sqlite
import (
"context"
"testing"
)
func TestRouteDecisionLogsRepoCreateAndListRecent(t *testing.T) {
t.Parallel()
store := openTestDB(t)
ctx := context.Background()
if _, err := store.RouteDecisionLogs().Create(ctx, RouteDecisionLog{
RequestID: "req-1",
LogicalGroupID: "gpt-shared",
PublicModel: "gpt-5.4",
UserKey: "user-a",
ConversationKey: "conv-a",
StickyKey: "sticky-a",
StickyKeyType: "conversation",
StickyHit: true,
SelectedRouteID: "asxs",
SelectedShadowGroupID: "gpt-shared__asxs",
FallbackUsed: false,
ErrorClass: "",
UpstreamStatus: 200,
LatencyMS: 123,
}); err != nil {
t.Fatalf("RouteDecisionLogs().Create() error = %v", err)
}
logs, err := store.RouteDecisionLogs().ListRecent(ctx, RouteDecisionLogFilter{
LogicalGroupID: "gpt-shared",
Limit: 10,
})
if err != nil {
t.Fatalf("RouteDecisionLogs().ListRecent() error = %v", err)
}
if len(logs) != 1 {
t.Fatalf("RouteDecisionLogs().ListRecent() len = %d, want 1", len(logs))
}
if logs[0].SelectedRouteID != "asxs" || !logs[0].StickyHit || logs[0].UpstreamStatus != 200 {
t.Fatalf("RouteDecisionLogs().ListRecent()[0] = %+v", logs[0])
}
}
func TestRouteFailoverEventsRepoCreateAndListRecent(t *testing.T) {
t.Parallel()
store := openTestDB(t)
ctx := context.Background()
if _, err := store.RouteFailoverEvents().Create(ctx, RouteFailoverEvent{
RequestID: "req-2",
LogicalGroupID: "gpt-shared",
PublicModel: "gpt-5.4",
FromRouteID: "asxs",
ToRouteID: "codex2api",
Reason: "upstream_5xx",
FailureCount: 2,
}); err != nil {
t.Fatalf("RouteFailoverEvents().Create() error = %v", err)
}
items, err := store.RouteFailoverEvents().ListRecent(ctx, RouteFailoverEventFilter{
RequestID: "req-2",
Limit: 10,
})
if err != nil {
t.Fatalf("RouteFailoverEvents().ListRecent() error = %v", err)
}
if len(items) != 1 {
t.Fatalf("RouteFailoverEvents().ListRecent() len = %d, want 1", len(items))
}
if items[0].ToRouteID != "codex2api" || items[0].FailureCount != 2 {
t.Fatalf("RouteFailoverEvents().ListRecent()[0] = %+v", items[0])
}
}
func TestRouteStickyAuditRepoCreateAndListRecent(t *testing.T) {
t.Parallel()
store := openTestDB(t)
ctx := context.Background()
if _, err := store.RouteStickyAudit().Create(ctx, RouteStickyAudit{
StickyKey: "sticky-3",
StickyKeyType: "user_model",
LogicalGroupID: "gpt-shared",
PublicModel: "gpt-5.4-mini",
RouteID: "asxs",
Action: "bind",
ExpiresAt: "2026-05-28T18:00:00Z",
}); err != nil {
t.Fatalf("RouteStickyAudit().Create() error = %v", err)
}
items, err := store.RouteStickyAudit().ListRecent(ctx, RouteStickyAuditFilter{
StickyKey: "sticky-3",
Limit: 10,
})
if err != nil {
t.Fatalf("RouteStickyAudit().ListRecent() error = %v", err)
}
if len(items) != 1 {
t.Fatalf("RouteStickyAudit().ListRecent() len = %d, want 1", len(items))
}
if items[0].Action != "bind" || items[0].RouteID != "asxs" {
t.Fatalf("RouteStickyAudit().ListRecent()[0] = %+v", items[0])
}
}
func TestRouteLoggingReposRejectInvalidRows(t *testing.T) {
t.Parallel()
store := openTestDB(t)
ctx := context.Background()
if _, err := store.RouteDecisionLogs().Create(ctx, RouteDecisionLog{}); err == nil {
t.Fatal("RouteDecisionLogs().Create() error = nil, want validation error")
}
if _, err := store.RouteFailoverEvents().Create(ctx, RouteFailoverEvent{}); err == nil {
t.Fatal("RouteFailoverEvents().Create() error = nil, want validation error")
}
if _, err := store.RouteStickyAudit().Create(ctx, RouteStickyAudit{}); err == nil {
t.Fatal("RouteStickyAudit().Create() error = nil, want validation error")
}
}