@@ -189,13 +189,42 @@ def test_defaults(self):
189189 assert card .data_events == []
190190 assert card .input_types == []
191191 assert card .output_schema is None
192+ assert card .metadata == {}
192193
193194 def test_serialization_roundtrip (self ):
194195 card = AgentCard (input_types = ["text" ], data_events = ["result" ])
195196 dumped = card .model_dump ()
196197 restored = AgentCard .model_validate (dumped )
197198 assert restored == card
198199
200+ def test_metadata_accepts_arbitrary_json_object (self ):
201+ card = AgentCard (
202+ metadata = {
203+ "permits_capable" : True ,
204+ "supported_workflows" : ["submit" , "review" ],
205+ "limits" : {"max_batch" : 5 },
206+ }
207+ )
208+ assert card .metadata == {
209+ "permits_capable" : True ,
210+ "supported_workflows" : ["submit" , "review" ],
211+ "limits" : {"max_batch" : 5 },
212+ }
213+
214+ def test_metadata_serialization_roundtrip (self ):
215+ card = AgentCard (metadata = {"permits_capable" : True })
216+ dumped = card .model_dump ()
217+ assert dumped ["metadata" ] == {"permits_capable" : True }
218+ restored = AgentCard .model_validate (dumped )
219+ assert restored == card
220+
221+ def test_metadata_default_instances_are_independent (self ):
222+ """Each default metadata is its own dict, not a shared class-level object."""
223+ card_a = AgentCard ()
224+ card_b = AgentCard ()
225+ card_a .metadata ["mutated" ] = True
226+ assert card_b .metadata == {}
227+
199228
200229# --- AgentCard.from_states ---
201230
@@ -247,6 +276,14 @@ def test_state_fields(self, sample_states):
247276 assert waiting .accepts == ["text" , "doc_upload" ]
248277 assert waiting .transitions == ["processing" ]
249278
279+ def test_metadata_forwarded (self , sample_states ):
280+ card = AgentCard .from_states (
281+ initial_state = SampleState .WAITING ,
282+ states = sample_states ,
283+ metadata = {"permits_capable" : True },
284+ )
285+ assert card .metadata == {"permits_capable" : True }
286+
250287 def test_matches_from_state_machine (self , sample_states , sample_sm ):
251288 """from_states and from_state_machine should produce identical cards."""
252289 card_states = AgentCard .from_states (
@@ -315,6 +352,13 @@ def test_no_output_model(self, sample_sm):
315352 assert card .data_events == []
316353 assert card .output_schema is None
317354
355+ def test_metadata_forwarded (self , sample_sm ):
356+ card = AgentCard .from_state_machine (
357+ state_machine = sample_sm ,
358+ metadata = {"permits_capable" : True },
359+ )
360+ assert card .metadata == {"permits_capable" : True }
361+
318362
319363# --- register_agent agent_card merging ---
320364
@@ -370,6 +414,20 @@ async def test_agent_card_merged_into_metadata(self, mock_env_vars):
370414 assert metadata ["agent_card" ]["input_types" ] == ["text" ]
371415 assert metadata ["agent_card" ]["data_events" ] == ["result" ]
372416
417+ async def test_agent_card_metadata_propagates_through_registration (self , mock_env_vars ):
418+ card = AgentCard (metadata = {"permits_capable" : True })
419+ mock_client = self ._make_mock_client ()
420+
421+ with patch ("agentex.lib.utils.registration.httpx.AsyncClient" , return_value = mock_client ):
422+ from agentex .lib .utils .registration import register_agent
423+
424+ await register_agent (mock_env_vars , agent_card = card )
425+
426+ sent_data = mock_client .post .call_args .kwargs ["json" ]
427+ metadata = sent_data ["registration_metadata" ]
428+
429+ assert metadata ["agent_card" ]["metadata" ] == {"permits_capable" : True }
430+
373431 async def test_none_preserved_when_no_card (self , mock_env_vars ):
374432 mock_client = self ._make_mock_client ()
375433
0 commit comments