| package util |
|
|
| import ( |
| "testing" |
| "time" |
| ) |
|
|
| func TestParseResetTimeFrom1308Error(t *testing.T) { |
| tests := []struct { |
| name string |
| responseBody string |
| expectSuccess bool |
| expectTime string |
| }{ |
| { |
| name: "标准1308错误", |
| responseBody: `{"type":"error","error":{"type":"1308","message":"已达到 5 小时的使用上限。您的限额将在 2025-12-09 18:08:11 重置。"},"request_id":"20251209155304a15e2cfd9ae44ae8"}`, |
| expectSuccess: true, |
| expectTime: "2025-12-09 18:08:11", |
| }, |
| { |
| name: "非1308错误", |
| responseBody: `{"type":"error","error":{"type":"1307","message":"其他错误"},"request_id":"xxx"}`, |
| expectSuccess: false, |
| }, |
| { |
| name: "格式错误的JSON", |
| responseBody: `{invalid json}`, |
| expectSuccess: false, |
| }, |
| { |
| name: "缺少时间信息", |
| responseBody: `{"type":"error","error":{"type":"1308","message":"错误信息但没有时间"},"request_id":"xxx"}`, |
| expectSuccess: false, |
| }, |
| { |
| name: "时间格式错误", |
| responseBody: `{"type":"error","error":{"type":"1308","message":"您的限额将在 2025/12/09 重置。"},"request_id":"xxx"}`, |
| expectSuccess: false, |
| }, |
| { |
| name: "使用code字段的1308错误(非Anthropic格式)", |
| responseBody: `{"error":{"code":"1308","message":"已达到 5 小时的使用上限。您的限额将在 2025-12-21 15:00:05 重置。"},"request_id":"202512211335142b05cc4f9bbb4e6c"}`, |
| expectSuccess: true, |
| expectTime: "2025-12-21 15:00:05", |
| }, |
| { |
| name: "1310周/月度限额耗尽", |
| responseBody: `{"error":{"code":"1310","message":"Weekly/Monthly Limit Exhausted. Your limit will reset at 2026-04-20 15:24:20"},"request_id":"..."}`, |
| expectSuccess: true, |
| expectTime: "2026-04-20 15:24:20", |
| }, |
| { |
| name: "1310错误无时间", |
| responseBody: `{"error":{"code":"1310","message":"Weekly/Monthly Limit Exhausted"}}`, |
| expectSuccess: false, |
| }, |
| } |
|
|
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| resetTime, ok := ParseResetTimeFrom1308Error([]byte(tt.responseBody)) |
|
|
| if ok != tt.expectSuccess { |
| t.Errorf("ParseResetTimeFrom1308Error() ok = %v, want %v", ok, tt.expectSuccess) |
| return |
| } |
|
|
| if tt.expectSuccess { |
| expectedTime, err := time.ParseInLocation("2006-01-02 15:04:05", tt.expectTime, time.Local) |
| if err != nil { |
| t.Fatalf("测试用例时间格式错误: %v", err) |
| } |
|
|
| if !resetTime.Equal(expectedTime) { |
| t.Errorf("ParseResetTimeFrom1308Error() 解析的时间 = %v, 期望 = %v", |
| resetTime.Format("2006-01-02 15:04:05"), |
| expectedTime.Format("2006-01-02 15:04:05")) |
| } |
| } |
| }) |
| } |
| } |
|
|
| |
| func TestParseResetTimeFrom1308Error_Timezone(t *testing.T) { |
| responseBody := `{"type":"error","error":{"type":"1308","message":"您的限额将在 2025-12-09 18:08:11 重置。"},"request_id":"xxx"}` |
|
|
| resetTime, ok := ParseResetTimeFrom1308Error([]byte(responseBody)) |
| if !ok { |
| t.Fatal("解析失败") |
| } |
|
|
| |
| if resetTime.Location() != time.Local { |
| t.Errorf("时区不是Local: %v", resetTime.Location()) |
| } |
| } |
|
|
| |
| func TestParseResetTimeFrom1308Error_MultipleOccurrences(t *testing.T) { |
| responseBody := `{"type":"error","error":{"type":"1308","message":"您之前将在某时,现在的限额将在 2025-12-09 18:08:11 重置。"},"request_id":"xxx"}` |
|
|
| resetTime, ok := ParseResetTimeFrom1308Error([]byte(responseBody)) |
| if !ok { |
| t.Fatal("解析失败") |
| } |
|
|
| |
| expectedTime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2025-12-09 18:08:11", time.Local) |
| if !resetTime.Equal(expectedTime) { |
| t.Errorf("时间匹配错误: got %v, want %v", resetTime, expectedTime) |
| } |
| } |
|
|