@@ -908,6 +908,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
908
908
assert response .retries_taken == failures_before_success
909
909
assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
910
910
911
+ @pytest .mark .respx (base_url = base_url )
912
+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
913
+ # Test that the default follow_redirects=True allows following redirects
914
+ respx_mock .post ("/redirect" ).mock (
915
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
916
+ )
917
+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
918
+
919
+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
920
+ assert response .status_code == 200
921
+ assert response .json () == {"status" : "ok" }
922
+
923
+ @pytest .mark .respx (base_url = base_url )
924
+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
925
+ # Test that follow_redirects=False prevents following redirects
926
+ respx_mock .post ("/redirect" ).mock (
927
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
928
+ )
929
+
930
+ with pytest .raises (APIStatusError ) as exc_info :
931
+ self .client .post (
932
+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
933
+ )
934
+
935
+ assert exc_info .value .response .status_code == 302
936
+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
937
+
911
938
912
939
class TestAsyncOpenAI :
913
940
client = AsyncOpenAI (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1829,3 +1856,30 @@ async def test_main() -> None:
1829
1856
raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
1830
1857
1831
1858
time .sleep (0.1 )
1859
+
1860
+ @pytest .mark .respx (base_url = base_url )
1861
+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1862
+ # Test that the default follow_redirects=True allows following redirects
1863
+ respx_mock .post ("/redirect" ).mock (
1864
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1865
+ )
1866
+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1867
+
1868
+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1869
+ assert response .status_code == 200
1870
+ assert response .json () == {"status" : "ok" }
1871
+
1872
+ @pytest .mark .respx (base_url = base_url )
1873
+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1874
+ # Test that follow_redirects=False prevents following redirects
1875
+ respx_mock .post ("/redirect" ).mock (
1876
+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1877
+ )
1878
+
1879
+ with pytest .raises (APIStatusError ) as exc_info :
1880
+ await self .client .post (
1881
+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1882
+ )
1883
+
1884
+ assert exc_info .value .response .status_code == 302
1885
+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments