http.py 1.4 KB

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