From ffefc4d53daf6976c1585a8fb0306fb8fe1da102 Mon Sep 17 00:00:00 2001 From: Sakan Date: Wed, 3 Jul 2024 18:25:46 +0700 Subject: [PATCH] v4.9.0 - Adjusted how the city and currency data from GraphQL response are checked - Adjusted tests for check_info func --- .../graphql_scraper.py | 2 +- tests/test_graphql/test_check_info.py | 383 +++++++++++++++++- 2 files changed, 380 insertions(+), 5 deletions(-) diff --git a/japan_avg_hotel_price_finder/graphql_scraper.py b/japan_avg_hotel_price_finder/graphql_scraper.py index 54a946f..ce3ff47 100644 --- a/japan_avg_hotel_price_finder/graphql_scraper.py +++ b/japan_avg_hotel_price_finder/graphql_scraper.py @@ -462,7 +462,7 @@ def check_info( city_data = check_city_data(data) selected_currency_data = check_currency_data(data) - if total_page_num and city_data and selected_currency_data: + if total_page_num: data_mapping = { "city": city_data, "check_in": data['data']['searchQueries']['search']['flexibleDatesConfig']['dateRangeCalendar']['checkin'][0], diff --git a/tests/test_graphql/test_check_info.py b/tests/test_graphql/test_check_info.py index 53f783d..ed67066 100644 --- a/tests/test_graphql/test_check_info.py +++ b/tests/test_graphql/test_check_info.py @@ -14,7 +14,7 @@ def test_returns_correct_total_page_number_and_data_mapping(): 'searchQueries': { 'search': { 'pagination': {'nbResultsTotal': 1}, - 'breadcrumbs': [{}, {}, {'name': 'Test City'}], + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], 'flexibleDatesConfig': { 'dateRangeCalendar': { 'checkin': ['2023-01-01'], @@ -71,7 +71,7 @@ def test_handles_response_with_missing_or_null_fields_gracefully(): 'searchQueries': { 'search': { 'pagination': {'nbResultsTotal': 1}, - 'breadcrumbs': [{}, {}, {'name': None}], + 'breadcrumbs': [{}, {}, {'name': None, 'destType': 'CITY'}], 'flexibleDatesConfig': { 'dateRangeCalendar': { 'checkin': [None], @@ -115,6 +115,58 @@ def test_handles_response_with_missing_or_null_fields_gracefully(): assert error_message == "Error City not match: Test City != None" +def test_handles_response_with_currency_is_none(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ["2023-01-01"], + 'checkout': ["2023-01-02"] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 1, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': None} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + # When + error_message = '' + try: + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + except SystemExit as e: + error_message = str(e) + + # Then + assert error_message == "Error Selected Currency not match: USD != None" + def test_data_mapping_dictionary_keys(): # Given response_mock = Mock() @@ -124,7 +176,7 @@ def test_data_mapping_dictionary_keys(): 'searchQueries': { 'search': { 'pagination': {'nbResultsTotal': 1}, - 'breadcrumbs': [{}, {}, {'name': 'Test City'}], + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], 'flexibleDatesConfig': { 'dateRangeCalendar': { 'checkin': ['2023-01-01'], @@ -172,6 +224,329 @@ def test_data_mapping_dictionary_keys(): }) +def test_data_mapping_check_in_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-02-01'], + 'checkout': ['2023-01-02'] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 1, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'USD'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + + +def test_data_mapping_check_out_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-01-01'], + 'checkout': ['2023-02-02'] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 1, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'USD'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + + +def test_data_mapping_adult_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-01-01'], + 'checkout': ['2023-02-02'] + } + }, + 'searchMeta': { + 'nbAdults': 10, + 'nbChildren': 1, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'USD'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + + +def test_data_mapping_room_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-01-01'], + 'checkout': ['2023-02-02'] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 1, + 'nbRooms': 10 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'USD'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + +def test_data_mapping_children_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-01-01'], + 'checkout': ['2023-02-02'] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 10, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'USD'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + + +def test_data_mapping_currency_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-01-01'], + 'checkout': ['2023-02-02'] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 1, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'GBP'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + + +def test_data_mapping_city_not_match(): + # Given + response_mock = Mock() + response_mock.status_code = 200 + response_mock.json.return_value = { + 'data': { + 'searchQueries': { + 'search': { + 'pagination': {'nbResultsTotal': 1}, + 'breadcrumbs': [{}, {}, {'name': 'Tokyo', 'destType': 'CITY'}], + 'flexibleDatesConfig': { + 'dateRangeCalendar': { + 'checkin': ['2023-01-01'], + 'checkout': ['2023-02-02'] + } + }, + 'searchMeta': { + 'nbAdults': 2, + 'nbChildren': 1, + 'nbRooms': 1 + }, + 'results': [{ + 'blocks': [{ + 'finalPrice': {'currency': 'USD'} + }] + }] + } + } + } + } + entered_city = "Test City" + entered_check_in = "2023-01-01" + entered_check_out = "2023-01-02" + entered_selected_currency = "USD" + entered_num_adult = 2 + entered_num_children = 1 + entered_num_room = 1 + + with pytest.raises(SystemExit): + check_info( + response_mock, entered_city, entered_check_in, entered_check_out, + entered_selected_currency, entered_num_adult, entered_num_children, + entered_num_room + ) + + + + def test_data_mapping_extraction(): # Given response_mock = Mock() @@ -181,7 +556,7 @@ def test_data_mapping_extraction(): 'searchQueries': { 'search': { 'pagination': {'nbResultsTotal': 1}, - 'breadcrumbs': [{}, {}, {'name': 'Test City'}], + 'breadcrumbs': [{}, {}, {'name': 'Test City', 'destType': 'CITY'}], 'flexibleDatesConfig': { 'dateRangeCalendar': { 'checkin': ['2023-01-01'],