Skip to content

Commit 5231174

Browse files
didier-durandholtskinner
authored andcommitted
adding 13 tests for server/tasks/task_updater.py
1 parent ac31ebe commit 5231174

File tree

1 file changed

+219
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)