from unittest import mock from tests.integration.utils import get mocked_requests_history = {} def mocked_requests_get(url, headers): class MockResponse: def __init__(self, status_code): self.status_code = status_code if mocked_requests_history.get(url): mocked_requests_history[url] += 1 else: mocked_requests_history[url] = 1 call_count = mocked_requests_history[url] if url == "mock_succeed_3rd_attempt": if call_count >= 3: return MockResponse(200) else: return MockResponse(502) if url == "mock_always_fails": return MockResponse(502) if url == "non_500_first_attempt": return MockResponse(404) return MockResponse(200) def test_succeeds_first_attempt(): with ( mock.patch("tests.integration.utils.sleep") as sleep, mock.patch("requests.get", side_effect=mocked_requests_get) as mock_get, ): r = get("non_500_first_attempt", {}) assert mock_get.call_count == 1 assert r.status_code == 404 assert sleep.call_count == 0 def test_fails_after_max_attempts(): with ( mock.patch("tests.integration.utils.sleep") as sleep, mock.patch("requests.get", side_effect=mocked_requests_get) as mock_get, ): r = get("mock_always_fails", {}) assert mock_get.call_count == 5 assert r.status_code == 502 assert sleep.call_count == 4 assert sleep.call_args_list[-1][0][0] == 16 def test_success_after_3rd_attempt(): with ( mock.patch("tests.integration.utils.sleep") as sleep, mock.patch("requests.get", side_effect=mocked_requests_get) as mock_get, ): # mock a success after 3rd attempt r = get("mock_succeed_3rd_attempt", {}) assert mock_get.call_count == 3 assert r.status_code == 200 assert sleep.call_count == 2 assert sleep.call_args_list[-1][0][0] == 4