Allow handler to optionally be async when MockTransport is used with AsyncClient (#1449)
This commit is contained in:
parent
645ae4ed9c
commit
084f35648b
@ -1,3 +1,4 @@
|
||||
import asyncio
|
||||
from typing import Callable, List, Optional, Tuple
|
||||
|
||||
import httpcore
|
||||
@ -47,7 +48,17 @@ class MockTransport(httpcore.SyncHTTPTransport, httpcore.AsyncHTTPTransport):
|
||||
stream=stream,
|
||||
)
|
||||
await request.aread()
|
||||
|
||||
response = self.handler(request)
|
||||
|
||||
# Allow handler to *optionally* be an `async` function.
|
||||
# If it is, then the `response` variable need to be awaited to actually
|
||||
# return the result.
|
||||
|
||||
# https://simonwillison.net/2020/Sep/2/await-me-maybe/
|
||||
if asyncio.iscoroutine(response):
|
||||
response = await response
|
||||
|
||||
return (
|
||||
response.status_code,
|
||||
response.headers.raw,
|
||||
|
||||
@ -301,3 +301,16 @@ async def test_mounted_transport():
|
||||
response = await client.get("custom://www.example.com")
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"app": "mounted"}
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("async_environment")
|
||||
async def test_async_mock_transport():
|
||||
async def hello_world(request):
|
||||
return httpx.Response(200, text="Hello, world!")
|
||||
|
||||
transport = httpx.MockTransport(hello_world)
|
||||
|
||||
async with httpx.AsyncClient(transport=transport) as client:
|
||||
response = await client.get("https://www.example.com")
|
||||
assert response.status_code == 200
|
||||
assert response.text == "Hello, world!"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user