"""Snapshot RPC handler tests (REQ-021 AC-2, BAT-007 stub-shape).""" from __future__ import annotations from datetime import date from trex_core.adapters.persistence.in_memory_intent_store import InMemoryIntentStore from trex_core.application.intents import BuyIntent, IntentService from trex_core.application.messaging import RpcRequest from trex_core.application.messaging_handlers import make_snapshot_rpc_handler from trex_core.domain.slot import SlotService from trex_core.domain.slot.in_memory_repository import InMemorySlotRepository DAY = date(2026, 6, 5) def _wire(): repo = InMemorySlotRepository() svc = SlotService(repo) intents = IntentService(svc, repo, InMemoryIntentStore()) svc.preallocate_daily_slots(DAY, 3) return repo, svc, intents def _req(view="all", strategy_id=None): return RpcRequest( payload={ "view": view, "strategy_id": strategy_id, "trading_date": DAY.isoformat(), }, correlation_id="snap-cid", ) def test_snapshot_returns_all_slots_and_capacity(): repo, svc, intents = _wire() intents.submit_buy(BuyIntent( intent_id="b1", trading_date=DAY, symbol="005930", qty=10, strategy_id="A", portfolio_id="PF-1", )) handler = make_snapshot_rpc_handler(repo, svc) resp = handler(_req()) assert resp.payload["trading_date"] == DAY.isoformat() assert resp.payload["view"] == "all" assert len(resp.payload["slots"]) == 3 # all 3 slots returned cap = resp.payload["capacity"] assert cap["pending_count"] == 1 and cap["idle_count"] == 2 def test_snapshot_open_view_filters_to_active_slots(): repo, svc, intents = _wire() intents.submit_buy(BuyIntent( intent_id="b1", trading_date=DAY, symbol="005930", qty=10, strategy_id="A", portfolio_id="PF-1", )) handler = make_snapshot_rpc_handler(repo, svc) resp = handler(_req(view="open")) statuses = {s["status"] for s in resp.payload["slots"]} assert "idle" not in statuses assert statuses == {"pending_buy"} def test_snapshot_strategy_id_filter(): repo, svc, intents = _wire() intents.submit_buy(BuyIntent( intent_id="b1", trading_date=DAY, symbol="005930", qty=10, strategy_id="A", portfolio_id="PF-1", )) intents.submit_buy(BuyIntent( intent_id="b2", trading_date=DAY, symbol="000660", qty=5, strategy_id="B", portfolio_id="PF-2", )) handler = make_snapshot_rpc_handler(repo, svc) resp = handler(_req(view="open", strategy_id="A")) assert len(resp.payload["slots"]) == 1 assert resp.payload["slots"][0]["strategy_id"] == "A" assert resp.payload["slots"][0]["symbol"] == "005930"