Files
tbphp d4699dd2b1 feat(health): 支持凭据按模型冷却与统一恢复 (#599)
* feat(health): 支持凭据按模型冷却与统一恢复

* fix(health): 修复模型冷却的错误契约与恢复边界

* fix(web): 修复模型冷却展示与重置反馈

* fix(web): 保持分组健康与恢复反馈一致

* fix(health): 修复停用分组的模型冷却身份展示
2026-09-09 08:05:43 +08:00

34 lines
1.1 KiB
Go

package requestlog
import (
"testing"
"time"
"gpt-load/internal/execution"
"gpt-load/internal/platform/redact"
"gpt-load/internal/telemetry"
)
func TestModelCooldownAttemptPreservesTargetAndDeadline(t *testing.T) {
event := testEvent("model-cooldown-attempt")
deadline := event.CompletedAt.Add(48 * time.Hour).Truncate(time.Millisecond)
event.Attempts[0].FailureScope = execution.ErrorScopeModel
event.Attempts[0].Effect = telemetry.EffectCooldownModel
event.Attempts[0].CooldownUntil = deadline
row, err := mapEvent(redact.New(), event)
if err != nil {
t.Fatal(err)
}
decoded, err := decodeAttemptRows(row.AttemptRows)
if err != nil {
t.Fatal(err)
}
if len(decoded) != 1 || decoded[0].Effect != telemetry.EffectCooldownModel || decoded[0].UpstreamModel != event.Attempts[0].UpstreamModel || decoded[0].CooldownUntilMS == nil || *decoded[0].CooldownUntilMS != deadline.UnixMilli() {
t.Fatalf("decoded = %#v", decoded)
}
event.Attempts[0].CooldownUntil = time.Time{}
if _, err := mapEvent(redact.New(), event); err == nil {
t.Fatal("accepted model cooldown without deadline")
}
}