23
23
IntercomError ,
24
24
APIStatusError ,
25
25
APITimeoutError ,
26
- APIConnectionError ,
27
26
APIResponseValidationError ,
28
27
)
29
28
from intercom ._base_client import (
@@ -45,14 +44,8 @@ def _get_params(client: BaseClient[Any, Any]) -> dict[str, str]:
45
44
return dict (url .params )
46
45
47
46
48
- _original_response_init = cast (Any , httpx .Response .__init__ ) # type: ignore
49
-
50
-
51
- def _low_retry_response_init (* args : Any , ** kwargs : Any ) -> Any :
52
- headers = cast ("list[tuple[bytes, bytes]]" , kwargs ["headers" ])
53
- headers .append ((b"retry-after" , b"0.1" ))
54
-
55
- return _original_response_init (* args , ** kwargs )
47
+ def _low_retry_timeout (* _args : Any , ** _kwargs : Any ) -> float :
48
+ return 0.1
56
49
57
50
58
51
def _get_open_connections (client : Intercom | AsyncIntercom ) -> int :
@@ -702,70 +695,29 @@ def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str
702
695
calculated = client ._calculate_retry_timeout (remaining_retries , options , headers )
703
696
assert calculated == pytest .approx (timeout , 0.5 * 0.875 ) # pyright: ignore[reportUnknownMemberType]
704
697
705
- @mock .patch ("httpx.Response.__init__" , _low_retry_response_init )
706
- def test_retrying_timeout_errors_doesnt_leak (self ) -> None :
707
- def raise_for_status (response : httpx .Response ) -> None :
708
- raise httpx .TimeoutException ("Test timeout error" , request = response .request )
709
-
710
- with mock .patch ("httpx.Response.raise_for_status" , raise_for_status ):
711
- with pytest .raises (APITimeoutError ):
712
- self .client .get (
713
- "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
714
- )
715
-
716
- assert _get_open_connections (self .client ) == 0
717
-
718
- @mock .patch ("httpx.Response.__init__" , _low_retry_response_init )
719
- def test_retrying_runtime_errors_doesnt_leak (self ) -> None :
720
- def raise_for_status (_response : httpx .Response ) -> None :
721
- raise RuntimeError ("Test error" )
722
-
723
- with mock .patch ("httpx.Response.raise_for_status" , raise_for_status ):
724
- with pytest .raises (APIConnectionError ):
725
- self .client .get (
726
- "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
727
- )
728
-
729
- assert _get_open_connections (self .client ) == 0
730
-
731
- @mock .patch ("httpx.Response.__init__" , _low_retry_response_init )
732
- def test_retrying_status_errors_doesnt_leak (self ) -> None :
733
- def raise_for_status (response : httpx .Response ) -> None :
734
- response .status_code = 500
735
- raise httpx .HTTPStatusError ("Test 500 error" , response = response , request = response .request )
698
+ @mock .patch ("intercom._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
699
+ @pytest .mark .respx (base_url = base_url )
700
+ def test_retrying_timeout_errors_doesnt_leak (self , respx_mock : MockRouter ) -> None :
701
+ respx_mock .get ("/me" ).mock (side_effect = httpx .TimeoutException ("Test timeout error" ))
736
702
737
- with mock .patch ("httpx.Response.raise_for_status" , raise_for_status ):
738
- with pytest .raises (APIStatusError ):
739
- self .client .get (
740
- "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
741
- )
703
+ with pytest .raises (APITimeoutError ):
704
+ self .client .get (
705
+ "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
706
+ )
742
707
743
708
assert _get_open_connections (self .client ) == 0
744
709
710
+ @mock .patch ("intercom._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
745
711
@pytest .mark .respx (base_url = base_url )
746
- def test_status_error_within_httpx (self , respx_mock : MockRouter ) -> None :
747
- respx_mock .post ("/foo " ).mock (return_value = httpx .Response (200 , json = { "foo" : "bar" } ))
712
+ def test_retrying_status_errors_doesnt_leak (self , respx_mock : MockRouter ) -> None :
713
+ respx_mock .get ("/me " ).mock (return_value = httpx .Response (500 ))
748
714
749
- def on_response (response : httpx .Response ) -> None :
750
- raise httpx .HTTPStatusError (
751
- "Simulating an error inside httpx" ,
752
- response = response ,
753
- request = response .request ,
715
+ with pytest .raises (APIStatusError ):
716
+ self .client .get (
717
+ "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
754
718
)
755
719
756
- client = Intercom (
757
- base_url = base_url ,
758
- bearer_token = bearer_token ,
759
- _strict_response_validation = True ,
760
- http_client = httpx .Client (
761
- event_hooks = {
762
- "response" : [on_response ],
763
- }
764
- ),
765
- max_retries = 0 ,
766
- )
767
- with pytest .raises (APIStatusError ):
768
- client .post ("/foo" , cast_to = httpx .Response )
720
+ assert _get_open_connections (self .client ) == 0
769
721
770
722
771
723
class TestAsyncIntercom :
@@ -1413,68 +1365,26 @@ async def test_parse_retry_after_header(self, remaining_retries: int, retry_afte
1413
1365
calculated = client ._calculate_retry_timeout (remaining_retries , options , headers )
1414
1366
assert calculated == pytest .approx (timeout , 0.5 * 0.875 ) # pyright: ignore[reportUnknownMemberType]
1415
1367
1416
- @mock .patch ("httpx.Response.__init__" , _low_retry_response_init )
1417
- async def test_retrying_timeout_errors_doesnt_leak (self ) -> None :
1418
- def raise_for_status (response : httpx .Response ) -> None :
1419
- raise httpx .TimeoutException ("Test timeout error" , request = response .request )
1420
-
1421
- with mock .patch ("httpx.Response.raise_for_status" , raise_for_status ):
1422
- with pytest .raises (APITimeoutError ):
1423
- await self .client .get (
1424
- "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
1425
- )
1426
-
1427
- assert _get_open_connections (self .client ) == 0
1428
-
1429
- @mock .patch ("httpx.Response.__init__" , _low_retry_response_init )
1430
- async def test_retrying_runtime_errors_doesnt_leak (self ) -> None :
1431
- def raise_for_status (_response : httpx .Response ) -> None :
1432
- raise RuntimeError ("Test error" )
1433
-
1434
- with mock .patch ("httpx.Response.raise_for_status" , raise_for_status ):
1435
- with pytest .raises (APIConnectionError ):
1436
- await self .client .get (
1437
- "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
1438
- )
1439
-
1440
- assert _get_open_connections (self .client ) == 0
1441
-
1442
- @mock .patch ("httpx.Response.__init__" , _low_retry_response_init )
1443
- async def test_retrying_status_errors_doesnt_leak (self ) -> None :
1444
- def raise_for_status (response : httpx .Response ) -> None :
1445
- response .status_code = 500
1446
- raise httpx .HTTPStatusError ("Test 500 error" , response = response , request = response .request )
1368
+ @mock .patch ("intercom._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
1369
+ @pytest .mark .respx (base_url = base_url )
1370
+ async def test_retrying_timeout_errors_doesnt_leak (self , respx_mock : MockRouter ) -> None :
1371
+ respx_mock .get ("/me" ).mock (side_effect = httpx .TimeoutException ("Test timeout error" ))
1447
1372
1448
- with mock .patch ("httpx.Response.raise_for_status" , raise_for_status ):
1449
- with pytest .raises (APIStatusError ):
1450
- await self .client .get (
1451
- "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
1452
- )
1373
+ with pytest .raises (APITimeoutError ):
1374
+ await self .client .get (
1375
+ "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
1376
+ )
1453
1377
1454
1378
assert _get_open_connections (self .client ) == 0
1455
1379
1380
+ @mock .patch ("intercom._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
1456
1381
@pytest .mark .respx (base_url = base_url )
1457
- @pytest .mark .asyncio
1458
- async def test_status_error_within_httpx (self , respx_mock : MockRouter ) -> None :
1459
- respx_mock .post ("/foo" ).mock (return_value = httpx .Response (200 , json = {"foo" : "bar" }))
1382
+ async def test_retrying_status_errors_doesnt_leak (self , respx_mock : MockRouter ) -> None :
1383
+ respx_mock .get ("/me" ).mock (return_value = httpx .Response (500 ))
1460
1384
1461
- def on_response (response : httpx .Response ) -> None :
1462
- raise httpx .HTTPStatusError (
1463
- "Simulating an error inside httpx" ,
1464
- response = response ,
1465
- request = response .request ,
1385
+ with pytest .raises (APIStatusError ):
1386
+ await self .client .get (
1387
+ "/me" , cast_to = httpx .Response , options = {"headers" : {"X-Stainless-Streamed-Raw-Response" : "true" }}
1466
1388
)
1467
1389
1468
- client = AsyncIntercom (
1469
- base_url = base_url ,
1470
- bearer_token = bearer_token ,
1471
- _strict_response_validation = True ,
1472
- http_client = httpx .AsyncClient (
1473
- event_hooks = {
1474
- "response" : [on_response ],
1475
- }
1476
- ),
1477
- max_retries = 0 ,
1478
- )
1479
- with pytest .raises (APIStatusError ):
1480
- await client .post ("/foo" , cast_to = httpx .Response )
1390
+ assert _get_open_connections (self .client ) == 0
0 commit comments