package usage import ( "context" "testing" "time" coreusage "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/usage" ) func TestRequestStatisticsRecordIncludesLatency(t *testing.T) { stats := NewRequestStatistics() stats.Record(context.Background(), coreusage.Record{ APIKey: "test-key", Model: "gpt-5.4", RequestedAt: time.Date(2026, 3, 20, 12, 0, 0, 0, time.UTC), Latency: 1500 * time.Millisecond, Detail: coreusage.Detail{ InputTokens: 10, OutputTokens: 20, TotalTokens: 30, }, }) snapshot := stats.Snapshot() details := snapshot.APIs["test-key"].Models["gpt-5.4"].Details if len(details) != 1 { t.Fatalf("details len = %d, want 1", len(details)) } if details[0].LatencyMs != 1500 { t.Fatalf("latency_ms = %d, want 1500", details[0].LatencyMs) } } func TestRequestStatisticsMergeSnapshotDedupIgnoresLatency(t *testing.T) { stats := NewRequestStatistics() timestamp := time.Date(2026, 3, 20, 12, 0, 0, 0, time.UTC) first := StatisticsSnapshot{ APIs: map[string]APISnapshot{ "test-key": { Models: map[string]ModelSnapshot{ "gpt-5.4": { Details: []RequestDetail{{ Timestamp: timestamp, LatencyMs: 0, Source: "user@example.com", AuthIndex: "0", Tokens: TokenStats{ InputTokens: 10, OutputTokens: 20, TotalTokens: 30, }, }}, }, }, }, }, } second := StatisticsSnapshot{ APIs: map[string]APISnapshot{ "test-key": { Models: map[string]ModelSnapshot{ "gpt-5.4": { Details: []RequestDetail{{ Timestamp: timestamp, LatencyMs: 2500, Source: "user@example.com", AuthIndex: "0", Tokens: TokenStats{ InputTokens: 10, OutputTokens: 20, TotalTokens: 30, }, }}, }, }, }, }, } result := stats.MergeSnapshot(first) if result.Added != 1 || result.Skipped != 0 { t.Fatalf("first merge = %+v, want added=1 skipped=0", result) } result = stats.MergeSnapshot(second) if result.Added != 0 || result.Skipped != 1 { t.Fatalf("second merge = %+v, want added=0 skipped=1", result) } snapshot := stats.Snapshot() details := snapshot.APIs["test-key"].Models["gpt-5.4"].Details if len(details) != 1 { t.Fatalf("details len = %d, want 1", len(details)) } }