fix: preserve sell event routing owner
This commit is contained in:
@@ -65,7 +65,7 @@ class ProgrammableBroker:
|
||||
return None
|
||||
|
||||
|
||||
def _wire(broker, *, stale_sec=None):
|
||||
def _wire(broker, *, stale_sec=None, event_emitter=None):
|
||||
repo = InMemorySlotRepository()
|
||||
svc = SlotService(repo)
|
||||
intents = IntentService(svc, repo, InMemoryIntentStore(),
|
||||
@@ -74,7 +74,7 @@ def _wire(broker, *, stale_sec=None):
|
||||
ledger = InMemoryLedger()
|
||||
execution = ExecutionService(
|
||||
svc, repo, broker, ledger_outbox=outbox,
|
||||
stale_pending_threshold_sec=stale_sec,
|
||||
stale_pending_threshold_sec=stale_sec, event_emitter=event_emitter,
|
||||
)
|
||||
writer = LedgerWriter(outbox, ledger)
|
||||
repo.reconcile_universe("default", {"PF-1": "SYM"})
|
||||
@@ -104,6 +104,64 @@ def test_full_external_cancel_returns_slot_to_holding():
|
||||
assert r.rolled_back == 1
|
||||
|
||||
|
||||
def test_zero_fill_cancel_preserves_owner_for_ownerless_resell():
|
||||
broker = ProgrammableBroker()
|
||||
repo, _svc, intents, execution, _ledger, _writer = _wire(broker)
|
||||
sid = _buy_to_holding(intents, execution)
|
||||
assert sid is not None
|
||||
|
||||
intents.submit_sell(SellIntent(
|
||||
intent_id="s-owner-1", slot_id=sid, sell_strategy_id="SELL-B",
|
||||
))
|
||||
broker.responder = lambda side: FillStatus(state="cancelled")
|
||||
execution.run_once()
|
||||
|
||||
holding = repo.fetch_slot(sid)
|
||||
assert holding is not None
|
||||
assert holding.status is SlotState.HOLDING
|
||||
assert holding.sell_strategy_id == "SELL-B"
|
||||
|
||||
intents.submit_sell(SellIntent(intent_id="s-owner-2", slot_id=sid))
|
||||
pending = repo.fetch_slot(sid)
|
||||
assert pending is not None
|
||||
assert pending.status is SlotState.PENDING_SELL
|
||||
assert pending.sell_strategy_id == "SELL-B"
|
||||
|
||||
|
||||
|
||||
def test_partial_sell_cancel_routes_with_sell_owner_and_preserves_it():
|
||||
emitted: list[tuple[str, str | None]] = []
|
||||
|
||||
def emitter(event_type, _slot, owner=None):
|
||||
emitted.append((event_type, owner))
|
||||
|
||||
broker = ProgrammableBroker()
|
||||
repo, _svc, intents, execution, _ledger, _writer = _wire(
|
||||
broker, event_emitter=emitter,
|
||||
)
|
||||
sid = _buy_to_holding(intents, execution)
|
||||
assert sid is not None
|
||||
intents.submit_sell(SellIntent(
|
||||
intent_id="s-partial-owner", slot_id=sid, sell_strategy_id="SELL-B",
|
||||
))
|
||||
broker.balance["005930"] = 6
|
||||
broker.responder = lambda side: FillStatus(
|
||||
state="partially_filled",
|
||||
filled_qty=4,
|
||||
avg_price=1100.0,
|
||||
execution_id="exec-partial-owner",
|
||||
cancelled=True,
|
||||
)
|
||||
|
||||
execution.run_once()
|
||||
|
||||
holding = repo.fetch_slot(sid)
|
||||
assert holding is not None
|
||||
assert holding.status is SlotState.HOLDING
|
||||
assert holding.sell_strategy_id == "SELL-B"
|
||||
assert ("slot_filled_sell", "SELL-B") in emitted
|
||||
|
||||
|
||||
def test_unresolved_poll_observability_is_sanitized_and_deduplicated(caplog):
|
||||
broker = ProgrammableBroker()
|
||||
repo, _svc, intents, execution, _ledger, _writer = _wire(broker)
|
||||
|
||||
Reference in New Issue
Block a user