http.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import os
  2. from json import dumps
  3. from typing import Literal
  4. import httpx
  5. import pytest
  6. from _pytest.monkeypatch import MonkeyPatch
  7. MOCK = os.getenv("MOCK_SWITCH", "false") == "true"
  8. class MockedHttp:
  9. def httpx_request(
  10. method: Literal["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"], url: str, **kwargs
  11. ) -> httpx.Response:
  12. """
  13. Mocked httpx.request
  14. """
  15. if url == "http://404.com":
  16. response = httpx.Response(status_code=404, request=httpx.Request(method, url), content=b"Not Found")
  17. return response
  18. # get data, files
  19. data = kwargs.get("data", None)
  20. files = kwargs.get("files", None)
  21. if data is not None:
  22. resp = dumps(data).encode("utf-8")
  23. elif files is not None:
  24. resp = dumps(files).encode("utf-8")
  25. else:
  26. resp = b"OK"
  27. response = httpx.Response(
  28. status_code=200, request=httpx.Request(method, url), headers=kwargs.get("headers", {}), content=resp
  29. )
  30. return response
  31. @pytest.fixture
  32. def setup_http_mock(request, monkeypatch: MonkeyPatch):
  33. if not MOCK:
  34. yield
  35. return
  36. monkeypatch.setattr(httpx, "request", MockedHttp.httpx_request)
  37. yield
  38. monkeypatch.undo()