11import unittest
2- from unittest .mock import AsyncMock , patch
2+ import unittest .async_case
3+ from unittest .mock import AsyncMock , patch , MagicMock
34import pytest
45from a2a .server .events .event_queue import EventQueue
56from a2a .server .agent_execution import AgentExecutor
1314)
1415from a2a .server .tasks import TaskStore
1516from a2a .types import (
17+ AgentCard ,
18+ AgentCapabilities ,
1619 GetTaskRequest ,
1720 GetTaskResponse ,
1821 GetTaskSuccessResponse ,
2326 TaskIdParams ,
2427 CancelTaskRequest ,
2528 CancelTaskSuccessResponse ,
26- A2AError ,
2729 UnsupportedOperationError ,
2830 SendMessageRequest ,
2931 Message ,
4244)
4345from collections .abc import AsyncGenerator
4446from typing import Any
45- import asyncio
4647
4748MINIMAL_TASK : dict [str , Any ] = {
4849 'id' : 'task_123' ,
5758}
5859
5960
60- @pytest .fixture
61- def mock_event_queue ():
62- return AsyncMock (spec = EventQueue )
63-
61+ class TestJSONRPCtHandler (unittest .async_case .IsolatedAsyncioTestCase ):
62+ @pytest .fixture (autouse = True )
63+ def init_fixtures (self ) -> None :
64+ self .mock_agent_card = MagicMock (
65+ spec = AgentCard , url = 'http://agent.example.com/api'
66+ )
6467
65- class TestJSONRPCtHandler (unittest .IsolatedAsyncioTestCase ):
6668 async def test_on_get_task_success (self ) -> None :
6769 mock_agent_executor = AsyncMock (spec = AgentExecutor )
6870 mock_task_store = AsyncMock (spec = TaskStore )
6971 request_handler = DefaultRequestHandler (
7072 mock_agent_executor , mock_task_store
7173 )
72- handler = JSONRPCHandler (None , request_handler )
74+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
7375 task_id = 'test_task_id'
7476 mock_task = Task (** MINIMAL_TASK )
7577 mock_task_store .get .return_value = mock_task
@@ -85,7 +87,7 @@ async def test_on_get_task_not_found(self) -> None:
8587 request_handler = DefaultRequestHandler (
8688 mock_agent_executor , mock_task_store
8789 )
88- handler = JSONRPCHandler (None , request_handler )
90+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
8991 mock_task_store .get .return_value = None
9092 request = GetTaskRequest (
9193 id = '1' ,
@@ -102,7 +104,7 @@ async def test_on_cancel_task_success(self) -> None:
102104 request_handler = DefaultRequestHandler (
103105 mock_agent_executor , mock_task_store
104106 )
105- handler = JSONRPCHandler (None , request_handler )
107+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
106108 task_id = 'test_task_id'
107109 mock_task = Task (** MINIMAL_TASK )
108110 mock_task_store .get .return_value = mock_task
@@ -128,7 +130,7 @@ async def test_on_cancel_task_not_supported(self) -> None:
128130 request_handler = DefaultRequestHandler (
129131 mock_agent_executor , mock_task_store
130132 )
131- handler = JSONRPCHandler (None , request_handler )
133+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
132134 task_id = 'test_task_id'
133135 mock_task = Task (** MINIMAL_TASK )
134136 mock_task_store .get .return_value = mock_task
@@ -155,7 +157,7 @@ async def test_on_cancel_task_not_found(self) -> None:
155157 request_handler = DefaultRequestHandler (
156158 mock_agent_executor , mock_task_store
157159 )
158- handler = JSONRPCHandler (None , request_handler )
160+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
159161 mock_task_store .get .return_value = None
160162 request = CancelTaskRequest (
161163 id = '1' ,
@@ -174,7 +176,7 @@ async def test_on_message_new_message_success(self) -> None:
174176 request_handler = DefaultRequestHandler (
175177 mock_agent_executor , mock_task_store
176178 )
177- handler = JSONRPCHandler (None , request_handler )
179+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
178180 mock_task = Task (** MINIMAL_TASK )
179181 mock_task_store .get .return_value = mock_task
180182 mock_agent_executor .execute .return_value = None
@@ -204,7 +206,7 @@ async def test_on_message_new_message_with_existing_task_success(
204206 request_handler = DefaultRequestHandler (
205207 mock_agent_executor , mock_task_store
206208 )
207- handler = JSONRPCHandler (None , request_handler )
209+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
208210 mock_task = Task (** MINIMAL_TASK )
209211 mock_task_store .get .return_value = mock_task
210212 mock_agent_executor .execute .return_value = None
@@ -232,15 +234,13 @@ async def streaming_coro():
232234 assert response .root .result == mock_task # type: ignore
233235 mock_agent_executor .execute .assert_called_once ()
234236
235- async def test_on_message_error (
236- self ,
237- ) -> None :
237+ async def test_on_message_error (self ) -> None :
238238 mock_agent_executor = AsyncMock (spec = AgentExecutor )
239239 mock_task_store = AsyncMock (spec = TaskStore )
240240 request_handler = DefaultRequestHandler (
241241 mock_agent_executor , mock_task_store
242242 )
243- handler = JSONRPCHandler (None , request_handler )
243+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
244244 mock_task_store .get .return_value = None
245245 mock_agent_executor .execute .return_value = None
246246
@@ -272,7 +272,9 @@ async def test_on_message_stream_new_message_success(self) -> None:
272272 request_handler = DefaultRequestHandler (
273273 mock_agent_executor , mock_task_store
274274 )
275- handler = JSONRPCHandler (None , request_handler )
275+ self .mock_agent_card .capabilities = AgentCapabilities (streaming = True )
276+
277+ handler = JSONRPCHandler (self .mock_agent_card , request_handler )
276278 events : list [Any ] = [
277279 Task (** MINIMAL_TASK ),
278280 TaskArtifactUpdateEvent (
@@ -325,7 +327,10 @@ async def test_on_message_stream_new_message_existing_task_success(
325327 request_handler = DefaultRequestHandler (
326328 mock_agent_executor , mock_task_store
327329 )
328- handler = JSONRPCHandler (None , request_handler )
330+
331+ self .mock_agent_card .capabilities = AgentCapabilities (streaming = True )
332+
333+ handler = JSONRPCHandler (self .mock_agent_card , request_handler )
329334 mock_task = Task (** MINIMAL_TASK , history = [])
330335 events : list [Any ] = [
331336 mock_task ,
@@ -382,7 +387,8 @@ async def test_on_resubscribe_existing_task_success(
382387 request_handler = DefaultRequestHandler (
383388 mock_agent_executor , mock_task_store , mock_queue_manager
384389 )
385- handler = JSONRPCHandler (None , request_handler )
390+ mock_agent_card = MagicMock (spec = AgentCard )
391+ handler = JSONRPCHandler (self .mock_agent_card , request_handler )
386392 mock_task = Task (** MINIMAL_TASK , history = [])
387393 events : list [Any ] = [
388394 TaskArtifactUpdateEvent (
@@ -421,15 +427,13 @@ async def streaming_coro():
421427 assert len (collected_events ) == len (events )
422428 assert mock_task .history is not None and len (mock_task .history ) == 0
423429
424- async def test_on_resubscribe_no_existing_task_error (
425- self ,
426- ) -> None :
430+ async def test_on_resubscribe_no_existing_task_error (self ) -> None :
427431 mock_agent_executor = AsyncMock (spec = AgentExecutor )
428432 mock_task_store = AsyncMock (spec = TaskStore )
429433 request_handler = DefaultRequestHandler (
430434 mock_agent_executor , mock_task_store
431435 )
432- handler = JSONRPCHandler (None , request_handler )
436+ handler = JSONRPCHandler (self . mock_agent_card , request_handler )
433437 mock_task_store .get .return_value = None
434438 request = TaskResubscriptionRequest (
435439 id = '1' , params = TaskIdParams (id = 'nonexistent_id' )
0 commit comments