@@ -18,6 +18,24 @@ def items(self):
1818 return [("X-Trace-Id" , "trace-1" , "extra-item" )]
1919
2020
21+ class _BrokenLenTuple (tuple ):
22+ def __len__ (self ):
23+ raise RuntimeError ("broken tuple length" )
24+
25+
26+ class _BrokenIndexTuple (tuple ):
27+ def __getitem__ (self , index ):
28+ raise RuntimeError ("broken tuple indexing" )
29+
30+
31+ class _BrokenTupleItemMapping (dict ):
32+ def __init__ (self , broken_item ):
33+ self ._broken_item = broken_item
34+
35+ def items (self ):
36+ return [self ._broken_item ]
37+
38+
2139def test_normalize_headers_trims_header_names ():
2240 headers = normalize_headers (
2341 {" X-Correlation-Id " : "abc123" },
@@ -231,3 +249,28 @@ def test_merge_headers_rejects_malformed_override_mapping_items():
231249 _MalformedHeaderItemsMapping (),
232250 mapping_error_message = "headers must be a mapping of string pairs" ,
233251 )
252+
253+
254+ def test_normalize_headers_wraps_broken_tuple_length_errors ():
255+ with pytest .raises (
256+ HyperbrowserError , match = "headers must be a mapping of string pairs"
257+ ) as exc_info :
258+ normalize_headers (
259+ _BrokenTupleItemMapping (_BrokenLenTuple (("X-Trace-Id" , "trace-1" ))),
260+ mapping_error_message = "headers must be a mapping of string pairs" ,
261+ )
262+
263+ assert exc_info .value .original_error is not None
264+
265+
266+ def test_merge_headers_wraps_broken_tuple_index_errors ():
267+ with pytest .raises (
268+ HyperbrowserError , match = "headers must be a mapping of string pairs"
269+ ) as exc_info :
270+ merge_headers (
271+ {"X-Trace-Id" : "trace-1" },
272+ _BrokenTupleItemMapping (_BrokenIndexTuple (("X-Trace-Id" , "trace-2" ))),
273+ mapping_error_message = "headers must be a mapping of string pairs" ,
274+ )
275+
276+ assert exc_info .value .original_error is not None
0 commit comments