54 lines
2.7 KiB
Python
54 lines
2.7 KiB
Python
"""REQ-120 CLI failure boundary regression tests."""
|
|
import sys
|
|
import types
|
|
from types import SimpleNamespace
|
|
|
|
# This worktree intentionally lacks pika. CLI imports only messaging topology for
|
|
# these tests; install a minimal import-time stub without contacting a broker.
|
|
_pika = types.ModuleType("pika")
|
|
_pika.__path__ = []
|
|
_pika.URLParameters = lambda *a, **k: None
|
|
_pika.BlockingConnection = object
|
|
_pika.BasicProperties = object
|
|
_pika_exceptions = types.ModuleType("pika.exceptions")
|
|
_pika_exceptions.AMQPError = Exception
|
|
_pika.exceptions = _pika_exceptions
|
|
sys.modules.setdefault("pika", _pika)
|
|
sys.modules.setdefault("pika.exceptions", _pika_exceptions)
|
|
|
|
from trex_core.application.broker_port import BrokerBalanceError # noqa: E402
|
|
from trex_core.runtime import cli # noqa: E402
|
|
from trex_core.runtime.config import DaemonConfig # noqa: E402
|
|
|
|
|
|
def _args(*, as_json=True):
|
|
return SimpleNamespace(portfolio_id="PF-1", all=False, json=as_json, dry_run=True,
|
|
yes=True, live=False, instance=None, config=None, config_path=None)
|
|
|
|
|
|
def test_sync_balance_failure_is_sanitized_and_happens_before_db(monkeypatch, capsys):
|
|
class Provider:
|
|
def get_broker_for_read(self):
|
|
return SimpleNamespace(get_balance=lambda: (_ for _ in ()).throw(BrokerBalanceError("authentication_failed"))), None
|
|
monkeypatch.setattr("trex_core.runtime.broker_provider.build_broker_provider", lambda cfg: Provider())
|
|
# A DB object being constructed would prove the boundary arrived too late.
|
|
monkeypatch.setattr("trex_core.adapters.portfolio.reconcile_warning_store.PostgreSQLReconcileWarningStore",
|
|
lambda *a: (_ for _ in ()).throw(AssertionError("DB touched")))
|
|
assert cli._cmd_sync(_args(), DaemonConfig("dsn", "paper", 1), lambda _: True) == 1
|
|
captured = capsys.readouterr()
|
|
assert '"authentication_failed"' in captured.err
|
|
assert "broker balance unavailable" in captured.err
|
|
|
|
|
|
def test_verify_balance_failure_never_leaks_payload_or_opens_db(monkeypatch, capsys):
|
|
class Provider:
|
|
def get_broker_for_read(self):
|
|
return SimpleNamespace(get_balance=lambda: (_ for _ in ()).throw(BrokerBalanceError("transport_failed"))), None
|
|
monkeypatch.setattr("trex_core.runtime.broker_provider.build_broker_provider", lambda cfg: Provider())
|
|
monkeypatch.setattr("trex_core.adapters.persistence.postgresql.PostgreSQLSlotRepository",
|
|
lambda *a: (_ for _ in ()).throw(AssertionError("DB touched")))
|
|
assert cli._cmd_verify(_args(), DaemonConfig("dsn", "paper", 1)) == 1
|
|
captured = capsys.readouterr()
|
|
assert '"transport_failed"' in captured.err
|
|
assert "payload-secret" not in captured.err
|