@@ -803,6 +803,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
803
803
804
804
assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
805
805
806
+ @pytest .mark .respx (base_url = base_url )
807
+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
808
+ # Test that the default follow_redirects=True allows following redirects
809
+ respx_mock .post ("/redirect" ).mock (
810
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
811
+ )
812
+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
813
+
814
+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
815
+ assert response .status_code == 200
816
+ assert response .json () == {"status" : "ok" }
817
+
818
+ @pytest .mark .respx (base_url = base_url )
819
+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
820
+ # Test that follow_redirects=False prevents following redirects
821
+ respx_mock .post ("/redirect" ).mock (
822
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
823
+ )
824
+
825
+ with pytest .raises (APIStatusError ) as exc_info :
826
+ self .client .post (
827
+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
828
+ )
829
+
830
+ assert exc_info .value .response .status_code == 302
831
+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
832
+
806
833
807
834
class TestAsyncCodex :
808
835
client = AsyncCodex (base_url = base_url , _strict_response_validation = True )
@@ -1609,3 +1636,30 @@ async def test_main() -> None:
1609
1636
raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
1610
1637
1611
1638
time .sleep (0.1 )
1639
+
1640
+ @pytest .mark .respx (base_url = base_url )
1641
+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1642
+ # Test that the default follow_redirects=True allows following redirects
1643
+ respx_mock .post ("/redirect" ).mock (
1644
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1645
+ )
1646
+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1647
+
1648
+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1649
+ assert response .status_code == 200
1650
+ assert response .json () == {"status" : "ok" }
1651
+
1652
+ @pytest .mark .respx (base_url = base_url )
1653
+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1654
+ # Test that follow_redirects=False prevents following redirects
1655
+ respx_mock .post ("/redirect" ).mock (
1656
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1657
+ )
1658
+
1659
+ with pytest .raises (APIStatusError ) as exc_info :
1660
+ await self .client .post (
1661
+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1662
+ )
1663
+
1664
+ assert exc_info .value .response .status_code == 302
1665
+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments