diff --git a/tests/runtime/test_cli_operator.py b/tests/runtime/test_cli_operator.py index faeb548..a922f13 100644 --- a/tests/runtime/test_cli_operator.py +++ b/tests/runtime/test_cli_operator.py @@ -441,3 +441,62 @@ def test_verify_no_db_no_live_flag_needed(capsys, monkeypatch): monkeypatch.setattr(cli, "_cmd_verify", _fake_verify) rc = cli.main(["verify"]) assert rc == 0 + + +# --------------------------------------------------------------------------- +# REL-010 regression: _cmd_verify broker import must not raise ImportError +# --------------------------------------------------------------------------- + +def test_verify_cmd_broker_import_does_not_raise(monkeypatch): + """REL-010 regression: _cmd_verify must use _build_broker (not missing + make_broker) so it does not raise ImportError at the broker-build step. + + Patch all DB/network calls so only the import path is exercised. + Paper broker config is used (no real network needed). + """ + from trex_core.runtime.config import DaemonConfig + from trex_core.adapters.broker.paper import PaperBroker + + cfg = DaemonConfig( + dsn="postgresql://x/y", + broker="paper", + execution_interval_sec=1.0, + instance_key="test", + ) + + # Patch at module level — _cmd_verify uses local `from ... import` so we + # must patch the source module, not the cli namespace. + from trex_core.application.portfolio import InMemoryReconcileWarningStore + from trex_core.domain.slot.in_memory_repository import InMemorySlotRepository + import trex_core.adapters.portfolio.reconcile_warning_store as rws_mod + import trex_core.adapters.persistence.postgresql as pg_mod + + monkeypatch.setattr(rws_mod, "PostgreSQLReconcileWarningStore", + lambda dsn: InMemoryReconcileWarningStore()) + monkeypatch.setattr(pg_mod, "PostgreSQLSlotRepository", + lambda dsn: InMemorySlotRepository()) + + # Build args object with no portfolio_id (triggers "no C-warned slots" path). + import argparse + args = argparse.Namespace( + instance=None, + portfolio_id=None, + json=False, + ) + + # Must not raise ImportError — this is the regression guard. + rc = cli._cmd_verify(args, cfg) + + # With no C-warned slots and paper broker the function returns 0. + assert rc == 0 + + +def test_verify_cmd_uses_build_broker_not_make_broker(): + """Structural check: trex_core.adapters.broker has no 'make_broker' symbol. + This ensures the ImportError from REL-010 is permanently absent. + """ + import trex_core.adapters.broker as broker_pkg + assert not hasattr(broker_pkg, "make_broker"), ( + "make_broker must not exist in trex_core.adapters.broker — " + "use _build_broker from trex_core.runtime.daemon instead" + ) diff --git a/trex_core/runtime/cli.py b/trex_core/runtime/cli.py index b37e319..6cc3a1d 100644 --- a/trex_core/runtime/cli.py +++ b/trex_core/runtime/cli.py @@ -582,8 +582,8 @@ def _cmd_verify(args, cfg) -> int: warn_store = PostgreSQLReconcileWarningStore(cfg.dsn) slot_repo = PostgreSQLSlotRepository(cfg.dsn) - from trex_core.adapters.broker import make_broker - broker_port = make_broker(cfg) + from trex_core.runtime.daemon import _build_broker + broker_port = _build_broker(cfg) # Build a minimal snapshot store (we only need asset_quantity for C-case check). # For verify we use a fresh SnapshotStore populated from warn_store metadata.