test_with_pytest.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. try:
  2. from http import HTTPStatus
  3. HTTP_STATUS_FOUND = HTTPStatus.FOUND
  4. except ImportError:
  5. from httplib import FOUND as HTTP_STATUS_FOUND
  6. import pytest
  7. import requests
  8. import requests_mock
  9. def test_simple(requests_mock):
  10. requests_mock.get('https://httpbin.org/get', text='data')
  11. assert 'data' == requests.get('https://httpbin.org/get').text
  12. def test_redirect_and_nesting():
  13. url_inner = "inner-mock://example.test/"
  14. url_middle = "middle-mock://example.test/"
  15. url_outer = "outer-mock://example.test/"
  16. url_base = "https://www.example.com/"
  17. text_middle = 'middle' + url_middle
  18. text_outer = 'outer' + url_outer
  19. text_base = 'outer' + url_base
  20. with requests_mock.Mocker() as outer_mock:
  21. outer_mock.get(url_base, text=text_base)
  22. outer_mock.get(url_outer, text=text_outer)
  23. with requests_mock.Mocker(real_http=True) as middle_mock:
  24. middle_mock.get(url_middle, text=text_middle)
  25. with requests_mock.Mocker() as inner_mock:
  26. inner_mock.post(url_inner,
  27. status_code=HTTP_STATUS_FOUND,
  28. headers={'location': url_base})
  29. inner_mock.get(url_base, real_http=True)
  30. assert text_base == requests.post(url_inner).text # nosec
  31. with pytest.raises(requests_mock.NoMockAddress):
  32. requests.get(url_middle)
  33. with pytest.raises(requests_mock.NoMockAddress):
  34. requests.get(url_outer)
  35. # back to middle mock
  36. with pytest.raises(requests_mock.NoMockAddress):
  37. requests.post(url_inner)
  38. assert text_middle == requests.get(url_middle).text # nosec
  39. assert text_outer == requests.get(url_outer).text # nosec
  40. # back to outter mock
  41. with pytest.raises(requests_mock.NoMockAddress):
  42. requests.post(url_inner)
  43. with pytest.raises(requests_mock.NoMockAddress):
  44. requests.get(url_middle)
  45. assert text_outer == requests.get(url_outer).text # nosec
  46. def test_mixed_mocks():
  47. url = 'mock://example.test/'
  48. with requests_mock.Mocker() as global_mock:
  49. global_mock.get(url, text='global')
  50. session = requests.Session()
  51. text = session.get(url).text
  52. assert text == 'global' # nosec
  53. with requests_mock.Mocker(session=session) as session_mock:
  54. session_mock.get(url, real_http=True)
  55. text = session.get(url).text
  56. assert text == 'global' # nosec
  57. def test_threaded_sessions():
  58. """
  59. When using requests_futures.FuturesSession() with a ThreadPoolExecutor
  60. there is a race condition where one threaded request removes the
  61. monkeypatched get_adapter() method from the Session before another threaded
  62. request is finished using it.
  63. """
  64. from requests_futures.sessions import FuturesSession
  65. url1 = 'http://www.example.com/requests-mock-fake-url1'
  66. url2 = 'http://www.example.com/requests-mock-fake-url2'
  67. with requests_mock.Mocker() as m:
  68. # respond with 204 so we know its us
  69. m.get(url1, status_code=204)
  70. m.get(url2, status_code=204)
  71. # NOTE(phodge): just firing off two .get() requests right after each
  72. # other was a pretty reliable way to reproduce the race condition on my
  73. # intel Macbook Pro but YMMV. Guaranteeing the race condition to
  74. # reappear might require replacing the Session.send() with a wrapper
  75. # that delays kicking off the request for url1 until the request for
  76. # url2 has restored the original session.get_adapter(), but replacing
  77. # Session.send() could be difficult because the requests_mock.Mocker()
  78. # context manager has *already* monkeypatched this method.
  79. session = FuturesSession()
  80. future1 = session.get(url1)
  81. future2 = session.get(url2)
  82. # verify both requests were handled by the mock dispatcher
  83. assert future1.result().status_code == 204
  84. assert future2.result().status_code == 204
  85. class TestClass(object):
  86. def configure(self, requests_mock):
  87. requests_mock.get('https://httpbin.org/get', text='data')
  88. def test_one(self, requests_mock):
  89. self.configure(requests_mock)
  90. assert 'data' == requests.get('https://httpbin.org/get').text