mock.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import typing
  2. from .._models import Request, Response
  3. from .base import AsyncBaseTransport, BaseTransport
  4. SyncHandler = typing.Callable[[Request], Response]
  5. AsyncHandler = typing.Callable[[Request], typing.Coroutine[None, None, Response]]
  6. class MockTransport(AsyncBaseTransport, BaseTransport):
  7. def __init__(self, handler: typing.Union[SyncHandler, AsyncHandler]) -> None:
  8. self.handler = handler
  9. def handle_request(
  10. self,
  11. request: Request,
  12. ) -> Response:
  13. request.read()
  14. response = self.handler(request)
  15. if not isinstance(response, Response): # pragma: no cover
  16. raise TypeError("Cannot use an async handler in a sync Client")
  17. return response
  18. async def handle_async_request(
  19. self,
  20. request: Request,
  21. ) -> Response:
  22. await request.aread()
  23. response = self.handler(request)
  24. # Allow handler to *optionally* be an `async` function.
  25. # If it is, then the `response` variable need to be awaited to actually
  26. # return the result.
  27. if not isinstance(response, Response):
  28. response = await response
  29. return response