@@ -828,6 +828,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
828
828
829
829
assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
830
830
831
+ @pytest .mark .respx (base_url = base_url )
832
+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
833
+ # Test that the default follow_redirects=True allows following redirects
834
+ respx_mock .post ("/redirect" ).mock (
835
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
836
+ )
837
+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
838
+
839
+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
840
+ assert response .status_code == 200
841
+ assert response .json () == {"status" : "ok" }
842
+
843
+ @pytest .mark .respx (base_url = base_url )
844
+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
845
+ # Test that follow_redirects=False prevents following redirects
846
+ respx_mock .post ("/redirect" ).mock (
847
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
848
+ )
849
+
850
+ with pytest .raises (APIStatusError ) as exc_info :
851
+ self .client .post (
852
+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
853
+ )
854
+
855
+ assert exc_info .value .response .status_code == 302
856
+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
857
+
831
858
832
859
class TestAsyncContextualAI :
833
860
client = AsyncContextualAI (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1657,3 +1684,30 @@ async def test_main() -> None:
1657
1684
raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
1658
1685
1659
1686
time .sleep (0.1 )
1687
+
1688
+ @pytest .mark .respx (base_url = base_url )
1689
+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1690
+ # Test that the default follow_redirects=True allows following redirects
1691
+ respx_mock .post ("/redirect" ).mock (
1692
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1693
+ )
1694
+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1695
+
1696
+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1697
+ assert response .status_code == 200
1698
+ assert response .json () == {"status" : "ok" }
1699
+
1700
+ @pytest .mark .respx (base_url = base_url )
1701
+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1702
+ # Test that follow_redirects=False prevents following redirects
1703
+ respx_mock .post ("/redirect" ).mock (
1704
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1705
+ )
1706
+
1707
+ with pytest .raises (APIStatusError ) as exc_info :
1708
+ await self .client .post (
1709
+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1710
+ )
1711
+
1712
+ assert exc_info .value .response .status_code == 302
1713
+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments