You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.7 KiB
Python

from __future__ import annotations
import datetime as dt
import json
from pathlib import Path
import pyarrow as pa
import pyarrow.parquet as pq
from apps.paper_trader.backtest_sim import _snapshot_has_required_coverage, _snapshot_needs_refresh
def _write_split(path: Path, event_dates: list[str]) -> None:
table = pa.table({"event_date": pa.array(event_dates)})
pq.write_table(table, str(path))
def test_snapshot_refresh_uses_actual_coverage_not_manifest_age(tmp_path: Path) -> None:
snapshot_id = "snapshot-a"
snap_dir = tmp_path / snapshot_id
snap_dir.mkdir(parents=True)
(snap_dir / "manifest.json").write_text(json.dumps({
"snapshot_id": snapshot_id,
"created_at_utc": "2020-01-01T00:00:00+00:00",
}))
_write_split(snap_dir / "train.parquet", ["2025-01-03", "2025-06-30"])
_write_split(snap_dir / "valid.parquet", ["2025-07-01", "2025-09-30"])
_write_split(snap_dir / "test.parquet", ["2025-10-01", "2025-12-31"])
end_date = dt.date(2025, 12, 31)
assert _snapshot_has_required_coverage(snapshot_id, end_date, snapshot_dir=str(tmp_path)) is True
assert _snapshot_needs_refresh(snapshot_id, end_date, snapshot_dir=str(tmp_path)) is False
def test_snapshot_refresh_triggers_when_coverage_is_missing(tmp_path: Path) -> None:
snapshot_id = "snapshot-b"
snap_dir = tmp_path / snapshot_id
snap_dir.mkdir(parents=True)
_write_split(snap_dir / "test.parquet", ["2025-10-01", "2025-12-01"])
end_date = dt.date(2025, 12, 31)
assert _snapshot_has_required_coverage(snapshot_id, end_date, snapshot_dir=str(tmp_path)) is False
assert _snapshot_needs_refresh(snapshot_id, end_date, snapshot_dir=str(tmp_path)) is True