Skip to content

Commit

Permalink
Merge pull request #241 from QuantConnect/bug-add-request-response-ve…
Browse files Browse the repository at this point in the history
…rbose

Log requests in verbose mode
  • Loading branch information
Martin-Molinero authored Dec 1, 2022
2 parents 7279ee6 + 7885e48 commit 8bbeae9
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 17 deletions.
3 changes: 3 additions & 0 deletions lean/components/api/api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ def _request(self, method: str, endpoint: str, options: Dict[str, Any] = {}, ret
raise_for_status=False,
**options)

if self._logger.debug_logging_enabled:
self._logger.debug(f"Request response: {response.text}")

if 500 <= response.status_code < 600 and retry_http_5xx:
return self._request(method, endpoint, options, False)

Expand Down
57 changes: 40 additions & 17 deletions tests/components/api/test_api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,17 @@
from lean.models.errors import AuthenticationError, RequestFailedError


def test_get_logger():
logger = mock.MagicMock()
logger.debug_logging_enabled = mock.PropertyMock()
logger.debug_logging_enabled = False
return logger

def test_get_makes_get_request_to_given_endpoint(requests_mock: RequestsMock) -> None:
requests_mock.add(requests_mock.GET, API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
api.get("endpoint")

assert len(requests_mock.calls) == 1
Expand All @@ -38,7 +45,8 @@ def test_get_makes_get_request_to_given_endpoint(requests_mock: RequestsMock) ->
def test_get_attaches_parameters_to_url(requests_mock: RequestsMock) -> None:
requests_mock.add(requests_mock.GET, API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
api.get("endpoint", {"key1": "value1", "key2": "value2"})

assert len(requests_mock.calls) == 1
Expand All @@ -48,7 +56,8 @@ def test_get_attaches_parameters_to_url(requests_mock: RequestsMock) -> None:
def test_post_makes_post_request_to_given_endpoint(requests_mock: RequestsMock) -> None:
requests_mock.add(requests_mock.POST, API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
api.post("endpoint")

assert len(requests_mock.calls) == 1
Expand All @@ -58,7 +67,8 @@ def test_post_makes_post_request_to_given_endpoint(requests_mock: RequestsMock)
def test_post_sets_body_of_request_as_json(requests_mock: RequestsMock) -> None:
requests_mock.add(requests_mock.POST, API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
api.post("endpoint", {"key1": "value1", "key2": "value2"})

assert len(requests_mock.calls) == 1
Expand All @@ -73,7 +83,8 @@ def test_post_sets_body_of_request_as_json(requests_mock: RequestsMock) -> None:
def test_post_sets_body_of_request_as_form_data(requests_mock: RequestsMock) -> None:
requests_mock.add(requests_mock.POST, API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
api.post("endpoint", {"key1": "value1", "key2": "value2"}, data_as_json=False)

assert len(requests_mock.calls) == 1
Expand All @@ -86,7 +97,8 @@ def test_post_sets_body_of_request_as_form_data(requests_mock: RequestsMock) ->
def test_api_client_makes_authenticated_requests(method: str, requests_mock: RequestsMock) -> None:
requests_mock.add(method.upper(), API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
getattr(api, method)("endpoint")

assert len(requests_mock.calls) == 1
Expand All @@ -101,7 +113,8 @@ def test_api_client_makes_authenticated_requests(method: str, requests_mock: Req
def test_api_client_returns_data_when_success_is_true(method: str, requests_mock: RequestsMock) -> None:
requests_mock.add(method.upper(), API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
response = getattr(api, method)("endpoint")

assert "success" in response
Expand All @@ -112,7 +125,8 @@ def test_api_client_returns_data_when_success_is_true(method: str, requests_mock
def test_api_client_raises_authentication_error_on_http_500(method: str, requests_mock: RequestsMock) -> None:
requests_mock.add(method.upper(), API_BASE_URL + "endpoint", status=500)

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(AuthenticationError):
getattr(api, method)("endpoint")
Expand All @@ -123,7 +137,8 @@ def test_api_client_raises_request_failed_error_on_failing_response_non_http_500
requests_mock: RequestsMock) -> None:
requests_mock.add(method.upper(), API_BASE_URL + "endpoint", status=404)

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(RequestFailedError):
getattr(api, method)("endpoint")
Expand All @@ -136,7 +151,8 @@ def test_api_client_raises_authentication_error_on_error_complaining_about_hash(
API_BASE_URL + "endpoint",
'{ "success": false, "errors": ["Hash doesn\'t match."] }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(AuthenticationError):
getattr(api, method)("endpoint")
Expand All @@ -149,7 +165,8 @@ def test_api_client_raises_request_failed_error_when_response_contains_errors(me
API_BASE_URL + "endpoint",
'{ "success": false, "errors": ["Error 1", "Error 2"] }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(RequestFailedError) as error:
getattr(api, method)("endpoint")
Expand All @@ -164,7 +181,8 @@ def test_api_client_raises_request_failed_error_when_response_contains_messages(
API_BASE_URL + "endpoint",
'{ "success": false, "messages": ["Message 1", "Message 2"] }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(RequestFailedError) as error:
getattr(api, method)("endpoint")
Expand All @@ -179,7 +197,8 @@ def test_api_client_raises_request_failed_error_when_response_contains_internal_
API_BASE_URL + "endpoint",
'{ "success": false, "Message": "Internal Error 21" }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(RequestFailedError) as error:
getattr(api, method)("endpoint")
Expand All @@ -197,7 +216,8 @@ def test_api_client_retries_request_when_response_is_http_5xx_error(method: str,
requests_mock: RequestsMock) -> None:
requests_mock.add(method.upper(), API_BASE_URL + "endpoint", status=status_code)

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

with pytest.raises(expected_error):
getattr(api, method)("endpoint")
Expand All @@ -209,7 +229,8 @@ def test_api_client_retries_request_when_response_is_http_5xx_error(method: str,
def test_api_client_sets_user_agent(method: str, requests_mock: RequestsMock) -> None:
requests_mock.add(method.upper(), API_BASE_URL + "endpoint", '{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")
getattr(api, method)("endpoint")

assert len(requests_mock.calls) == 1
Expand All @@ -223,7 +244,8 @@ def test_is_authenticated_returns_true_when_authenticated_request_succeeds(reque
requests_mock.add(requests_mock.GET, re.compile(".*"), body='{ "success": true }')
requests_mock.add(requests_mock.POST, re.compile(".*"), body='{ "success": true }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

assert api.is_authenticated()

Expand All @@ -233,6 +255,7 @@ def test_is_authenticated_returns_false_when_authenticated_request_fails(request
requests_mock.add(requests_mock.GET, re.compile(".*"), body='{ "success": false }')
requests_mock.add(requests_mock.POST, re.compile(".*"), body='{ "success": false }')

api = APIClient(mock.Mock(), HTTPClient(mock.Mock()), "123", "456")
logger = test_get_logger()
api = APIClient(logger, HTTPClient(logger), "123", "456")

assert not api.is_authenticated()

0 comments on commit 8bbeae9

Please sign in to comment.