Allow handler to optionally be async when MockTransport is used with AsyncClient (#1449)

This commit is contained in:
Tom Christie 2021-02-17 11:10:21 +00:00 committed by GitHub
parent 645ae4ed9c
commit 084f35648b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 0 deletions

View File

@ -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,

View File

@ -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!"