mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-06-13 09:37:53 +02:00
83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
"""Sprint 4 — InfonetOracleAdapter end-to-end smoke."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from services.infonet.adapters.oracle_adapter import InfonetOracleAdapter
|
|
from services.infonet.markets import MarketStatus
|
|
from services.infonet.tests._chain_factory import make_event
|
|
|
|
|
|
def _create(market_id: str, base_ts: float, trigger: float, seq: int = 1) -> dict:
|
|
return make_event(
|
|
"prediction_create", "creator",
|
|
{"market_id": market_id, "market_type": "objective",
|
|
"question": "?", "trigger_date": trigger, "creation_bond": 3},
|
|
timestamp=base_ts, sequence=seq,
|
|
)
|
|
|
|
|
|
def test_adapter_unknown_market_is_predicting():
|
|
a = InfonetOracleAdapter(lambda: [])
|
|
assert a.market_status("nope", now=100.0) == MarketStatus.PREDICTING
|
|
assert a.find_snapshot("nope") is None
|
|
assert a.collect_evidence("nope") == []
|
|
assert a.excluded_predictor_ids("nope") == set()
|
|
|
|
|
|
def test_adapter_take_snapshot_is_pure():
|
|
chain = [
|
|
_create("m1", base_ts=0.0, trigger=200.0),
|
|
make_event("prediction_place", "alice",
|
|
{"market_id": "m1", "side": "yes", "stake_amount": 10.0,
|
|
"probability_at_bet": 50.0},
|
|
timestamp=10.0, sequence=2),
|
|
]
|
|
a = InfonetOracleAdapter(lambda: chain)
|
|
snap = a.take_snapshot("m1", frozen_at=100.0)
|
|
assert snap["frozen_participant_count"] == 1
|
|
assert snap["frozen_total_stake"] == 10.0
|
|
assert snap["frozen_predictor_ids"] == ["alice"]
|
|
# Calling again returns same answer.
|
|
assert a.take_snapshot("m1", frozen_at=100.0) == snap
|
|
|
|
|
|
def test_adapter_resolve_market_returns_invalid_for_no_evidence():
|
|
chain = [
|
|
_create("m1", base_ts=0.0, trigger=200.0),
|
|
make_event("market_snapshot", "creator",
|
|
{"market_id": "m1", "frozen_participant_count": 0,
|
|
"frozen_total_stake": 0.0, "frozen_predictor_ids": [],
|
|
"frozen_probability_state": {"yes": 0.5, "no": 0.5},
|
|
"frozen_at": 100.0},
|
|
timestamp=100.0, sequence=2),
|
|
]
|
|
a = InfonetOracleAdapter(lambda: chain)
|
|
result = a.resolve_market("m1")
|
|
assert result.outcome == "invalid"
|
|
assert result.reason == "no_evidence"
|
|
|
|
|
|
def test_adapter_callable_chain_provider_invoked_per_call():
|
|
"""No caching — each adapter method re-walks the chain."""
|
|
calls = {"n": 0}
|
|
chain: list[dict] = []
|
|
|
|
def provider():
|
|
calls["n"] += 1
|
|
return list(chain)
|
|
|
|
a = InfonetOracleAdapter(provider)
|
|
a.market_status("m1", now=0.0)
|
|
a.find_snapshot("m1")
|
|
a.collect_evidence("m1")
|
|
assert calls["n"] == 3
|
|
|
|
|
|
def test_adapter_snapshot_event_hash_is_static_helper():
|
|
"""Hash helper is a staticmethod — doesn't need a chain provider."""
|
|
h = InfonetOracleAdapter.snapshot_event_hash(
|
|
{"market_id": "m1", "frozen_at": 100.0},
|
|
market_id="m1", creator_node_id="creator", sequence=1,
|
|
)
|
|
assert isinstance(h, str) and len(h) == 64
|