(t *testing.T)
| 267 | } |
| 268 | |
| 269 | func TestRecordTokenUsage(t *testing.T) { |
| 270 | t.Parallel() |
| 271 | |
| 272 | id := uuid.MustParse("22222222-2222-2222-2222-222222222222") |
| 273 | |
| 274 | tests := []struct { |
| 275 | name string |
| 276 | response *oairesponses.Response |
| 277 | expected *recorder.TokenUsageRecord |
| 278 | }{ |
| 279 | { |
| 280 | name: "nil_response", |
| 281 | response: nil, |
| 282 | expected: nil, |
| 283 | }, |
| 284 | { |
| 285 | name: "with_all_token_details", |
| 286 | response: &oairesponses.Response{ |
| 287 | ID: "resp_full", |
| 288 | Usage: oairesponses.ResponseUsage{ |
| 289 | InputTokens: 10, |
| 290 | OutputTokens: 20, |
| 291 | TotalTokens: 30, |
| 292 | InputTokensDetails: oairesponses.ResponseUsageInputTokensDetails{ |
| 293 | CachedTokens: 5, |
| 294 | }, |
| 295 | OutputTokensDetails: oairesponses.ResponseUsageOutputTokensDetails{ |
| 296 | ReasoningTokens: 5, |
| 297 | }, |
| 298 | }, |
| 299 | }, |
| 300 | expected: &recorder.TokenUsageRecord{ |
| 301 | InterceptionID: id.String(), |
| 302 | MsgID: "resp_full", |
| 303 | Input: 5, // 10 input - 5 cached |
| 304 | Output: 20, |
| 305 | CacheReadInputTokens: 5, |
| 306 | ExtraTokenTypes: map[string]int64{ |
| 307 | "input_cached": 5, |
| 308 | "output_reasoning": 5, |
| 309 | "total_tokens": 30, |
| 310 | }, |
| 311 | }, |
| 312 | }, |
| 313 | } |
| 314 | |
| 315 | for _, tc := range tests { |
| 316 | t.Run(tc.name, func(t *testing.T) { |
| 317 | t.Parallel() |
| 318 | |
| 319 | rec := &testutil.MockRecorder{} |
| 320 | base := &responsesInterceptionBase{ |
| 321 | id: id, |
| 322 | recorder: rec, |
| 323 | logger: slog.Make(), |
| 324 | } |
| 325 | |
| 326 | base.recordTokenUsage(t.Context(), tc.response) |
nothing calls this directly
no test coverage detected