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
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
|