From d11616d21cd31e07b7ebce7884402c4109116fa6 Mon Sep 17 00:00:00 2001 From: Gabriel Mechali Date: Tue, 1 Oct 2024 22:18:49 -0400 Subject: [PATCH] Fixed tests for webdriver and flask route. --- .../routes/shared_api/autocomplete/helpers.py | 4 - server/tests/routes/api/autocomplete_test.py | 38 +++---- server/tests/routes/api/mock_data.py | 40 +++++++ server/webdriver/tests/homepage_test.py | 8 +- .../nl_search_bar/auto_complete_input.tsx | 14 ++- .../auto_complete_suggestions.tsx | 104 ++++++++++-------- .../nl_search_bar/nl_search_bar_standard.tsx | 2 +- static/js/shared/util.ts | 5 +- 8 files changed, 130 insertions(+), 85 deletions(-) diff --git a/server/routes/shared_api/autocomplete/helpers.py b/server/routes/shared_api/autocomplete/helpers.py index bd76ad2a23..ee282187c8 100644 --- a/server/routes/shared_api/autocomplete/helpers.py +++ b/server/routes/shared_api/autocomplete/helpers.py @@ -89,8 +89,4 @@ def issue_maps_predictions_requests(queries: List[str], lang: str): if len(responses) >= MAX_MAPS_RESPONSES: return responses - - print("All my responses:\n\n\n") - print(responses) - return responses diff --git a/server/tests/routes/api/autocomplete_test.py b/server/tests/routes/api/autocomplete_test.py index 0828a1f37c..3c99eee498 100644 --- a/server/tests/routes/api/autocomplete_test.py +++ b/server/tests/routes/api/autocomplete_test.py @@ -18,29 +18,30 @@ import unittest from unittest.mock import patch +import server.tests.routes.api.mock_data as mock_data from web_app import app class TestAutocomplete(unittest.TestCase): + def run_autocomplete_query(self, query: str, lang: str): return app.test_client().post( - "/api/autocomplete?query=`${query}`&hl=${lang}", - json={}) + "/api/autocomplete?query=`${query}`&hl=${lang}", json={}) lang = 'en' - @patch('server.routes.shared_api.autocomplete.helpers.issue_maps_predictions_requests') + @patch( + 'server.routes.shared_api.autocomplete.helpers.issue_maps_predictions_requests' + ) @patch('server.routes.shared_api.place.fetch.resolve_id') - def test_empty_query(self, mock_resolve_ids, mock_issue_maps_predictions_requests): + def test_empty_query(self, mock_resolve_ids, + mock_issue_maps_predictions_requests): + def resolve_ids_side_effect(nodes, in_prop, out_prop): - return { - '1': { 'dcid': 'place1' }, - '2': { 'dcid': 'place3' }, - '3': { 'dcid': 'place1' } - } + return [] def mock_issue_maps_predictions_requests_effect(query, lang): - return [] + return {} mock_resolve_ids.side_effect = resolve_ids_side_effect mock_issue_maps_predictions_requests.side_effect = mock_issue_maps_predictions_requests_effect @@ -51,19 +52,18 @@ def mock_issue_maps_predictions_requests_effect(query, lang): response_dict = json.loads(response.data.decode("utf-8")) self.assertEqual(len(response_dict["predictions"]), 0) - @patch('server.routes.shared_api.autocomplete.helpers.issue_maps_predictions_requests') + @patch( + 'server.routes.shared_api.autocomplete.helpers.issue_maps_predictions_requests' + ) @patch('server.routes.shared_api.place.fetch.resolve_id') - def test_single_word_query(self, mock_resolve_ids, mock_issue_maps_predictions_requests): + def test_single_word_query(self, mock_resolve_ids, + mock_issue_maps_predictions_requests): def resolve_ids_side_effect(nodes, in_prop, out_prop): - return { - '1': { 'dcid': 'place1' }, - '2': { 'dcid': 'place3' }, - '3': { 'dcid': 'place1' } - } + return mock_data.RESOLVE_IDS_VALUES def mock_issue_maps_predictions_requests_effect(query, lang): - return [{'description': 'California, USA', 'matched_substrings': [{'length': 5, 'offset': 0}], 'place_id': 'ChIJPV4oX_65j4ARVW8IJ6IJUYs', 'matched_query': 'calif'}] + return mock_data.MAPS_PREDICTIONS_VALUES mock_resolve_ids.side_effect = resolve_ids_side_effect mock_issue_maps_predictions_requests.side_effect = mock_issue_maps_predictions_requests_effect @@ -73,6 +73,4 @@ def mock_issue_maps_predictions_requests_effect(query, lang): self.assertEqual(response.status_code, 200) response_dict = json.loads(response.data.decode("utf-8")) - print(response.data) self.assertEqual(len(response_dict["predictions"]), 5) - # assert response_data \ No newline at end of file diff --git a/server/tests/routes/api/mock_data.py b/server/tests/routes/api/mock_data.py index 7af627e004..db1df5c5d3 100644 --- a/server/tests/routes/api/mock_data.py +++ b/server/tests/routes/api/mock_data.py @@ -415,3 +415,43 @@ } } } + +RESOLVE_IDS_VALUES = { + 'ChIJPV4oX_65j4ARVW8IJ6IJUYs': [{ + 'dcid': 'geoId/4210768' + }], + 'ChIJPV4oX_65j4ARVW8IJ6IJUYs1': [{ + 'dcid': 'geoId/4210769' + }], + 'ChIJPV4oX_65j4ARVW8IJ6IJUYs2': [{ + 'dcid': 'geoId/4210770' + }], + 'ChIJPV4oX_65j4ARVW8IJ6IJUYs3': [{ + 'dcid': 'geoId/4210771' + }], + 'ChIJPV4oX_65j4ARVW8IJ6IJUYs4': [{ + 'dcid': 'geoId/4210772' + }] +} + +MAPS_PREDICTIONS_VALUES = [{ + 'description': 'California, USA', + 'place_id': 'ChIJPV4oX_65j4ARVW8IJ6IJUYs', + 'matched_query': 'calif' +}, { + 'description': 'Califon, NJ, USA', + 'place_id': 'ChIJPV4oX_65j4ARVW8IJ6IJUYs1', + 'matched_query': 'calif' +}, { + 'description': 'California, MD, USA', + 'place_id': 'ChIJPV4oX_65j4ARVW8IJ6IJUYs2', + 'matched_query': 'calif' +}, { + 'description': 'California City, CA, USA', + 'place_id': 'ChIJPV4oX_65j4ARVW8IJ6IJUYs3', + 'matched_query': 'calif' +}, { + 'description': 'California, PA, USA', + 'place_id': 'ChIJPV4oX_65j4ARVW8IJ6IJUYs4', + 'matched_query': 'calif' +}] \ No newline at end of file diff --git a/server/webdriver/tests/homepage_test.py b/server/webdriver/tests/homepage_test.py index a53d5f8663..af952cc403 100644 --- a/server/webdriver/tests/homepage_test.py +++ b/server/webdriver/tests/homepage_test.py @@ -106,7 +106,9 @@ def test_homepage_autocomplete(self): # Type california into the search box. search_box_input.send_keys("California") - autocomplete_results = self.driver.find_elements(By.ID, 'search-input-result-section') - print("so we're here and we found stuff") - print(len(autocomplete_results)) + suggestions_present = EC.presence_of_element_located((By.CLASS_NAME, 'search-input-result-section')) + WebDriverWait(self.driver, 300).until(suggestions_present) + + autocomplete_results = self.driver.find_elements( + By.CLASS_NAME, 'search-input-result-section') self.assertTrue(len(autocomplete_results) == 5) \ No newline at end of file diff --git a/static/js/components/nl_search_bar/auto_complete_input.tsx b/static/js/components/nl_search_bar/auto_complete_input.tsx index af90c87a4a..cdc82b455e 100644 --- a/static/js/components/nl_search_bar/auto_complete_input.tsx +++ b/static/js/components/nl_search_bar/auto_complete_input.tsx @@ -29,10 +29,13 @@ import React, { useState, } from "react"; import { Input, InputGroup } from "reactstrap"; -import AutoCompleteSuggestions from "./auto_complete_suggestions"; -import { stripPatternFromQuery } from "../../shared/util"; -import { useInsideClickAlerter, useOutsideClickAlerter } from "../../utils/click_alerter"; +import { stripPatternFromQuery } from "../../shared/util"; +import { + useInsideClickAlerter, + useOutsideClickAlerter, +} from "../../utils/click_alerter"; +import AutoCompleteSuggestions from "./auto_complete_suggestions"; const DEBOUNCE_INTERVAL_MS = 100; const PLACE_EXPLORER_PREFIX = "/place/"; @@ -87,7 +90,7 @@ export function AutoCompleteInput( useInsideClickAlerter(wrapperRef, () => { setInputActive(true); - }) + }); useEffect(() => { // TriggerSearch state used to ensure onSearch only called after text updated. @@ -183,7 +186,6 @@ export function AutoCompleteInput( changeText(textDisplayed); } - function selectResult(result: any) { if ( result["match_type"] == LOCATION_SEARCH && @@ -206,7 +208,7 @@ export function AutoCompleteInput(
void; - hoveredIdx: number; - } - - function AutoCompleteSuggestions( - props: AutoCompleteSuggestionsPropType - ): ReactElement { - function getIcon(query: string, matched_query: string): string { - if (query == matched_query) { - return "location_on"; - } - return "search"; + allResults: any[]; + baseInput: string; + onClick: (result: any) => void; + hoveredIdx: number; +} + +function AutoCompleteSuggestions( + props: AutoCompleteSuggestionsPropType +): ReactElement { + function getIcon(query: string, matched_query: string): string { + if (query == matched_query) { + return "location_on"; } - - return ( -
-
- {props.allResults.map((result: any, idx: number) => { - return ( -
-
-
props.onClick(result)}> - {getIcon(props.baseInput, result.matched_query)} -
- - {stripPatternFromQuery( - props.baseInput, - result.matched_query - )} - {result.name} - -
+ return "search"; + } + + return ( +
+
+ {props.allResults.map((result: any, idx: number) => { + return ( +
+
+
props.onClick(result)} + > + + {getIcon(props.baseInput, result.matched_query)} + +
+ + {stripPatternFromQuery( + props.baseInput, + result.matched_query + )} + {result.name} +
- {idx !== props.allResults.length - 1 ?
: <>}
- ); - })} -
+ {idx !== props.allResults.length - 1 ? ( +
+ ) : ( + <> + )} +
+ ); + })}
- ); - } +
+ ); +} export default AutoCompleteSuggestions; diff --git a/static/js/components/nl_search_bar/nl_search_bar_standard.tsx b/static/js/components/nl_search_bar/nl_search_bar_standard.tsx index 571be651dd..1b2ac9b89e 100644 --- a/static/js/components/nl_search_bar/nl_search_bar_standard.tsx +++ b/static/js/components/nl_search_bar/nl_search_bar_standard.tsx @@ -50,4 +50,4 @@ export default function NlSearchBarStandard({ />
); -} \ No newline at end of file +} diff --git a/static/js/shared/util.ts b/static/js/shared/util.ts index 4534c5ec4a..81d4eda272 100644 --- a/static/js/shared/util.ts +++ b/static/js/shared/util.ts @@ -185,10 +185,7 @@ export function removeSpinner(containerId: string): void { * @param pattern a string which we want to find and remove from the query. * @returns the query with the pattern removed if it was found. */ -export function stripPatternFromQuery( - query: string, - pattern: string -): string { +export function stripPatternFromQuery(query: string, pattern: string): string { const regex = new RegExp("(?:.(?!" + pattern + "))+([,;\\s])?$", "i"); // Returns the query without the pattern parameter.