Files
routstr-core/tests/unit
Jeroen UbbinkandClaude Opus 5 dbb9df13f2 fix(pricing): keep an unusable rate out of the money math
Prices reach the node from upstream catalogs, an operator's admin edit, a
legacy database row and the BTC/USD feed. json.loads accepts the bare NaN and
Infinity literals and overflows 1e999 to inf, so any of those sources can
deliver a value that is not a price. Three guards let one through:

- The token-rate gate tested truthiness, so NaN and inf reached the token math
  and raised ValueError/OverflowError *after* the response was served. The
  streaming handlers swallow that, so the request went unbilled. A negative
  rate produced a negative charge, which settlement subtracts from the balance.
- An upstream-reported cost component was clamped with max(0.0, ...), which
  passes inf and NaN through. A non-finite component poisoned the proportional
  split in _calculate_from_usd_cost (inf / inf is NaN); the exception was
  absorbed by the broad handler around the USD path, so a request whose total
  was perfectly valid fell through to token estimation and was billed a
  fraction of what the upstream charged. Each spelling is now coerced before
  the fallback chooses between them, so a malformed first field cannot win the
  `or` and hide the usable figure beside it.
- An exchange quote that was zero, negative or non-finite was accepted as the
  node's BTC/USD price, repricing every model on the node.

Each now declines to price rather than billing a nonsensical amount.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 15:42:15 +02:00
..
2025-08-03 20:35:59 -03:00
2025-08-09 14:55:26 -03:00
2026-08-23 23:25:03 +02:00
2026-08-03 23:32:06 +02:00
2026-06-13 23:40:39 +02:00
2026-08-16 14:59:38 +02:00
2026-08-03 23:32:06 +02:00
2026-08-06 22:58:44 +02:00
2026-08-04 00:06:53 +02:00
2026-08-03 00:05:36 +02:00
2026-08-03 23:32:06 +02:00
2026-08-02 23:16:01 +02:00
2026-08-23 13:30:57 +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-07-29 22:50:33 +02:00
2026-08-14 21:48:29 +02:00
2026-07-22 23:10:27 +02:00
2026-07-22 23:10:27 +02:00
2026-08-15 15:09:00 +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