fix(broker): cap outage backoff overflow and expand worker matrix coverage
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com>
This commit is contained in:
co-authored by
genichin
parent
5eef76d59e
commit
8b3e7ac753
@@ -7,6 +7,8 @@ from __future__ import annotations
|
||||
|
||||
from datetime import UTC, datetime, timedelta
|
||||
|
||||
import pytest
|
||||
|
||||
from trex_core.adapters.broker.paper import PaperBroker
|
||||
from trex_core.adapters.persistence.in_memory_intent_store import InMemoryIntentStore
|
||||
from trex_core.application.account_snapshot import AccountSnapshotUnavailable
|
||||
@@ -303,6 +305,70 @@ def test_pending_sell_health_preserves_non_transient_snapshot_failure_code():
|
||||
assert health["failure_code"] == "authentication_failed"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"error_code",
|
||||
[
|
||||
"timeout",
|
||||
"http_5xx",
|
||||
"authentication_failed",
|
||||
"token_issuance_failed",
|
||||
"malformed_response",
|
||||
],
|
||||
ids=["timeout", "http_5xx", "auth", "token", "pagination_middle_malformed"],
|
||||
)
|
||||
def test_execution_wrapper_classification_fail_closed_matrix(error_code):
|
||||
broker = PaperBroker(fill_after_polls=0)
|
||||
repo, svc, intents, _ = _wire(broker)
|
||||
sid = _buy(intents, qty=3).slot_id
|
||||
ExecutionService(svc, repo, broker, instance_key=INST).run_once()
|
||||
svc.sell(sid, actor="t", reason="full")
|
||||
|
||||
calls = {"n": 0}
|
||||
|
||||
def fail_reader():
|
||||
calls["n"] += 1
|
||||
raise AccountSnapshotUnavailable("live_read_failed", detail_code=error_code)
|
||||
|
||||
execution = ExecutionService(
|
||||
svc,
|
||||
repo,
|
||||
broker,
|
||||
instance_key=INST,
|
||||
balance_reader=fail_reader,
|
||||
)
|
||||
result = execution.run_once()
|
||||
assert result.dispatched == 0
|
||||
assert result.sell_skipped_no_balance == 1
|
||||
assert calls["n"] == 1
|
||||
health = execution.balance_worker_health(stale_after_sec=600)
|
||||
assert health["state"] == "unavailable"
|
||||
assert health["consecutive_failures"] == 1
|
||||
assert health["failure_code"] == error_code
|
||||
|
||||
|
||||
def test_execution_wrapper_treats_validated_empty_success_as_success_not_failure():
|
||||
broker = PaperBroker(fill_after_polls=0)
|
||||
repo, svc, intents, _ = _wire(broker)
|
||||
sid = _buy(intents, qty=3).slot_id
|
||||
ExecutionService(svc, repo, broker, instance_key=INST).run_once()
|
||||
svc.sell(sid, actor="t", reason="full")
|
||||
|
||||
execution = ExecutionService(
|
||||
svc,
|
||||
repo,
|
||||
broker,
|
||||
instance_key=INST,
|
||||
balance_reader=lambda: [],
|
||||
)
|
||||
result = execution.run_once()
|
||||
assert result.dispatched == 0
|
||||
assert result.sell_skipped_no_balance == 1 # broker flat is valid success
|
||||
health = execution.balance_worker_health(stale_after_sec=600)
|
||||
assert health["state"] == "ok"
|
||||
assert health["consecutive_failures"] == 0
|
||||
assert health["failure_code"] is None
|
||||
|
||||
|
||||
def test_partial_sell_qty_is_min_intent_broker():
|
||||
"""dcy-021/REQ-062 (D4): partial sell dispatches min(intent qty, broker);
|
||||
remainder stays holding (broker-authoritative qty), cost basis preserved."""
|
||||
|
||||
Reference in New Issue
Block a user