Skip to content

Commit 3b09ac0

Browse files
test: adding 13 tests for server/tasks/task_updater.py (#18)
1 parent 53a5861 commit 3b09ac0

File tree

1 file changed

+234
-0
lines changed

1 file changed

+234
-0
lines changed
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
import uuid
2+
3+
from unittest.mock import Mock, patch
4+
5+
import pytest
6+
7+
from a2a.server.events import EventQueue
8+
from a2a.server.tasks import TaskUpdater
9+
from a2a.types import (
10+
Message,
11+
Part,
12+
Role,
13+
TaskArtifactUpdateEvent,
14+
TaskState,
15+
TaskStatusUpdateEvent,
16+
TextPart,
17+
)
18+
19+
20+
class TestTaskUpdater:
21+
@pytest.fixture
22+
def event_queue(self):
23+
"""Create a mock event queue for testing."""
24+
return Mock(spec=EventQueue)
25+
26+
@pytest.fixture
27+
def task_updater(self, event_queue):
28+
"""Create a TaskUpdater instance for testing."""
29+
return TaskUpdater(
30+
event_queue=event_queue,
31+
task_id='test-task-id',
32+
context_id='test-context-id',
33+
)
34+
35+
@pytest.fixture
36+
def sample_message(self):
37+
"""Create a sample message for testing."""
38+
return Message(
39+
role=Role.agent,
40+
taskId='test-task-id',
41+
contextId='test-context-id',
42+
messageId='test-message-id',
43+
parts=[Part(root=TextPart(text='Test message'))],
44+
)
45+
46+
@pytest.fixture
47+
def sample_parts(self):
48+
"""Create sample parts for testing."""
49+
return [Part(root=TextPart(text='Test part'))]
50+
51+
def test_init(self, event_queue):
52+
"""Test that TaskUpdater initializes correctly."""
53+
task_updater = TaskUpdater(
54+
event_queue=event_queue,
55+
task_id='test-task-id',
56+
context_id='test-context-id',
57+
)
58+
59+
assert task_updater.event_queue == event_queue
60+
assert task_updater.task_id == 'test-task-id'
61+
assert task_updater.context_id == 'test-context-id'
62+
63+
def test_update_status_without_message(self, task_updater, event_queue):
64+
"""Test updating status without a message."""
65+
task_updater.update_status(TaskState.working)
66+
67+
event_queue.enqueue_event.assert_called_once()
68+
event = event_queue.enqueue_event.call_args[0][0]
69+
70+
assert isinstance(event, TaskStatusUpdateEvent)
71+
assert event.taskId == 'test-task-id'
72+
assert event.contextId == 'test-context-id'
73+
assert event.final is False
74+
assert event.status.state == TaskState.working
75+
assert event.status.message is None
76+
77+
def test_update_status_with_message(
78+
self, task_updater, event_queue, sample_message
79+
):
80+
"""Test updating status with a message."""
81+
task_updater.update_status(TaskState.working, message=sample_message)
82+
83+
event_queue.enqueue_event.assert_called_once()
84+
event = event_queue.enqueue_event.call_args[0][0]
85+
86+
assert isinstance(event, TaskStatusUpdateEvent)
87+
assert event.taskId == 'test-task-id'
88+
assert event.contextId == 'test-context-id'
89+
assert event.final is False
90+
assert event.status.state == TaskState.working
91+
assert event.status.message == sample_message
92+
93+
def test_update_status_final(self, task_updater, event_queue):
94+
"""Test updating status with final=True."""
95+
task_updater.update_status(TaskState.completed, final=True)
96+
97+
event_queue.enqueue_event.assert_called_once()
98+
event = event_queue.enqueue_event.call_args[0][0]
99+
100+
assert isinstance(event, TaskStatusUpdateEvent)
101+
assert event.final is True
102+
assert event.status.state == TaskState.completed
103+
104+
def test_add_artifact_with_custom_id_and_name(
105+
self, task_updater, event_queue, sample_parts
106+
):
107+
"""Test adding an artifact with a custom ID and name."""
108+
task_updater.add_artifact(
109+
parts=sample_parts,
110+
artifact_id='custom-artifact-id',
111+
name='Custom Artifact',
112+
)
113+
114+
event_queue.enqueue_event.assert_called_once()
115+
event = event_queue.enqueue_event.call_args[0][0]
116+
117+
assert isinstance(event, TaskArtifactUpdateEvent)
118+
assert event.artifact.artifactId == 'custom-artifact-id'
119+
assert event.artifact.name == 'Custom Artifact'
120+
assert event.artifact.parts == sample_parts
121+
122+
def test_complete_without_message(self, task_updater, event_queue):
123+
"""Test marking a task as completed without a message."""
124+
task_updater.complete()
125+
126+
event_queue.enqueue_event.assert_called_once()
127+
event = event_queue.enqueue_event.call_args[0][0]
128+
129+
assert isinstance(event, TaskStatusUpdateEvent)
130+
assert event.status.state == TaskState.completed
131+
assert event.final is True
132+
assert event.status.message is None
133+
134+
def test_complete_with_message(
135+
self, task_updater, event_queue, sample_message
136+
):
137+
"""Test marking a task as completed with a message."""
138+
task_updater.complete(message=sample_message)
139+
140+
event_queue.enqueue_event.assert_called_once()
141+
event = event_queue.enqueue_event.call_args[0][0]
142+
143+
assert isinstance(event, TaskStatusUpdateEvent)
144+
assert event.status.state == TaskState.completed
145+
assert event.final is True
146+
assert event.status.message == sample_message
147+
148+
def test_submit_without_message(self, task_updater, event_queue):
149+
"""Test marking a task as submitted without a message."""
150+
task_updater.submit()
151+
152+
event_queue.enqueue_event.assert_called_once()
153+
event = event_queue.enqueue_event.call_args[0][0]
154+
155+
assert isinstance(event, TaskStatusUpdateEvent)
156+
assert event.status.state == TaskState.submitted
157+
assert event.final is False
158+
assert event.status.message is None
159+
160+
def test_submit_with_message(
161+
self, task_updater, event_queue, sample_message
162+
):
163+
"""Test marking a task as submitted with a message."""
164+
task_updater.submit(message=sample_message)
165+
166+
event_queue.enqueue_event.assert_called_once()
167+
event = event_queue.enqueue_event.call_args[0][0]
168+
169+
assert isinstance(event, TaskStatusUpdateEvent)
170+
assert event.status.state == TaskState.submitted
171+
assert event.final is False
172+
assert event.status.message == sample_message
173+
174+
def test_start_work_without_message(self, task_updater, event_queue):
175+
"""Test marking a task as working without a message."""
176+
task_updater.start_work()
177+
178+
event_queue.enqueue_event.assert_called_once()
179+
event = event_queue.enqueue_event.call_args[0][0]
180+
181+
assert isinstance(event, TaskStatusUpdateEvent)
182+
assert event.status.state == TaskState.working
183+
assert event.final is False
184+
assert event.status.message is None
185+
186+
def test_start_work_with_message(
187+
self, task_updater, event_queue, sample_message
188+
):
189+
"""Test marking a task as working with a message."""
190+
task_updater.start_work(message=sample_message)
191+
192+
event_queue.enqueue_event.assert_called_once()
193+
event = event_queue.enqueue_event.call_args[0][0]
194+
195+
assert isinstance(event, TaskStatusUpdateEvent)
196+
assert event.status.state == TaskState.working
197+
assert event.final is False
198+
assert event.status.message == sample_message
199+
200+
def test_new_agent_message(self, task_updater, sample_parts):
201+
"""Test creating a new agent message."""
202+
with patch(
203+
'uuid.uuid4',
204+
return_value=uuid.UUID('12345678-1234-5678-1234-567812345678'),
205+
):
206+
message = task_updater.new_agent_message(parts=sample_parts)
207+
208+
assert message.role == Role.agent
209+
assert message.taskId == 'test-task-id'
210+
assert message.contextId == 'test-context-id'
211+
assert message.messageId == '12345678-1234-5678-1234-567812345678'
212+
assert message.parts == sample_parts
213+
assert message.metadata is None
214+
215+
def test_new_agent_message_with_metadata_and_final(
216+
self, task_updater, sample_parts
217+
):
218+
"""Test creating a new agent message with metadata and final=True."""
219+
metadata = {'key': 'value'}
220+
221+
with patch(
222+
'uuid.uuid4',
223+
return_value=uuid.UUID('12345678-1234-5678-1234-567812345678'),
224+
):
225+
message = task_updater.new_agent_message(
226+
parts=sample_parts, final=True, metadata=metadata
227+
)
228+
229+
assert message.role == Role.agent
230+
assert message.taskId == 'test-task-id'
231+
assert message.contextId == 'test-context-id'
232+
assert message.messageId == '12345678-1234-5678-1234-567812345678'
233+
assert message.parts == sample_parts
234+
assert message.metadata == metadata

0 commit comments

Comments
 (0)