@@ -63,7 +63,9 @@ def backend_type(request) -> str:
6363from a2a .contrib .tasks .vertex_task_store import VertexTaskStore
6464from a2a .types import (
6565 Artifact ,
66+ Message ,
6667 Part ,
68+ Role ,
6769 Task ,
6870 TaskState ,
6971 TaskStatus ,
@@ -504,3 +506,67 @@ async def test_metadata_field_mapping(
504506 retrieved_none = await vertex_store .get ('task-metadata-test-4' )
505507 assert retrieved_none is not None
506508 assert retrieved_none .metadata == {}
509+
510+
511+ @pytest .mark .asyncio
512+ async def test_update_task_status_details (
513+ vertex_store : VertexTaskStore ,
514+ ) -> None :
515+ """Test updating an existing task by changing the status details (message) with part metadata."""
516+ task_id = 'update-test-task-status-details'
517+ original_task = Task (
518+ id = task_id ,
519+ context_id = 'session-update' ,
520+ status = TaskStatus (state = TaskState .submitted ),
521+ kind = 'task' ,
522+ metadata = None ,
523+ artifacts = [],
524+ history = [],
525+ )
526+ await vertex_store .save (original_task )
527+
528+ retrieved_before_update = await vertex_store .get (task_id )
529+ assert retrieved_before_update is not None
530+ assert retrieved_before_update .status .message is None
531+
532+ updated_task = original_task .model_copy (deep = True )
533+ updated_task .status .state = TaskState .failed
534+ updated_task .status .timestamp = '2023-01-02T11:00:00Z'
535+ updated_task .status .message = Message (
536+ message_id = 'msg-error-1' ,
537+ role = Role .agent ,
538+ parts = [
539+ Part (
540+ root = TextPart (
541+ text = 'Task failed due to an unknown error' ,
542+ metadata = {'error_code' : 'UNKNOWN' , 'retryable' : False },
543+ )
544+ )
545+ ],
546+ )
547+
548+ await vertex_store .save (updated_task )
549+
550+ retrieved_after_update = await vertex_store .get (task_id )
551+ assert retrieved_after_update is not None
552+ assert retrieved_after_update .status .state == TaskState .failed
553+ assert retrieved_after_update .status .message is not None
554+ assert retrieved_after_update .status .message .message_id == 'msg-error-1'
555+ assert retrieved_after_update .status .message .role == Role .agent
556+ assert len (retrieved_after_update .status .message .parts ) == 1
557+
558+ assert isinstance (
559+ retrieved_after_update .status .message .parts [0 ].root , TextPart
560+ )
561+ text_part = retrieved_after_update .status .message .parts [0 ].root
562+ assert text_part .text == 'Task failed due to an unknown error'
563+ assert text_part .metadata == {'error_code' : 'UNKNOWN' , 'retryable' : False }
564+
565+ # Also test clearing the message
566+ cleared_task = updated_task .model_copy (deep = True )
567+ cleared_task .status .message = None
568+
569+ await vertex_store .save (cleared_task )
570+ retrieved_cleared = await vertex_store .get (task_id )
571+ assert retrieved_cleared is not None
572+ assert retrieved_cleared .status .message is None
0 commit comments