test: harden reconcile warning alarm coverage and daemon wiring assertion
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com>
This commit is contained in:
co-authored by
genichin
parent
a9e88f9770
commit
5dd3d57f86
@@ -3,6 +3,8 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from trex_core.application.broker_port import BalanceItem
|
from trex_core.application.broker_port import BalanceItem
|
||||||
from trex_core.application.intents import BuyIntent, IntentService, SellIntent
|
from trex_core.application.intents import BuyIntent, IntentService, SellIntent
|
||||||
from trex_core.application.messaging import RpcRequest
|
from trex_core.application.messaging import RpcRequest
|
||||||
@@ -488,11 +490,8 @@ def test_reconcile_warned_alarm_finalize_failure_and_publish_failure_are_isolate
|
|||||||
warn_store=warn_store,
|
warn_store=warn_store,
|
||||||
alarm_emitter=alarms,
|
alarm_emitter=alarms,
|
||||||
)
|
)
|
||||||
try:
|
with pytest.raises(RuntimeError, match="finalize failed"):
|
||||||
failing_finalize.submit_buy(BuyIntent(intent_id="b-finalize-fail", slot_id=slot.slot_id))
|
failing_finalize.submit_buy(BuyIntent(intent_id="b-finalize-fail", slot_id=slot.slot_id))
|
||||||
assert False, "expected finalize failure"
|
|
||||||
except RuntimeError:
|
|
||||||
pass
|
|
||||||
assert alarms.calls == []
|
assert alarms.calls == []
|
||||||
|
|
||||||
soft_fail_alarm = RecordingAlarmEmitter(return_value=False)
|
soft_fail_alarm = RecordingAlarmEmitter(return_value=False)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ daemon wiring was never run until the REL-004 live smoke timed out every buy.
|
|||||||
"""
|
"""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import ast
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from trex_core.application.portfolio import PortfolioItem, SnapshotStore
|
from trex_core.application.portfolio import PortfolioItem, SnapshotStore
|
||||||
@@ -46,5 +47,29 @@ def test_daemon_wires_shared_alarm_emitter_into_intent_service():
|
|||||||
/ "runtime"
|
/ "runtime"
|
||||||
/ "daemon.py"
|
/ "daemon.py"
|
||||||
).read_text(encoding="utf-8")
|
).read_text(encoding="utf-8")
|
||||||
assert "self.intent_service = IntentService(" in src
|
tree = ast.parse(src)
|
||||||
assert "alarm_emitter=self.alarm_emitter" in src
|
found = False
|
||||||
|
for node in ast.walk(tree):
|
||||||
|
if not isinstance(node, ast.Assign):
|
||||||
|
continue
|
||||||
|
if not any(isinstance(t, ast.Attribute) and t.attr == "intent_service" for t in node.targets):
|
||||||
|
continue
|
||||||
|
call = node.value
|
||||||
|
if not (
|
||||||
|
isinstance(call, ast.Call)
|
||||||
|
and isinstance(call.func, ast.Name)
|
||||||
|
and call.func.id == "IntentService"
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
for kw in call.keywords:
|
||||||
|
if kw.arg != "alarm_emitter":
|
||||||
|
continue
|
||||||
|
if (
|
||||||
|
isinstance(kw.value, ast.Attribute)
|
||||||
|
and kw.value.attr == "alarm_emitter"
|
||||||
|
and isinstance(kw.value.value, ast.Name)
|
||||||
|
and kw.value.value.id == "self"
|
||||||
|
):
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
assert found, "Daemon must pass self.alarm_emitter into IntentService(alarm_emitter=...)"
|
||||||
|
|||||||
Reference in New Issue
Block a user