1import datetime as dt2import random34import polars as pl5import pytest67from tests.conftest import live8from wp39.api_client import FinDataClient, _redact91011def test_redaction():12 assert "fd_abc.def" not in _redact("token fd_abc.def leaked")131415@live16def test_schema_and_datasets():17 c = FinDataClient()18 s = c.schema_bars()19 assert s["timestamp_convention"] == "bar_open" and s["schema_version"] == 120 ids = {d["id"] for d in c.datasets()}21 assert {"market_bars.stock.1m.raw", "market_bars.etf.1m.raw"} <= ids222324@live25def test_asof_equivalence():26 """Local filter available_at <= as_of on the full extract == API as_of result (metric, period) set."""27 c = FinDataClient()28 full = pl.DataFrame(c.fundamentals("frd:MSFT", period_type="q", limit=20000)["data"])29 full = full.with_columns(pl.col("available_at").str.to_datetime(time_zone="UTC", strict=False))30 for as_of in ("2016-03-01T00:00:00Z", "2019-11-15T00:00:00Z", "2023-08-01T00:00:00Z"):31 api = pl.DataFrame(c.fundamentals("frd:MSFT", as_of=as_of, period_type="q", limit=20000)["data"])32 local = full.filter(pl.col("available_at") <= pl.lit(as_of).str.to_datetime(time_zone="UTC"))33 a = set(zip(api["metric"], api["fiscal_period_end"])); b = set(zip(local["metric"], local["fiscal_period_end"]))34 assert a == b, (as_of, len(a), len(b))353637@live38def test_bars_limits_are_enforced():39 from wp39.api_client import FinDataError40 c = FinDataClient()41 with pytest.raises(FinDataError):42 c.get("/market/bars", symbol="AAPL", interval="1m", start="2024-01-01", end="2024-03-15", limit=10)43