from dataclasses import dataclass import pytest from agnext.application import SingleThreadedAgentRuntime from agnext.components._type_subscription import TypeSubscription from agnext.core import AgentRuntime, AgentId from agnext.components import ClosureAgent import asyncio from agnext.core import MessageContext from agnext.core import TopicId @dataclass class Message: content: str @pytest.mark.asyncio async def test_register_receives_publish() -> None: runtime = SingleThreadedAgentRuntime() queue = asyncio.Queue[tuple[str, str]]() async def log_message(_runtime: AgentRuntime, id: AgentId, message: Message, ctx: MessageContext) -> None: key = id.key await queue.put((key, message.content)) await runtime.register("name", lambda: ClosureAgent("my_agent", log_message)) await runtime.add_subscription(TypeSubscription("default", "name")) topic_id = TopicId("default", "default") runtime.start() await runtime.publish_message(Message("first message"), topic_id=topic_id) await runtime.publish_message(Message("second message"), topic_id=topic_id) await runtime.publish_message(Message("third message"), topic_id=topic_id) await runtime.stop_when_idle() assert queue.qsize() == 3 assert queue.get_nowait() == ("default", "first message") assert queue.get_nowait() == ("default", "second message") assert queue.get_nowait() == ("default", "third message") assert queue.empty()