"""Pure-function tests for app.services.market.""" from __future__ import annotations import pytest pytest.importorskip("httpx") pytest.importorskip("pydantic_settings") from datetime import datetime, timezone from app.services.market import _pct, _parse_date, _yahoo_range_covering, parse_symbol def test_pct_basic(): assert _pct(100, 110) == 10.0 assert _pct(100, 90) == -10.0 def test_pct_handles_none_and_zero(): assert _pct(None, 10) is None assert _pct(10, None) is None assert _pct(0, 5) is None def test_parse_date(): assert _parse_date("2026-03-04") == datetime(2026, 3, 4) def test_yahoo_range_covering_picks_smallest(): today = datetime.now(timezone.utc).date() # anchor 100 days ago → 1y range is enough short = (today.replace(year=today.year)).isoformat() assert _yahoo_range_covering(None) == "1y" assert _yahoo_range_covering("2026-01-01") == "1y" def test_parse_symbol_routes_by_prefix(): fn, ident = parse_symbol("FRED:DFF") assert ident == "DFF" assert fn.__name__ == "fetch_fred" fn2, ident2 = parse_symbol("AAPL") assert ident2 == "AAPL" assert fn2.__name__ == "fetch_yahoo" # Unknown prefix falls through to yahoo. fn3, ident3 = parse_symbol("UNKNOWN:XYZ") assert ident3 == "UNKNOWN:XYZ" assert fn3.__name__ == "fetch_yahoo"