Files
routstr-core/tests/unit
redshift 71c8ae3c84 fix(billing): recognize cached tokens in OpenAI Responses API usage
The Responses API reports usage in its own dialect:
  input_tokens: 9434                       (inclusive grand total)
  input_tokens_details.cached_tokens: 8704 (cached subset)

normalize_usage only knew prompt_tokens_details (chat completions),
Anthropic top-level fields, and DeepSeek hit/miss. For /v1/responses
payloads it found no cache fields and, seeing no prompt_tokens key,
fell into the Anthropic-native branch that treats input_tokens as
excluding cache — so cached tokens were billed at the full input rate
and cache_read_input_tokens was recorded as 0.

Two changes:

* _extract_cache_tokens also reads input_tokens_details.cached_tokens
  and input_tokens_details.cache_write_tokens.
* normalize_usage treats input_tokens as an inclusive grand total when
  input_tokens_details is present (Anthropic native never sends that
  object, so it safely disambiguates the field-name collision).

Fixes both streaming and non-streaming /v1/responses billing, which
share calculate_cost -> normalize_usage.
2026-09-21 17:09:16 +03:00
..
2025-08-03 20:35:59 -03:00
2025-08-09 14:55:26 -03:00
2026-09-04 01:35:43 +02:00
2026-06-13 23:40:39 +02:00
2026-09-07 00:30:05 +02:00
2026-08-03 23:32:06 +02:00
2026-08-06 22:58:44 +02:00
2026-08-03 00:05:36 +02:00
2026-09-07 00:30:05 +02:00
2026-07-01 17:08:28 +02:00
2026-07-01 16:53:52 +02:00
2026-05-14 15:40:49 +02:00
2026-09-16 13:15:32 +02:00
2026-07-29 22:50:33 +02:00
2026-08-14 21:48:29 +02:00
2026-09-04 01:35:43 +02:00
2026-07-22 23:10:27 +02:00
2026-07-22 23:10:27 +02:00

FastAPI Async Unit Tests

This directory contains async unit tests for the Routstr proxy FastAPI application.

Installation

First, ensure you have the development dependencies installed:

uv pip install -e ".[dev]"

Running Tests

To run all tests:

pytest

To run tests with coverage:

pytest --cov=routstr --cov-report=html

To run specific test files:

pytest tests/test_main.py
pytest tests/test_models.py
pytest tests/test_proxy.py

To run only async tests:

pytest -m asyncio

Test Structure

  • conftest.py - Pytest fixtures and configuration
  • test_main.py - Tests for main app endpoints
  • test_account.py - Tests for wallet/account management endpoints
  • test_proxy.py - Tests for the proxy functionality with mocked upstream
  • test_models.py - Tests for model pricing and data structures

Key Fixtures

  • async_client - Async HTTP client for testing FastAPI endpoints
  • test_session - In-memory SQLite database session for tests
  • test_api_key - Pre-configured API key with balance
  • api_key_with_balance - API key with sufficient balance for proxy tests

Environment Variables

The tests automatically set up required environment variables in conftest.py. No manual configuration needed.

Writing New Tests

  1. Use @pytest.mark.asyncio for async tests
  2. Use the provided fixtures for database and client access
  3. Mock external dependencies (like upstream API calls)
  4. Test both success and error cases
  5. Verify database state changes when applicable