http.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import os
  2. from json import dumps
  3. from typing import Literal
  4. import httpx._api as httpx
  5. import pytest
  6. import requests.api as requests
  7. from _pytest.monkeypatch import MonkeyPatch
  8. from httpx import Request as HttpxRequest
  9. from requests import Response as RequestsResponse
  10. from yarl import URL
  11. MOCK = os.getenv('MOCK_SWITCH', 'false') == 'true'
  12. class MockedHttp:
  13. def requests_request(method: Literal['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], url: str,
  14. **kwargs) -> RequestsResponse:
  15. """
  16. Mocked requests.request
  17. """
  18. response = RequestsResponse()
  19. response.url = str(URL(url) % kwargs.get('params', {}))
  20. response.headers = kwargs.get('headers', {})
  21. if url == 'http://404.com':
  22. response.status_code = 404
  23. response._content = b'Not Found'
  24. return response
  25. # get data, files
  26. data = kwargs.get('data', None)
  27. files = kwargs.get('files', None)
  28. if data is not None:
  29. resp = dumps(data).encode('utf-8')
  30. if files is not None:
  31. resp = dumps(files).encode('utf-8')
  32. else:
  33. resp = b'OK'
  34. response.status_code = 200
  35. response._content = resp
  36. return response
  37. def httpx_request(method: Literal['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
  38. url: str, **kwargs) -> httpx.Response:
  39. """
  40. Mocked httpx.request
  41. """
  42. response = httpx.Response(
  43. status_code=200,
  44. request=HttpxRequest(method, url)
  45. )
  46. response.headers = kwargs.get('headers', {})
  47. if url == 'http://404.com':
  48. response.status_code = 404
  49. response.content = b'Not Found'
  50. return response
  51. # get data, files
  52. data = kwargs.get('data', None)
  53. files = kwargs.get('files', None)
  54. if data is not None:
  55. resp = dumps(data).encode('utf-8')
  56. if files is not None:
  57. resp = dumps(files).encode('utf-8')
  58. else:
  59. resp = b'OK'
  60. response.status_code = 200
  61. response._content = resp
  62. return response
  63. @pytest.fixture
  64. def setup_http_mock(request, monkeypatch: MonkeyPatch):
  65. if not MOCK:
  66. yield
  67. return
  68. monkeypatch.setattr(requests, "request", MockedHttp.requests_request)
  69. monkeypatch.setattr(httpx, "request", MockedHttp.httpx_request)
  70. yield
  71. monkeypatch.undo()