Skip to content

Commit dc00da2

Browse files
Require concrete api_key inputs in config and transport
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 520e1c9 commit dc00da2

File tree

4 files changed

+12
-101
lines changed

4 files changed

+12
-101
lines changed

hyperbrowser/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def normalize_api_key(
3232
*,
3333
empty_error_message: str = "api_key must not be empty",
3434
) -> str:
35-
if not isinstance(api_key, str):
35+
if type(api_key) is not str:
3636
raise HyperbrowserError("api_key must be a string")
3737
try:
3838
normalized_api_key = api_key.strip()

hyperbrowser/transport/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def _format_mapping_key_for_error(key: str) -> str:
6464

6565

6666
def _normalize_transport_api_key(api_key: str) -> str:
67-
if not isinstance(api_key, str):
67+
if type(api_key) is not str:
6868
raise HyperbrowserError("api_key must be a string")
6969

7070
try:

tests/test_config.py

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -318,55 +318,12 @@ def strip(self, chars=None): # type: ignore[override]
318318
ClientConfig.resolve_base_url_from_env(_BrokenBaseUrl("https://example.local"))
319319

320320

321-
def test_client_config_wraps_api_key_strip_runtime_errors():
322-
class _BrokenApiKey(str):
323-
def strip(self, chars=None): # type: ignore[override]
324-
_ = chars
325-
raise RuntimeError("api key strip exploded")
326-
327-
with pytest.raises(HyperbrowserError, match="Failed to normalize api_key") as exc_info:
328-
ClientConfig(api_key=_BrokenApiKey("test-key"))
329-
330-
assert isinstance(exc_info.value.original_error, RuntimeError)
331-
332-
333-
def test_client_config_preserves_hyperbrowser_api_key_strip_errors():
334-
class _BrokenApiKey(str):
335-
def strip(self, chars=None): # type: ignore[override]
336-
_ = chars
337-
raise HyperbrowserError("custom strip failure")
338-
339-
with pytest.raises(HyperbrowserError, match="custom strip failure") as exc_info:
340-
ClientConfig(api_key=_BrokenApiKey("test-key"))
341-
342-
assert exc_info.value.original_error is None
343-
344-
345-
def test_client_config_wraps_non_string_api_key_strip_results():
346-
class _BrokenApiKey(str):
347-
def strip(self, chars=None): # type: ignore[override]
348-
_ = chars
349-
return object()
350-
351-
with pytest.raises(HyperbrowserError, match="Failed to normalize api_key") as exc_info:
352-
ClientConfig(api_key=_BrokenApiKey("test-key"))
353-
354-
assert isinstance(exc_info.value.original_error, TypeError)
355-
356-
357-
def test_client_config_wraps_api_key_string_subclass_strip_results():
358-
class _BrokenApiKey(str):
359-
class _NormalizedKey(str):
360-
pass
361-
362-
def strip(self, chars=None): # type: ignore[override]
363-
_ = chars
364-
return self._NormalizedKey("test-key")
365-
366-
with pytest.raises(HyperbrowserError, match="Failed to normalize api_key") as exc_info:
367-
ClientConfig(api_key=_BrokenApiKey("test-key"))
321+
def test_client_config_rejects_string_subclass_api_key_values():
322+
class _ApiKey(str):
323+
pass
368324

369-
assert isinstance(exc_info.value.original_error, TypeError)
325+
with pytest.raises(HyperbrowserError, match="api_key must be a string"):
326+
ClientConfig(api_key=_ApiKey("test-key"))
370327

371328

372329
def test_client_config_rejects_blank_api_key_values():

tests/test_transport_api_key.py

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,58 +6,12 @@
66

77

88
@pytest.mark.parametrize("transport_class", [SyncTransport, AsyncTransport])
9-
def test_transport_wraps_api_key_strip_runtime_errors(transport_class):
10-
class _BrokenStripApiKey(str):
11-
def strip(self, chars=None): # type: ignore[override]
12-
_ = chars
13-
raise RuntimeError("api key strip exploded")
9+
def test_transport_rejects_string_subclass_api_keys(transport_class):
10+
class _ApiKey(str):
11+
pass
1412

15-
with pytest.raises(HyperbrowserError, match="Failed to normalize api_key") as exc_info:
16-
transport_class(api_key=_BrokenStripApiKey("test-key"))
17-
18-
assert isinstance(exc_info.value.original_error, RuntimeError)
19-
20-
21-
@pytest.mark.parametrize("transport_class", [SyncTransport, AsyncTransport])
22-
def test_transport_preserves_hyperbrowser_api_key_strip_errors(transport_class):
23-
class _BrokenStripApiKey(str):
24-
def strip(self, chars=None): # type: ignore[override]
25-
_ = chars
26-
raise HyperbrowserError("custom strip failure")
27-
28-
with pytest.raises(HyperbrowserError, match="custom strip failure") as exc_info:
29-
transport_class(api_key=_BrokenStripApiKey("test-key"))
30-
31-
assert exc_info.value.original_error is None
32-
33-
34-
@pytest.mark.parametrize("transport_class", [SyncTransport, AsyncTransport])
35-
def test_transport_wraps_non_string_api_key_strip_results(transport_class):
36-
class _NonStringStripResultApiKey(str):
37-
def strip(self, chars=None): # type: ignore[override]
38-
_ = chars
39-
return object()
40-
41-
with pytest.raises(HyperbrowserError, match="Failed to normalize api_key") as exc_info:
42-
transport_class(api_key=_NonStringStripResultApiKey("test-key"))
43-
44-
assert isinstance(exc_info.value.original_error, TypeError)
45-
46-
47-
@pytest.mark.parametrize("transport_class", [SyncTransport, AsyncTransport])
48-
def test_transport_wraps_api_key_string_subclass_strip_results(transport_class):
49-
class _BrokenLengthApiKey(str):
50-
class _NormalizedKey(str):
51-
pass
52-
53-
def strip(self, chars=None): # type: ignore[override]
54-
_ = chars
55-
return self._NormalizedKey("test-key")
56-
57-
with pytest.raises(HyperbrowserError, match="Failed to normalize api_key") as exc_info:
58-
transport_class(api_key=_BrokenLengthApiKey("test-key"))
59-
60-
assert isinstance(exc_info.value.original_error, TypeError)
13+
with pytest.raises(HyperbrowserError, match="api_key must be a string"):
14+
transport_class(api_key=_ApiKey("test-key"))
6115

6216

6317
@pytest.mark.parametrize("transport_class", [SyncTransport, AsyncTransport])

0 commit comments

Comments
 (0)