@@ -101,6 +101,39 @@ def __getitem__(self, key: str) -> object:
101101 raise KeyError (key )
102102
103103
104+ class _BrokenRenderedModelNameString (str ):
105+ def __iter__ (self ):
106+ raise RuntimeError ("cannot iterate rendered model name" )
107+
108+
109+ class _UnreadableNameCallableModel :
110+ __name__ = _BrokenRenderedModelNameString ("UnreadableModelName" )
111+
112+ def __call__ (self , ** kwargs ):
113+ _ = kwargs
114+ raise RuntimeError ("call failed" )
115+
116+
117+ class _BrokenRenderedMappingKey (str ):
118+ def __iter__ (self ):
119+ raise RuntimeError ("cannot iterate rendered mapping key" )
120+
121+
122+ class _BrokenRenderedKeyValueMapping (Mapping [str , object ]):
123+ _KEY = _BrokenRenderedMappingKey ("name" )
124+
125+ def __iter__ (self ):
126+ return iter ([self ._KEY ])
127+
128+ def __len__ (self ) -> int :
129+ return 1
130+
131+ def __getitem__ (self , key : str ) -> object :
132+ if key == self ._KEY :
133+ raise RuntimeError ("cannot read rendered key value" )
134+ raise KeyError (key )
135+
136+
104137def test_api_response_from_json_parses_model_data () -> None :
105138 response = APIResponse .from_json (
106139 {"name" : "job-1" , "retries" : 2 }, _SampleResponseModel
@@ -206,6 +239,17 @@ def test_api_response_from_json_sanitizes_and_truncates_model_name_in_errors() -
206239 )
207240
208241
242+ def test_api_response_from_json_falls_back_for_unreadable_model_name_text () -> None :
243+ with pytest .raises (
244+ HyperbrowserError ,
245+ match = "Failed to parse response data for response model" ,
246+ ):
247+ APIResponse .from_json (
248+ {"name" : "job-1" },
249+ cast ("type[_SampleResponseModel]" , _UnreadableNameCallableModel ()),
250+ )
251+
252+
209253def test_api_response_from_json_uses_placeholder_for_blank_mapping_key_in_errors () -> (
210254 None
211255):
@@ -232,6 +276,19 @@ def test_api_response_from_json_sanitizes_and_truncates_mapping_keys_in_errors()
232276 APIResponse .from_json (_BrokenLongKeyValueMapping (), _SampleResponseModel )
233277
234278
279+ def test_api_response_from_json_falls_back_for_unreadable_mapping_keys_in_errors () -> (
280+ None
281+ ):
282+ with pytest .raises (
283+ HyperbrowserError ,
284+ match = (
285+ "Failed to parse response data for _SampleResponseModel: "
286+ "unable to read value for key '<unreadable key>'"
287+ ),
288+ ):
289+ APIResponse .from_json (_BrokenRenderedKeyValueMapping (), _SampleResponseModel )
290+
291+
235292def test_api_response_from_json_preserves_hyperbrowser_errors () -> None :
236293 with pytest .raises (HyperbrowserError , match = "model validation failed" ) as exc_info :
237294 APIResponse .from_json ({}, _RaisesHyperbrowserModel )
0 commit comments