2727 TaskDecomposedEvent ,
2828 TaskFailedEvent ,
2929 TaskStartedEvent ,
30+ TaskUpdatedEvent ,
3031 WorkerCreatedEvent ,
3132 WorkerDeletedEvent ,
3233 WorkforceEvent ,
@@ -61,6 +62,9 @@ def log_task_assigned(self, event: TaskAssignedEvent) -> None:
6162 def log_task_started (self , event : TaskStartedEvent ) -> None :
6263 self .events .append (event )
6364
65+ def log_task_updated (self , event : TaskUpdatedEvent ) -> None :
66+ self .events .append (event )
67+
6468 def log_task_completed (self , event : TaskCompletedEvent ) -> None :
6569 self .events .append (event )
6670
@@ -121,6 +125,9 @@ def log_task_assigned(self, event: TaskAssignedEvent) -> None:
121125 def log_task_started (self , event : TaskStartedEvent ) -> None :
122126 self .events .append (event )
123127
128+ def log_task_updated (self , event : TaskUpdatedEvent ) -> None :
129+ self .events .append (event )
130+
124131 def log_task_completed (self , event : TaskCompletedEvent ) -> None :
125132 self .events .append (event )
126133
@@ -179,7 +186,9 @@ def test_workforce_callback_registration_and_metrics_handling():
179186 Workforce ("CB Test - Invalid" , callbacks = [object ()])
180187
181188
182- def assert_event_sequence (events : list [str ], min_worker_count : int ):
189+ def assert_event_sequence (
190+ events : list [type [WorkforceEvent ]], min_worker_count : int
191+ ):
183192 """
184193 Validate that the given event sequence follows the expected logical order.
185194 This version is flexible to handle:
@@ -191,7 +200,7 @@ def assert_event_sequence(events: list[str], min_worker_count: int):
191200
192201 # 1. Expect at least min_worker_count WorkerCreatedEvent events first
193202 initial_worker_count = 0
194- while idx < n and events [idx ] == " WorkerCreatedEvent" :
203+ while idx < n and events [idx ] == WorkerCreatedEvent :
195204 initial_worker_count += 1
196205 idx += 1
197206 assert initial_worker_count >= min_worker_count , (
@@ -200,8 +209,8 @@ def assert_event_sequence(events: list[str], min_worker_count: int):
200209 )
201210
202211 # 2. Expect one main TaskCreatedEvent
203- assert idx < n and events [idx ] == " TaskCreatedEvent" , (
204- f"Event { idx } should be TaskCreatedEvent, got "
212+ assert idx < n and events [idx ] == TaskCreatedEvent , (
213+ f"Event { idx } should be { TaskCreatedEvent . __name__ } , got "
205214 f"{ events [idx ] if idx < n else 'END' } "
206215 )
207216 idx += 1
@@ -210,49 +219,55 @@ def assert_event_sequence(events: list[str], min_worker_count: int):
210219 # (depends on coordinator behavior)
211220 # If the coordinator can't parse stub responses, it may skip
212221 # decomposition
213- has_decomposition = idx < n and events [idx ] == " TaskDecomposedEvent"
222+ has_decomposition = idx < n and events [idx ] == TaskDecomposedEvent
214223 if has_decomposition :
215224 idx += 1
216225
217226 # 4. Count all event types in the remaining events
218227 all_events = events [idx :]
219- task_assigned_count = all_events .count ("TaskAssignedEvent" )
220- task_started_count = all_events .count ("TaskStartedEvent" )
221- task_completed_count = all_events .count ("TaskCompletedEvent" )
222- all_tasks_completed_count = all_events .count ("AllTasksCompletedEvent" )
228+ task_assigned_count = sum (e is TaskAssignedEvent for e in all_events )
229+ task_started_count = sum (e is TaskStartedEvent for e in all_events )
230+ task_completed_count = sum (e is TaskCompletedEvent for e in all_events )
231+ all_tasks_completed_count = sum (
232+ e is AllTasksCompletedEvent for e in all_events
233+ )
223234
224235 # 5. Validate basic invariants
225236 # At minimum, the main task should be assigned and processed
226- assert (
227- task_assigned_count >= 1
228- ), f"Expected at least 1 TaskAssignedEvent, got { task_assigned_count } "
229- assert (
230- task_started_count >= 1
231- ), f"Expected at least 1 TaskStartedEvent, got { task_started_count } "
232- assert (
233- task_completed_count >= 1
234- ), f"Expected at least 1 TaskCompletedEvent, got { task_completed_count } "
237+ assert task_assigned_count >= 1 , (
238+ f"Expected at least 1 { TaskAssignedEvent .__name__ } , "
239+ f"got { task_assigned_count } "
240+ )
241+ assert task_started_count >= 1 , (
242+ f"Expected at least 1 { TaskStartedEvent .__name__ } , "
243+ f"got { task_started_count } "
244+ )
245+ assert task_completed_count >= 1 , (
246+ f"Expected at least 1 { TaskCompletedEvent .__name__ } , "
247+ f"got { task_completed_count } "
248+ )
235249
236250 # 6. Expect exactly one AllTasksCompletedEvent at the end
237251 assert all_tasks_completed_count == 1 , (
238- f"Expected exactly 1 AllTasksCompletedEvent, got "
252+ f"Expected exactly 1 { AllTasksCompletedEvent . __name__ } , got "
239253 f"{ all_tasks_completed_count } "
240254 )
241255 assert (
242- events [- 1 ] == " AllTasksCompletedEvent"
243- ), "Last event should be AllTasksCompletedEvent"
256+ events [- 1 ] == AllTasksCompletedEvent
257+ ), f "Last event should be { AllTasksCompletedEvent . __name__ } "
244258
245259 # 7. All events should be of expected types
246260 allowed_events = {
247- "WorkerCreatedEvent" ,
248- "WorkerDeletedEvent" ,
249- "TaskCreatedEvent" ,
250- "TaskDecomposedEvent" ,
251- "TaskAssignedEvent" ,
252- "TaskStartedEvent" ,
253- "TaskCompletedEvent" ,
254- "TaskFailedEvent" ,
255- "AllTasksCompletedEvent" ,
261+ WorkerCreatedEvent ,
262+ WorkerDeletedEvent ,
263+ TaskCreatedEvent ,
264+ TaskDecomposedEvent ,
265+ TaskAssignedEvent ,
266+ TaskStartedEvent ,
267+ TaskUpdatedEvent ,
268+ TaskCompletedEvent ,
269+ TaskFailedEvent ,
270+ AllTasksCompletedEvent ,
256271 }
257272 for i , e in enumerate (events ):
258273 assert e in allowed_events , f"Unexpected event type at { i } : { e } "
@@ -348,7 +363,7 @@ def test_workforce_emits_expected_event_sequence():
348363 workforce .process_task (human_task )
349364
350365 # test that the event sequence is as expected
351- actual_events = [e .__class__ . __name__ for e in cb .events ]
366+ actual_events = [e .__class__ for e in cb .events ]
352367 assert_event_sequence (actual_events , min_worker_count = 3 )
353368
354369 # test that metrics callback methods work as expected
0 commit comments