"""Performance smoke check — 10 000 bars of one contract (and of a continuous series) under 300 ms (p95 target).""" from __future__ import annotations import time from datetime import date import pytest BUDGET_MS = 300 @pytest.fixture def warm(client_hu, app): from futures.backfill import run_backfill run_backfill(today=date(2025, 7, 1)) client_hu.get("/v1/futures/contract/ESU25/bars?interval=1m&limit=10") # warm DuckDB / caches client_hu.get("/v1/futures/ES/continuous?interval=1m&from=2025-05-01&limit=10") return True def _timed(client_hu, url: str, runs: int = 5) -> float: best = float("inf") for _ in range(runs): t = time.perf_counter() r = client_hu.get(url) best = min(best, (time.perf_counter() - t) * 1000) assert r.status_code == 200 and r.headers["X-Row-Count"] == "10000" return best @pytest.mark.slow def test_contract_10k_bars_under_budget(client_hu, warm): ms = _timed(client_hu, "/v1/futures/contract/ESU25/bars?interval=1m&limit=10000") assert ms < BUDGET_MS, f"10 000 contract bars took {ms:.0f} ms" @pytest.mark.slow def test_continuous_10k_bars_under_budget(client_hu, warm): ms = _timed(client_hu, "/v1/futures/ES/continuous?interval=1m&from=2025-05-01&limit=10000") assert ms < BUDGET_MS, f"10 000 continuous bars took {ms:.0f} ms" @pytest.mark.slow def test_parquet_10k_under_budget(client_hu, warm): ms = _timed(client_hu, "/v1/futures/contract/ESU25/bars?interval=1m&limit=10000&format=parquet") assert ms < BUDGET_MS, f"10 000 parquet bars took {ms:.0f} ms"