Files
ai-exchange/tests/unit/test_research_council_runtime_integration.py
2026-05-18 14:11:06 +08:00

59 lines
2.6 KiB
Python

import unittest
from unittest.mock import patch
from src.services.runtime import TradingRuntimeScheduler
from tests.unit.test_trading_runtime_service import (
FakeAlertDispatcherService,
FakeBrokerReadModelService,
FakeDecisionPacketService,
FakeMarketStateService,
FakeReconciliationService,
FakeResearchCouncilService,
FakeShadowPaperSampleService,
FakeSetupWatcherService,
FakeTradingPlanService,
)
class ResearchCouncilRuntimeIntegrationTests(unittest.TestCase):
def _build_scheduler(self, research_council_service):
return TradingRuntimeScheduler(
market_state_service=FakeMarketStateService(),
trading_plan_service=FakeTradingPlanService(),
setup_watcher_service=FakeSetupWatcherService(),
broker_read_model_service=FakeBrokerReadModelService(),
reconciliation_service=FakeReconciliationService(),
decision_packet_service=FakeDecisionPacketService(),
alert_dispatcher_service=FakeAlertDispatcherService(),
research_council_service=research_council_service,
shadow_paper_sample_service=FakeShadowPaperSampleService(),
)
def test_council_task_runs_after_watch_before_decision_packet(self) -> None:
council_service = FakeResearchCouncilService()
scheduler = self._build_scheduler(council_service)
with patch("src.services.runtime.trading_runtime_service.settings.trading_runtime_symbols", "BTC-USDT"):
payload = scheduler.run_cycle()
self.assertEqual(payload["tasks"]["watch"]["last_status"], "ok")
self.assertEqual(payload["tasks"]["research_council"]["last_status"], "ok")
self.assertEqual(payload["tasks"]["research_council"]["details"]["run_id"], 601)
self.assertEqual(payload["tasks"]["decision_packet"]["last_status"], "ok")
self.assertEqual(council_service.calls[0]["timeframe"], scheduler.trigger_tf)
def test_council_failure_degrades_without_blocking_decision_packet(self) -> None:
scheduler = self._build_scheduler(FakeResearchCouncilService(should_fail=True))
with patch("src.services.runtime.trading_runtime_service.settings.trading_runtime_symbols", "BTC-USDT"):
payload = scheduler.run_cycle()
self.assertEqual(payload["tasks"]["research_council"]["last_status"], "error")
self.assertEqual(payload["tasks"]["decision_packet"]["last_status"], "ok")
self.assertIn("research_council_task_failed:BTC-USDT", payload["current_warnings"])
self.assertNotIn("research_council_task_failed:BTC-USDT", payload["current_blockers"])
if __name__ == "__main__":
unittest.main()