Files
fxhnt/tests/integration/test_forward_ingest.py
jgrusewski 76a7cb721d feat(cockpit): forward ingest ETL (registry-driven, best-effort)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 11:34:24 +02:00

52 lines
2.1 KiB
Python

"""Ingest walks the registry, reads each present state file, computes the gate, and upserts rows + summary.
A missing or malformed state file is skipped (logged), never aborts the batch."""
from __future__ import annotations
import datetime as dt
import json
from fxhnt.adapters.persistence.forward_nav import ForwardNavRepo
from fxhnt.application.forward_ingest import ForwardIngestService
def _setup(tmp_path):
(tmp_path / "fxhnt_combined_forward.json").write_text(json.dumps({
"inception": "2026-06-04", "last_date": "2026-06-06", "nav": 1.0201,
"days": [{"date": "2026-06-05", "ret": 0.01, "nav": 1.01},
{"date": "2026-06-06", "ret": 0.0099, "nav": 1.0201}],
}))
(tmp_path / "multistrat_state.json").write_text(json.dumps({
"last_date": "2026-06-12", "days": 5, "sum_r": -0.0007, "sumsq_r": 1.88e-05,
"equity": 0.99926, "peak": 1.0014, "max_dd": -0.0046,
}))
repo = ForwardNavRepo("sqlite://")
repo.migrate()
return repo
def test_ingest_populates_summaries_and_rows(tmp_path) -> None:
repo = _setup(tmp_path)
svc = ForwardIngestService(repo, str(tmp_path))
n = svc.ingest(at=dt.datetime(2026, 6, 14, 23, 30))
assert n == 2 # two present trackers ingested
summaries = {r.strategy_id: r for r in repo.all_summaries()}
assert "combined" in summaries and "multistrat" in summaries
assert summaries["combined"].gate_status == "WAIT" # 2 < 20 days
assert len(repo.nav_history("combined")) == 2
def test_ingest_skips_missing_files(tmp_path) -> None:
repo = _setup(tmp_path)
(tmp_path / "multistrat_state.json").unlink() # now only combined present
svc = ForwardIngestService(repo, str(tmp_path))
n = svc.ingest(at=dt.datetime(2026, 6, 14, 23, 30))
assert n == 1
def test_ingest_skips_malformed_file(tmp_path) -> None:
repo = _setup(tmp_path)
(tmp_path / "multistrat_state.json").write_text("{ not json")
svc = ForwardIngestService(repo, str(tmp_path))
n = svc.ingest(at=dt.datetime(2026, 6, 14, 23, 30)) # malformed skipped, combined still ingested
assert n == 1