142 lines
3.5 KiB
Go
142 lines
3.5 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCollectSelectionFailureStats(t *testing.T) {
|
|
svc := &GatewayService{}
|
|
model := "sora2-landscape-10s"
|
|
resetAt := time.Now().Add(2 * time.Minute).Format(time.RFC3339)
|
|
|
|
accounts := []Account{
|
|
// excluded
|
|
{
|
|
ID: 1,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: true,
|
|
},
|
|
// unschedulable
|
|
{
|
|
ID: 2,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: false,
|
|
},
|
|
// platform filtered
|
|
{
|
|
ID: 3,
|
|
Platform: PlatformOpenAI,
|
|
Status: StatusActive,
|
|
Schedulable: true,
|
|
},
|
|
// model unsupported
|
|
{
|
|
ID: 4,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: true,
|
|
Credentials: map[string]any{
|
|
"model_mapping": map[string]any{
|
|
"gpt-image": "gpt-image",
|
|
},
|
|
},
|
|
},
|
|
// model rate limited
|
|
{
|
|
ID: 5,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: true,
|
|
Extra: map[string]any{
|
|
"model_rate_limits": map[string]any{
|
|
model: map[string]any{
|
|
"rate_limit_reset_at": resetAt,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
// eligible
|
|
{
|
|
ID: 6,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: true,
|
|
},
|
|
}
|
|
|
|
excluded := map[int64]struct{}{1: {}}
|
|
stats := svc.collectSelectionFailureStats(context.Background(), accounts, model, PlatformSora, excluded, false)
|
|
|
|
if stats.Total != 6 {
|
|
t.Fatalf("total=%d want=6", stats.Total)
|
|
}
|
|
if stats.Excluded != 1 {
|
|
t.Fatalf("excluded=%d want=1", stats.Excluded)
|
|
}
|
|
if stats.Unschedulable != 1 {
|
|
t.Fatalf("unschedulable=%d want=1", stats.Unschedulable)
|
|
}
|
|
if stats.PlatformFiltered != 1 {
|
|
t.Fatalf("platform_filtered=%d want=1", stats.PlatformFiltered)
|
|
}
|
|
if stats.ModelUnsupported != 1 {
|
|
t.Fatalf("model_unsupported=%d want=1", stats.ModelUnsupported)
|
|
}
|
|
if stats.ModelRateLimited != 1 {
|
|
t.Fatalf("model_rate_limited=%d want=1", stats.ModelRateLimited)
|
|
}
|
|
if stats.Eligible != 1 {
|
|
t.Fatalf("eligible=%d want=1", stats.Eligible)
|
|
}
|
|
}
|
|
|
|
func TestDiagnoseSelectionFailure_SoraUnschedulableDetail(t *testing.T) {
|
|
svc := &GatewayService{}
|
|
acc := &Account{
|
|
ID: 7,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: false,
|
|
}
|
|
|
|
diagnosis := svc.diagnoseSelectionFailure(context.Background(), acc, "sora2-landscape-10s", PlatformSora, map[int64]struct{}{}, false)
|
|
if diagnosis.Category != "unschedulable" {
|
|
t.Fatalf("category=%s want=unschedulable", diagnosis.Category)
|
|
}
|
|
if diagnosis.Detail != "schedulable=false" {
|
|
t.Fatalf("detail=%s want=schedulable=false", diagnosis.Detail)
|
|
}
|
|
}
|
|
|
|
func TestDiagnoseSelectionFailure_SoraModelRateLimitedDetail(t *testing.T) {
|
|
svc := &GatewayService{}
|
|
model := "sora2-landscape-10s"
|
|
resetAt := time.Now().Add(2 * time.Minute).UTC().Format(time.RFC3339)
|
|
acc := &Account{
|
|
ID: 8,
|
|
Platform: PlatformSora,
|
|
Status: StatusActive,
|
|
Schedulable: true,
|
|
Extra: map[string]any{
|
|
"model_rate_limits": map[string]any{
|
|
model: map[string]any{
|
|
"rate_limit_reset_at": resetAt,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
diagnosis := svc.diagnoseSelectionFailure(context.Background(), acc, model, PlatformSora, map[int64]struct{}{}, false)
|
|
if diagnosis.Category != "model_rate_limited" {
|
|
t.Fatalf("category=%s want=model_rate_limited", diagnosis.Category)
|
|
}
|
|
if !strings.Contains(diagnosis.Detail, "remaining=") {
|
|
t.Fatalf("detail=%s want contains remaining=", diagnosis.Detail)
|
|
}
|
|
}
|