| package usage |
|
|
| import ( |
| "context" |
| "testing" |
| "time" |
|
|
| coreusage "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/usage" |
| ) |
|
|
| func TestRecordStoresRequestIDAndDuration(t *testing.T) { |
| stats := NewRequestStatistics() |
| recordedAt := time.Date(2026, 2, 12, 12, 0, 0, 0, time.UTC) |
|
|
| stats.Record(context.Background(), coreusage.Record{ |
| APIKey: "key-1", |
| Model: "gpt-4-turbo", |
| RequestID: "req-12345", |
| RequestedAt: recordedAt, |
| DurationMs: 245, |
| Failed: false, |
| Detail: coreusage.Detail{ |
| InputTokens: 120, |
| OutputTokens: 80, |
| TotalTokens: 200, |
| }, |
| }) |
|
|
| snapshot := stats.Snapshot() |
| api := snapshot.APIs["key-1"] |
| model := api.Models["gpt-4-turbo"] |
| if len(model.Details) != 1 { |
| t.Fatalf("expected exactly one request detail, got %d", len(model.Details)) |
| } |
|
|
| detail := model.Details[0] |
| if detail.RequestID != "req-12345" { |
| t.Fatalf("expected request_id to be preserved, got %q", detail.RequestID) |
| } |
| if detail.DurationMs != 245 { |
| t.Fatalf("expected duration_ms=245, got %d", detail.DurationMs) |
| } |
| } |
|
|
| func TestRecordNormalizesNegativeDuration(t *testing.T) { |
| stats := NewRequestStatistics() |
|
|
| stats.Record(context.Background(), coreusage.Record{ |
| APIKey: "key-1", |
| Model: "gpt-4-turbo", |
| RequestID: "req-negative", |
| RequestedAt: time.Now(), |
| DurationMs: -99, |
| Detail: coreusage.Detail{ |
| InputTokens: 10, |
| OutputTokens: 20, |
| TotalTokens: 30, |
| }, |
| }) |
|
|
| snapshot := stats.Snapshot() |
| detail := snapshot.APIs["key-1"].Models["gpt-4-turbo"].Details[0] |
| if detail.DurationMs != 0 { |
| t.Fatalf("expected normalized duration_ms=0, got %d", detail.DurationMs) |
| } |
| } |
|
|