| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | from unittest.mock import patch, Mock | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import pytest | 
					
						
							|  |  |  | import requests | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-12 12:40:21 +02:00
										 |  |  | from haystack.utils.requests_utils import request_with_retry | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.unit | 
					
						
							| 
									
										
										
										
											2023-06-12 12:40:21 +02:00
										 |  |  | @patch("haystack.utils.requests_utils.requests.request") | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | def test_request_with_retry_defaults_successfully(mock_request): | 
					
						
							|  |  |  |     # Make requests with default retry configuration | 
					
						
							|  |  |  |     request_with_retry(method="GET", url="https://example.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Verifies request has not been retried | 
					
						
							|  |  |  |     mock_request.assert_called_once_with(method="GET", url="https://example.com", timeout=10) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.unit | 
					
						
							| 
									
										
										
										
											2023-06-12 12:40:21 +02:00
										 |  |  | @patch("haystack.utils.requests_utils.requests.request") | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | def test_request_with_retry_custom_timeout(mock_request): | 
					
						
							|  |  |  |     # Make requests with default retry configuration | 
					
						
							|  |  |  |     request_with_retry(method="GET", url="https://example.com", timeout=5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Verifies request has not been retried | 
					
						
							|  |  |  |     mock_request.assert_called_once_with(method="GET", url="https://example.com", timeout=5) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.unit | 
					
						
							| 
									
										
										
										
											2023-06-12 12:40:21 +02:00
										 |  |  | @patch("haystack.utils.requests_utils.requests.request") | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | def test_request_with_retry_failing_request_and_expected_status_code(mock_request): | 
					
						
							|  |  |  |     # Create fake failed response with status code that triggers retry | 
					
						
							|  |  |  |     fake_response = requests.Response() | 
					
						
							|  |  |  |     fake_response.status_code = 408 | 
					
						
							|  |  |  |     mock_request.return_value = fake_response | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Make request with expected status code and verify error is raised | 
					
						
							|  |  |  |     with pytest.raises(requests.HTTPError): | 
					
						
							| 
									
										
										
										
											2023-05-18 16:00:02 +02:00
										 |  |  |         request_with_retry(method="GET", url="https://example.com", timeout=1, attempts=2, status_codes_to_retry=[408]) | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Veries request has been retried the expected number of times | 
					
						
							|  |  |  |     assert mock_request.call_count == 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.unit | 
					
						
							| 
									
										
										
										
											2023-06-12 12:40:21 +02:00
										 |  |  | @patch("haystack.utils.requests_utils.requests.request") | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | def test_request_with_retry_failing_request_and_ignored_status_code(mock_request): | 
					
						
							|  |  |  |     # Create fake failed response with status code that doesn't trigger retry | 
					
						
							|  |  |  |     fake_response = requests.Response() | 
					
						
							|  |  |  |     fake_response.status_code = 500 | 
					
						
							|  |  |  |     mock_request.return_value = fake_response | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Make request with status code that won't trigger a retry and verify error is raised | 
					
						
							|  |  |  |     with pytest.raises(requests.HTTPError): | 
					
						
							| 
									
										
										
										
											2023-05-18 16:00:02 +02:00
										 |  |  |         request_with_retry(method="GET", url="https://example.com", timeout=1, status_codes_to_retry=[404]) | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify request has not been retried | 
					
						
							|  |  |  |     mock_request.assert_called_once() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.unit | 
					
						
							| 
									
										
										
										
											2023-06-12 12:40:21 +02:00
										 |  |  | @patch("haystack.utils.requests_utils.requests.request") | 
					
						
							| 
									
										
										
										
											2023-04-11 10:35:39 +02:00
										 |  |  | def test_request_with_retry_timed_out_request(mock_request: Mock): | 
					
						
							|  |  |  |     # Make request fail cause of a timeout | 
					
						
							|  |  |  |     mock_request.side_effect = TimeoutError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Make request and verifies it fails | 
					
						
							|  |  |  |     with pytest.raises(TimeoutError): | 
					
						
							|  |  |  |         request_with_retry(method="GET", url="https://example.com", timeout=1, attempts=2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Verifies request has been retried the expected number of times | 
					
						
							|  |  |  |     assert mock_request.call_count == 2 |