diff options
author | maxim-yurchuk <maxim-yurchuk@yandex-team.com> | 2024-10-09 12:29:46 +0300 |
---|---|---|
committer | maxim-yurchuk <maxim-yurchuk@yandex-team.com> | 2024-10-09 13:14:22 +0300 |
commit | 9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch) | |
tree | a8fb3181d5947c0d78cf402aa56e686130179049 /contrib/python/requests-mock/py3/tests/pytest/test_with_pytest.py | |
parent | a44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff) | |
download | ydb-9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80.tar.gz |
publishFullContrib: true for ydb
<HIDDEN_URL>
commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/python/requests-mock/py3/tests/pytest/test_with_pytest.py')
-rw-r--r-- | contrib/python/requests-mock/py3/tests/pytest/test_with_pytest.py | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/contrib/python/requests-mock/py3/tests/pytest/test_with_pytest.py b/contrib/python/requests-mock/py3/tests/pytest/test_with_pytest.py new file mode 100644 index 00000000000..d74908bc387 --- /dev/null +++ b/contrib/python/requests-mock/py3/tests/pytest/test_with_pytest.py @@ -0,0 +1,119 @@ +try: + from http import HTTPStatus + HTTP_STATUS_FOUND = HTTPStatus.FOUND +except ImportError: + from httplib import FOUND as HTTP_STATUS_FOUND + +import pytest +import requests +import requests_mock + + +def test_simple(requests_mock): + requests_mock.get('https://httpbin.org/get', text='data') + assert 'data' == requests.get('https://httpbin.org/get').text + + +def test_redirect_and_nesting(): + url_inner = "inner-mock://example.test/" + url_middle = "middle-mock://example.test/" + url_outer = "outer-mock://example.test/" + url_base = "https://www.example.com/" + + text_middle = 'middle' + url_middle + text_outer = 'outer' + url_outer + text_base = 'outer' + url_base + + with requests_mock.Mocker() as outer_mock: + outer_mock.get(url_base, text=text_base) + outer_mock.get(url_outer, text=text_outer) + + with requests_mock.Mocker(real_http=True) as middle_mock: + middle_mock.get(url_middle, text=text_middle) + + with requests_mock.Mocker() as inner_mock: + inner_mock.post(url_inner, + status_code=HTTP_STATUS_FOUND, + headers={'location': url_base}) + inner_mock.get(url_base, real_http=True) + + assert text_base == requests.post(url_inner).text # nosec + + with pytest.raises(requests_mock.NoMockAddress): + requests.get(url_middle) + + with pytest.raises(requests_mock.NoMockAddress): + requests.get(url_outer) + + # back to middle mock + with pytest.raises(requests_mock.NoMockAddress): + requests.post(url_inner) + + assert text_middle == requests.get(url_middle).text # nosec + assert text_outer == requests.get(url_outer).text # nosec + + # back to outter mock + with pytest.raises(requests_mock.NoMockAddress): + requests.post(url_inner) + + with pytest.raises(requests_mock.NoMockAddress): + requests.get(url_middle) + + assert text_outer == requests.get(url_outer).text # nosec + + +def test_mixed_mocks(): + url = 'mock://example.test/' + with requests_mock.Mocker() as global_mock: + global_mock.get(url, text='global') + session = requests.Session() + text = session.get(url).text + assert text == 'global' # nosec + with requests_mock.Mocker(session=session) as session_mock: + session_mock.get(url, real_http=True) + text = session.get(url).text + assert text == 'global' # nosec + + +def test_threaded_sessions(): + """ + When using requests_futures.FuturesSession() with a ThreadPoolExecutor + there is a race condition where one threaded request removes the + monkeypatched get_adapter() method from the Session before another threaded + request is finished using it. + """ + from requests_futures.sessions import FuturesSession + + url1 = 'http://www.example.com/requests-mock-fake-url1' + url2 = 'http://www.example.com/requests-mock-fake-url2' + + with requests_mock.Mocker() as m: + # respond with 204 so we know its us + m.get(url1, status_code=204) + m.get(url2, status_code=204) + + # NOTE(phodge): just firing off two .get() requests right after each + # other was a pretty reliable way to reproduce the race condition on my + # intel Macbook Pro but YMMV. Guaranteeing the race condition to + # reappear might require replacing the Session.send() with a wrapper + # that delays kicking off the request for url1 until the request for + # url2 has restored the original session.get_adapter(), but replacing + # Session.send() could be difficult because the requests_mock.Mocker() + # context manager has *already* monkeypatched this method. + session = FuturesSession() + future1 = session.get(url1) + future2 = session.get(url2) + + # verify both requests were handled by the mock dispatcher + assert future1.result().status_code == 204 + assert future2.result().status_code == 204 + + +class TestClass(object): + + def configure(self, requests_mock): + requests_mock.get('https://httpbin.org/get', text='data') + + def test_one(self, requests_mock): + self.configure(requests_mock) + assert 'data' == requests.get('https://httpbin.org/get').text |