- set_anchor self-guards the single-active-anchor invariant (archive prior active on re-inception) - append_record/record_series validate + normalize ISO-8601 dates (fail loud on malformed) - ordering test now inserts out-of-order; removed dead test imports/vars; clean Session import Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
"""Test forward_record append-only log and book-state persistence."""
|
|
import datetime as dt
|
|
|
|
from fxhnt.adapters.persistence.forward_nav import ForwardNavRepo
|
|
|
|
|
|
def _repo(tmp_path):
|
|
repo = ForwardNavRepo(f"sqlite:///{tmp_path}/rec.db")
|
|
repo.migrate()
|
|
return repo
|
|
|
|
|
|
def test_append_is_idempotent_per_date(tmp_path):
|
|
repo = _repo(tmp_path)
|
|
at = dt.datetime(2026, 7, 8, 23, 30)
|
|
repo.append_record("xsfunding", "2026-07-08", 0.001, at)
|
|
repo.append_record("xsfunding", "2026-07-08", 0.001, at) # same date re-run → no double append
|
|
assert repo.record_series("xsfunding") == [("2026-07-08", 0.001)]
|
|
|
|
|
|
def test_record_series_filters_since(tmp_path):
|
|
repo = _repo(tmp_path)
|
|
at = dt.datetime(2026, 7, 8, 23, 30)
|
|
for d, r in [("2026-07-06", 0.001), ("2026-07-07", 0.002), ("2026-07-08", 0.003)]:
|
|
repo.append_record("xsfunding", d, r, at)
|
|
assert repo.record_series("xsfunding", since="2026-07-07") == [("2026-07-07", 0.002), ("2026-07-08", 0.003)]
|
|
|
|
|
|
def test_record_series_sorts_ascending_regardless_of_insert_order(tmp_path):
|
|
repo = _repo(tmp_path)
|
|
at = dt.datetime(2026, 7, 8, 23, 30)
|
|
# insert OUT of chronological order — a dropped/incorrect order_by must fail this
|
|
for d, r in [("2026-07-08", 0.003), ("2026-07-06", 0.001), ("2026-07-07", 0.002)]:
|
|
repo.append_record("xsfunding", d, r, at)
|
|
assert repo.record_series("xsfunding") == [
|
|
("2026-07-06", 0.001), ("2026-07-07", 0.002), ("2026-07-08", 0.003)]
|
|
|
|
|
|
def test_append_record_rejects_malformed_date(tmp_path):
|
|
import pytest
|
|
repo = _repo(tmp_path)
|
|
with pytest.raises(ValueError):
|
|
repo.append_record("x", "2026-7-8", 0.0, dt.datetime(2026, 7, 8))
|
|
|
|
|
|
def test_book_state_round_trip(tmp_path):
|
|
repo = _repo(tmp_path)
|
|
at = dt.datetime(2026, 7, 8, 23, 30)
|
|
assert repo.get_book_state("xsfunding") == {}
|
|
repo.set_book_state("xsfunding", {"positions": {"BTCUSDT": 0.5}}, at)
|
|
assert repo.get_book_state("xsfunding") == {"positions": {"BTCUSDT": 0.5}}
|