@@ -908,6 +908,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
908908 assert response .retries_taken == failures_before_success
909909 assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
910910
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+
911938
912939class TestAsyncOpenAI :
913940 client = AsyncOpenAI (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1829,3 +1856,30 @@ async def test_main() -> None:
18291856 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
18301857
18311858 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