import asyncio import pytest from unittest.mock import AsyncMock, MagicMock from agent_service.agents.peer_bus import PeerBus, PeerResponse class MockAgent: name = 'mock_agent' async def handle_peer_request(self, request: dict) -> dict: return {'answer': 42, 'echo': request.get('data')} class SlowAgent: name = 'slow_agent' async def handle_peer_request(self, request: dict) -> dict: await asyncio.sleep(35) return {} @pytest.mark.asyncio async def test_peer_bus_register_and_call(): bus = PeerBus() bus.register('mock_agent', MockAgent()) resp = await bus.call('mock_agent', {'data': 'hello'}) assert isinstance(resp, PeerResponse) assert resp.available is True assert resp.data.get('answer') == 42 @pytest.mark.asyncio async def test_peer_bus_unknown_agent(): bus = PeerBus() resp = await bus.call('nonexistent_agent', {}) assert resp.available is False @pytest.mark.asyncio async def test_peer_bus_max_depth(): bus = PeerBus() bus.register('mock_agent', MockAgent()) call_chain = ['a', 'b', 'c'] resp = await bus.call('mock_agent', {}, _call_chain=call_chain) assert resp.available is False @pytest.mark.asyncio async def test_peer_bus_timeout(): bus = PeerBus() bus.register('slow_agent', SlowAgent()) resp = await bus.call('slow_agent', {}) assert resp.available is False @pytest.mark.asyncio async def test_peer_bus_circular_detection(): bus = PeerBus() bus.register('mock_agent', MockAgent()) resp = await bus.call('mock_agent', {}, _call_chain=['mock_agent']) assert resp.available is False def test_peer_bus_get_agent(): bus = PeerBus() agent = MockAgent() bus.register('mock_agent', agent) assert bus.get_agent('mock_agent') is agent assert bus.get_agent('missing') is None