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. @staticmethod
  10. def httpx_request(
  11. method: Literal["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"], url: str, **kwargs
  12. ) -> httpx.Response:
  13. """
  14. Mocked httpx.request
  15. """
  16. if url == "http://404.com":
  17. response = httpx.Response(status_code=404, request=httpx.Request(method, url), content=b"Not Found")
  18. return response
  19. # get data, files
  20. data = kwargs.get("data")
  21. files = kwargs.get("files")
  22. if data is not None:
  23. resp = dumps(data).encode("utf-8")
  24. elif files is not None:
  25. resp = dumps(files).encode("utf-8")
  26. else:
  27. resp = b"OK"
  28. response = httpx.Response(
  29. status_code=200, request=httpx.Request(method, url), headers=kwargs.get("headers", {}), content=resp
  30. )
  31. return response
  32. @pytest.fixture
  33. def setup_http_mock(request, monkeypatch: MonkeyPatch):
  34. if not MOCK:
  35. yield
  36. return
  37. monkeypatch.setattr(httpx, "request", MockedHttp.httpx_request)
  38. yield
  39. monkeypatch.undo()