Skip to content

Commit

Permalink
Testing extra params and query counting
Browse files Browse the repository at this point in the history
  • Loading branch information
cohaolain committed Aug 23, 2023
1 parent ab6acd3 commit 7c65751
Show file tree
Hide file tree
Showing 3 changed files with 166 additions and 2 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ __pycache__
build
dist
ryanair_py.egg-info
.coverage
*coverage*

*.iml
inspectionProfiles
modules.xml
vcs.xml
.idea
.idea
.vscode
1 change: 1 addition & 0 deletions ryanair/ryanair.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ def _on_query_error(e):
on_giveup=_on_query_error,
)
def _retryable_query(self, url, params=None):
self._num_queries += 1
response = self.session.get(url, params=params)
response.raise_for_status()
return response.json()
Expand Down
162 changes: 162 additions & 0 deletions tests/test_ryanair.py
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,7 @@ def test_get_cheapest_return_flights_handles_errors(self, mock_get_session):
"2023-10-01",
"2023-10-30",
)
self.assertEqual(ryanair_instance.num_queries, 5)

# Test the retryable_query method's retry mechanism
@patch("ryanair.SessionManager.SessionManager.get_session")
Expand All @@ -458,6 +459,7 @@ def test_retryable_query_retries_on_failure(self, mock_get_session):
mock_get_session.return_value.get.assert_has_calls(
[call("mock_url", params=None), call("mock_url", params=None)]
)
self.assertEqual(ryanair_instance.num_queries, 2)

# Ensure we don't try more than 5 times
@patch("ryanair.SessionManager.SessionManager.get_session")
Expand Down Expand Up @@ -488,6 +490,7 @@ def test_retryable_query_retries_on_failure_5_times(self, mock_get_session):
call("mock_url", params=None),
]
)
self.assertEqual(ryanair_instance.num_queries, 5)

# Test logging
@patch("ryanair.SessionManager.SessionManager.get_session")
Expand All @@ -501,6 +504,165 @@ def test_logging_for_errors(self, mock_logger, mock_get_session):

mock_logger.exception.assert_called_once_with(mock.ANY)

@patch("ryanair.SessionManager.SessionManager.get_session")
def test_currency_added_to_relevant_queries_if_provided(self, mock_get_session):
mock_get_session.return_value.get.return_value.json.return_value = {"fares": []}

ryanair_instance = Ryanair("EUR")
ryanair_instance.get_cheapest_flights("DUB", "2023-08-23", "2023-08-23")
ryanair_instance.get_cheapest_return_flights(
"DUB", "2023-08-23", "2023-08-23", "2023-09-25", "2023-09-25"
)

mock_get_session.return_value.get.assert_has_calls(
[
call(
mock.ANY,
params={
"departureAirportIataCode": "DUB",
"outboundDepartureDateFrom": "2023-08-23",
"outboundDepartureDateTo": "2023-08-23",
"outboundDepartureTimeFrom": "00:00",
"outboundDepartureTimeTo": "23:59",
"currency": "EUR",
},
),
call(
mock.ANY,
params={
"departureAirportIataCode": "DUB",
"outboundDepartureDateFrom": "2023-08-23",
"outboundDepartureDateTo": "2023-08-23",
"inboundDepartureDateFrom": "2023-09-25",
"inboundDepartureDateTo": "2023-09-25",
"outboundDepartureTimeFrom": "00:00",
"outboundDepartureTimeTo": "23:59",
"inboundDepartureTimeFrom": "00:00",
"inboundDepartureTimeTo": "23:59",
"currency": "EUR",
},
),
],
any_order=True,
)

@patch("ryanair.SessionManager.SessionManager.get_session")
def test_currency_not_added_to_relevant_queries_if_not_provided(
self, mock_get_session
):
mock_get_session.return_value.get.return_value.json.return_value = {"fares": []}

ryanair_instance = Ryanair()
ryanair_instance.get_cheapest_flights("DUB", "2023-08-23", "2023-08-23")
ryanair_instance.get_cheapest_return_flights(
"DUB", "2023-08-23", "2023-08-23", "2023-09-25", "2023-09-25"
)

mock_get_session.return_value.get.assert_has_calls(
[
call(
mock.ANY,
params={
"departureAirportIataCode": "DUB",
"outboundDepartureDateFrom": "2023-08-23",
"outboundDepartureDateTo": "2023-08-23",
"outboundDepartureTimeFrom": "00:00",
"outboundDepartureTimeTo": "23:59",
},
),
call(
mock.ANY,
params={
"departureAirportIataCode": "DUB",
"outboundDepartureDateFrom": "2023-08-23",
"outboundDepartureDateTo": "2023-08-23",
"inboundDepartureDateFrom": "2023-09-25",
"inboundDepartureDateTo": "2023-09-25",
"outboundDepartureTimeFrom": "00:00",
"outboundDepartureTimeTo": "23:59",
"inboundDepartureTimeFrom": "00:00",
"inboundDepartureTimeTo": "23:59",
},
),
],
any_order=True,
)

@patch("ryanair.SessionManager.SessionManager.get_session")
def test_optional_param_added_to_relevant_queries_if_provided(
self, mock_get_session
):
mock_get_session.return_value.get.return_value.json.return_value = {"fares": []}

ryanair_instance = Ryanair()
ryanair_instance.get_cheapest_flights(
"DUB",
"2023-08-23",
"2023-08-23",
destination_airport="LGW",
max_price=100,
destination_country="UK",
custom_params={"custom": "cVal"},
)
ryanair_instance.get_cheapest_return_flights(
"DUB",
"2023-08-23",
"2023-08-23",
"2023-09-25",
"2023-09-25",
destination_country="DE",
destination_airport="LGW",
max_price=100,
custom_params={"custom2": "cVal2"},
)

mock_get_session.return_value.get.assert_has_calls(
[
call(
mock.ANY,
params={
"departureAirportIataCode": "DUB",
"outboundDepartureDateFrom": "2023-08-23",
"outboundDepartureDateTo": "2023-08-23",
"outboundDepartureTimeFrom": "00:00",
"outboundDepartureTimeTo": "23:59",
"arrivalAirportIataCode": "LGW",
"arrivalCountryCode": "UK",
"priceValueTo": 100,
"custom": "cVal",
},
),
call(
mock.ANY,
params={
"departureAirportIataCode": "DUB",
"outboundDepartureDateFrom": "2023-08-23",
"outboundDepartureDateTo": "2023-08-23",
"inboundDepartureDateFrom": "2023-09-25",
"inboundDepartureDateTo": "2023-09-25",
"outboundDepartureTimeFrom": "00:00",
"outboundDepartureTimeTo": "23:59",
"inboundDepartureTimeFrom": "00:00",
"inboundDepartureTimeTo": "23:59",
"arrivalCountryCode": "DE",
"priceValueTo": 100,
"arrivalAirportIataCode": "LGW",
"custom2": "cVal2",
},
),
],
any_order=True,
)

# if self.currency:
# params["currency"] = self.currency
# if destination_country:
# params["arrivalCountryCode"] = destination_country
# if max_price:
# params["priceValueTo"] = max_price
# if destination_airport:
# params["arrivalAirportIataCode"] = destination_airport


if __name__ == "__main__":
unittest.main()

0 comments on commit 7c65751

Please sign in to comment.