@@ -108,3 +108,42 @@ def test_async_client_rejects_control_character_env_api_key(monkeypatch):
108108 HyperbrowserError , match = "api_key must not contain control characters"
109109 ):
110110 AsyncHyperbrowser ()
111+
112+
113+ @pytest .mark .parametrize ("client_class" , [Hyperbrowser , AsyncHyperbrowser ])
114+ def test_client_wraps_api_key_strip_runtime_errors (client_class ):
115+ class _BrokenStripApiKey (str ):
116+ def strip (self , chars = None ): # type: ignore[override]
117+ _ = chars
118+ raise RuntimeError ("api key strip exploded" )
119+
120+ with pytest .raises (HyperbrowserError , match = "Failed to normalize api_key" ) as exc_info :
121+ client_class (api_key = _BrokenStripApiKey ("test-key" ))
122+
123+ assert isinstance (exc_info .value .original_error , RuntimeError )
124+
125+
126+ @pytest .mark .parametrize ("client_class" , [Hyperbrowser , AsyncHyperbrowser ])
127+ def test_client_preserves_hyperbrowser_api_key_strip_errors (client_class ):
128+ class _BrokenStripApiKey (str ):
129+ def strip (self , chars = None ): # type: ignore[override]
130+ _ = chars
131+ raise HyperbrowserError ("custom strip failure" )
132+
133+ with pytest .raises (HyperbrowserError , match = "custom strip failure" ) as exc_info :
134+ client_class (api_key = _BrokenStripApiKey ("test-key" ))
135+
136+ assert exc_info .value .original_error is None
137+
138+
139+ @pytest .mark .parametrize ("client_class" , [Hyperbrowser , AsyncHyperbrowser ])
140+ def test_client_wraps_non_string_api_key_strip_results (client_class ):
141+ class _NonStringStripResultApiKey (str ):
142+ def strip (self , chars = None ): # type: ignore[override]
143+ _ = chars
144+ return object ()
145+
146+ with pytest .raises (HyperbrowserError , match = "Failed to normalize api_key" ) as exc_info :
147+ client_class (api_key = _NonStringStripResultApiKey ("test-key" ))
148+
149+ assert isinstance (exc_info .value .original_error , TypeError )
0 commit comments