@@ -239,3 +239,44 @@ def _message_to_rest_params(self, message: ProtobufMessage) -> QueryParams:
239239 return httpx .Request (
240240 'GET' , 'http://api.example.com' , params = rest_dict
241241 ).url .params
242+
243+
244+ class TestValidateProtoRequiredFields :
245+ """Tests for validate_proto_required_fields function."""
246+
247+ def test_valid_required_fields (self ):
248+ """Test with all required fields present."""
249+ msg = Message (
250+ message_id = 'msg-1' ,
251+ role = Role .ROLE_USER ,
252+ parts = [Part (text = 'hello' )],
253+ )
254+ proto_utils .validate_proto_required_fields (msg )
255+
256+ def test_missing_required_fields (self ):
257+ """Test with empty message raising InvalidParamsError containing all errors."""
258+ from a2a .utils .errors import InvalidParamsError
259+
260+ msg = Message ()
261+ with pytest .raises (InvalidParamsError ) as exc_info :
262+ proto_utils .validate_proto_required_fields (msg )
263+
264+ err = exc_info .value
265+ errors = err .data .get ('errors' , []) if err .data else []
266+
267+ assert {e ['field' ] for e in errors } == {'message_id' , 'role' , 'parts' }
268+
269+ def test_nested_required_fields (self ):
270+ """Test nested required fields inside TaskStatus."""
271+ from a2a .utils .errors import InvalidParamsError
272+
273+ # Task Status requires 'state'
274+ task = Task (id = 'task-1' , status = TaskStatus ())
275+ with pytest .raises (InvalidParamsError ) as exc_info :
276+ proto_utils .validate_proto_required_fields (task )
277+
278+ err = exc_info .value
279+ errors = err .data .get ('errors' , []) if err .data else []
280+
281+ fields = [e ['field' ] for e in errors ]
282+ assert 'status.state' in fields
0 commit comments