mock.py 1.2 KB

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