Skip to content

Commit

Permalink
Fixed tests for webdriver and flask route.
Browse files Browse the repository at this point in the history
  • Loading branch information
gmechali committed Oct 2, 2024
1 parent 3972038 commit d11616d
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 85 deletions.
4 changes: 0 additions & 4 deletions server/routes/shared_api/autocomplete/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
38 changes: 18 additions & 20 deletions server/tests/routes/api/autocomplete_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
40 changes: 40 additions & 0 deletions server/tests/routes/api/mock_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}]
8 changes: 5 additions & 3 deletions server/webdriver/tests/homepage_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
14 changes: 8 additions & 6 deletions static/js/components/nl_search_bar/auto_complete_input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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/";
Expand Down Expand Up @@ -87,7 +90,7 @@ export function AutoCompleteInput(

useInsideClickAlerter(wrapperRef, () => {
setInputActive(true);
})
});

useEffect(() => {
// TriggerSearch state used to ensure onSearch only called after text updated.
Expand Down Expand Up @@ -183,7 +186,6 @@ export function AutoCompleteInput(
changeText(textDisplayed);
}


function selectResult(result: any) {
if (
result["match_type"] == LOCATION_SEARCH &&
Expand All @@ -206,7 +208,7 @@ export function AutoCompleteInput(
<div
className={`search-box-section ${
results.placeResults.length == 0 ? "radiused" : "unradiused"
} ${inputActive ? "search-box-section-active" : "" }`}
} ${inputActive ? "search-box-section-active" : ""}`}
ref={wrapperRef}
>
<div
Expand Down
104 changes: 57 additions & 47 deletions static/js/components/nl_search_bar/auto_complete_suggestions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,60 +18,70 @@
* Standard version of the auto-complete capable NL Search bar.
*/

import { stripPatternFromQuery } from "../../shared/util";
import React, { ReactElement } from "react";

import { stripPatternFromQuery } from "../../shared/util";

interface AutoCompleteSuggestionsPropType {
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 "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 (
<div className="search-results-place search-results-section">
<div className="search-input-results-list" tabIndex={-1}>
{props.allResults.map((result: any, idx: number) => {
return (
<div key={idx}>
<div className={`search-input-result-section ${
idx === props.hoveredIdx
? "search-input-result-section-highlighted"
: ""
}`}>
<div
className="search-input-result"
key={"search-input-result-" + result.dcid}
onClick={() => props.onClick(result)}>
<span className="material-icons-outlined search-result-icon">{getIcon(props.baseInput, result.matched_query)}</span>
<div className="query-result">
<span>
{stripPatternFromQuery(
props.baseInput,
result.matched_query
)}
<span className="query-suggestion">{result.name}</span>
</span>
</div>
return "search";
}

return (
<div className="search-results-place search-results-section">
<div className="search-input-results-list" tabIndex={-1}>
{props.allResults.map((result: any, idx: number) => {
return (
<div key={idx}>
<div
className={`search-input-result-section ${
idx === props.hoveredIdx
? "search-input-result-section-highlighted"
: ""
}`}
>
<div
className="search-input-result"
key={"search-input-result-" + result.dcid}
onClick={() => props.onClick(result)}
>
<span className="material-icons-outlined search-result-icon">
{getIcon(props.baseInput, result.matched_query)}
</span>
<div className="query-result">
<span>
{stripPatternFromQuery(
props.baseInput,
result.matched_query
)}
<span className="query-suggestion">{result.name}</span>
</span>
</div>
</div>
{idx !== props.allResults.length - 1 ? <hr className="result-divider"></hr> : <></>}
</div>
);
})}
</div>
{idx !== props.allResults.length - 1 ? (
<hr className="result-divider"></hr>
) : (
<></>
)}
</div>
);
})}
</div>
);
}
</div>
);
}

export default AutoCompleteSuggestions;
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,4 @@ export default function NlSearchBarStandard({
/>
</div>
);
}
}
5 changes: 1 addition & 4 deletions static/js/shared/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit d11616d

Please sign in to comment.