def test_search_google_civic(google_civic_response_ut): """Address components search -- call out to Google Civic for results""" address_request = { "address": { "street_number": "1985", "street": "S 1200 E", "city": "Salt Lake City", "state": "UT", "zip5": "84105", "county": "Salt Lake County", } } responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) responses.add( responses.GET, GOOGLE_CIVIC_URL_GENERIC, json=google_civic_response_ut, status=200, ) response = post_address_search(address_request) assert response.status_code == 200 json_body = response.json() assert json_body == EXPECTED_RESPONSE_1 search_log = check_search_log(True) # ID is non-deterministic so don't use it in comparison log_dict = model_to_dict(search_log) del log_dict["id"] assert log_dict == EXPECTED_SEARCH_LOG_1
def test_nv_early_fail_precinct(nv_ev_zip9_request): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) response = post_address_search(nv_ev_zip9_request) assert response.status_code == 200 json_body = response.json() assert json_body.get("early_vote_locations") is None assert len(json_body["errors"]) == 1 check_search_log(success=False)
def test_search_zip9_success(api_request_with_zip9): precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", precinct=precinct, zip9="123456789") pl = baker.make("app.PollingLocation") ppl = baker.make("app.PrecinctToPollingLocation", location=pl, precinct=precinct) response = post_address_search(api_request_with_zip9) assert_success(response, "MATCH_ZIP9")
def test_search_with_zip9_no_precinct(api_request_with_zip9): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) response = post_address_search(api_request_with_zip9) assert_fail( response, 200, "Error getting precinct for zip or street segment", "NO_PRECINCT_FOR_ADDRESS", )
def test_nv_early_fail_location(nv_ev_zip9_request): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", zip9="123456789", precinct=precinct) response = post_address_search(nv_ev_zip9_request) assert response.status_code == 200 json_body = response.json() assert json_body.get("early_vote_locations") is None assert len(json_body["errors"]) >= 1 check_search_log(success=False)
def test_nc_early_fail(): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) req = {"state": "NC", "county": "Franklin", "latitude": "33", "longitude": "-113"} response = post_address_search(req) assert response.status_code == 200 json_body = response.json() assert len(json_body["errors"]) >= 1 check_search_log(success=False) assert not json_body.get("polling_locations") assert not json_body.get("early_vote_locations")
def test_search_smarty_no_zip9(api_request_without_zip9): # Mock out the request and response from SmartyStreets responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) response = post_address_search(api_request_without_zip9) assert_fail( response, 200, "Error getting precinct for zip or street segment", "NO_PRECINCT_FOR_ADDRESS", )
def test_search_zip9_low_confidence(api_request_with_zip9): precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", precinct=precinct, zip9="123456789", confidence_score=0.92) pl = baker.make("app.PollingLocation") ppl = baker.make("app.PrecinctToPollingLocation", location=pl, precinct=precinct) response = post_address_search(api_request_with_zip9) assert_fail(response, 200, "Confidence threshold too low", "LOW_CONFIDENCE_ZIP9")
def test_search_by_address_no_location(api_request_without_zip9): precinct = baker.make("app.Precinct") ss = baker.make( "app.StreetSegment", precinct=precinct, address=ADDRESS, city=CITY, state_code=STATE, zip=ZIP, ) response = post_address_search(api_request_without_zip9) assert_fail(response, 200, "No polling locations found", "NO_LOCATION_FOR_PRECINCT") search_log = SearchLog.objects.all().first() assert search_log.precinct == precinct
def test_multiple_polling_locs(api_request_with_zip9): precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", precinct=precinct, zip9="123456789") pl1 = baker.make("app.PollingLocation") pl2 = baker.make("app.PollingLocation") ppl1 = baker.make("app.PrecinctToPollingLocation", location=pl1, precinct=precinct) ppl2 = baker.make("app.PrecinctToPollingLocation", location=pl2, precinct=precinct) response = post_address_search(api_request_with_zip9) assert_success(response, "MATCH_ZIP9") json_body = response.json() assert len(json_body["polling_locations"]) == 2
def test_search_no_zip_address_success(api_request_without_zip9): precinct = baker.make("app.Precinct") ss = baker.make( "app.StreetSegment", precinct=precinct, address=ADDRESS, city=CITY, state_code=STATE, zip=ZIP, ) pl = baker.make("app.PollingLocation") ppl = baker.make("app.PrecinctToPollingLocation", location=pl, precinct=precinct) response = post_address_search(api_request_without_zip9) assert_success(response, "MATCH_ADDRESS")
def test_search_smarty_zip9_success(api_request_bad_zip9, smarty_streets_response): precinct = baker.make("app.Precinct") ztp = baker.make( "app.Zip9ToPrecinct", precinct=precinct, zip9="021293533") # Zip9 from smarty streets sample response pl = baker.make("app.PollingLocation") ppl = baker.make("app.PrecinctToPollingLocation", location=pl, precinct=precinct) responses.add(responses.GET, SMARTY_URL_GENERIC, json=smarty_streets_response, status=200) response = post_address_search(api_request_bad_zip9) assert_success(response, "MATCH_ZIP9")
def test_search_nevada_no_precinct(): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) fake_county = "Susandale" nv_address_request = address_request("21", "Jump St", "Reno", "NV", "12345") nv_address_request["address"] = { "county": fake_county, **nv_address_request["address"], } response = post_address_search(nv_address_request) assert_fail( response, 200, "Error getting precinct for zip or street segment", "NO_PRECINCT_FOR_ADDRESS", )
def test_nv_early_success_with_lat_long(nv_ev_zip9_request): precinct = baker.make("app.Precinct", county="Clark") ztp = baker.make("app.Zip9ToPrecinct", zip9="123456789", precinct=precinct) pl0 = baker.make("app.EarlyVoteLocation", latitude="35", longitude="-115") pl1 = baker.make("app.EarlyVoteLocation", latitude="37", longitude="-117") pl2 = baker.make( "app.EarlyVoteLocation", latitude="34", longitude="-114", dates_hours="Sa 2/15 10AM - 6PM, Tu 2/18 2PM - 8PM", ) pl3 = baker.make( "app.EarlyVoteLocation", latitude="36", longitude="-116", dates_hours="Sa 2/15 10AM - 6PM, Su 2/16 1PM - 5PM, Mo 2/17 10AM - 6PM, Tu 2/18 8AM - 8PM", ) ppl0 = baker.make("app.PrecinctToEVLocation", location=pl0, precinct=precinct) ppl1 = baker.make("app.PrecinctToEVLocation", location=pl1, precinct=precinct) ppl2 = baker.make("app.PrecinctToEVLocation", location=pl2, precinct=precinct) ppl3 = baker.make("app.PrecinctToEVLocation", location=pl3, precinct=precinct) pl_reg = baker.make("app.PollingLocation") ppl_reg = baker.make( "app.PrecinctToPollingLocation", location=pl_reg, precinct=precinct ) nv_ev_zip9_request["latitude"] = "33" nv_ev_zip9_request["longitude"] = "-113" response = post_address_search(nv_ev_zip9_request) assert response.status_code == 200 json_body = response.json() assert len(json_body["errors"]) == 0 check_search_log(success=True) # Check regular polling location assert len(json_body["polling_locations"]) == 1 assert json_body["polling_locations"][0]["location_name"] == pl_reg.location_name # Check that early vote locations returned are in correct sorted order assert len(json_body["early_vote_locations"]) == 4 early_locations = json_body["early_vote_locations"] assert float(early_locations[0].get("latitude")) == 34 assert float(early_locations[1].get("latitude")) == 35 assert float(early_locations[2].get("latitude")) == 36 assert float(early_locations[3].get("latitude")) == 37
def test_search_nevada_no_precinct_early_vote(): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) fake_county = "Susandale" nv_address_request = address_request("21", "Jump St", "Reno", "NV", "12345") nv_address_request["address"] = { "county": fake_county, **nv_address_request["address"], } precinct = baker.make("app.Precinct", state_code="NV", county=fake_county) pl = baker.make("app.EarlyVoteLocation") ppl = baker.make("app.PrecinctToEVLocation", location=pl, precinct=precinct) response = post_address_search(nv_address_request) assert_success(response, "MATCH_COUNTY") assert len(response.json()["early_vote_locations"])
def test_search_address_first_success(api_request_with_zip9): precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", precinct=precinct, zip9="123456789") pl = baker.make("app.PollingLocation") ppl = baker.make("app.PrecinctToPollingLocation", location=pl, precinct=precinct) ss = baker.make( "app.StreetSegment", precinct=precinct, address=ADDRESS, city=CITY, state_code=STATE, zip=ZIP, confidence_score=0.95, ) response = post_address_search(api_request_with_zip9) assert_success(response, "MATCH_ADDRESS")
def test_search_address_low_confidence(api_request_without_zip9): precinct = baker.make("app.Precinct") ss = baker.make( "app.StreetSegment", precinct=precinct, address=ADDRESS, city=CITY, state_code=STATE, zip=ZIP, confidence_score=0.0, ) pl = baker.make("app.PollingLocation") ppl = baker.make("app.PrecinctToPollingLocation", location=pl, precinct=precinct) response = post_address_search(api_request_without_zip9) assert_fail(response, 200, "Confidence threshold too low", "LOW_CONFIDENCE_ADDRESS")
def test_nv_early_success_no_lat_long(nv_ev_zip9_request): precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", zip9="123456789", precinct=precinct) pl1 = baker.make("app.EarlyVoteLocation") pl2 = baker.make("app.EarlyVoteLocation") pl3 = baker.make("app.EarlyVoteLocation") ppl1 = baker.make("app.PrecinctToEVLocation", location=pl1, precinct=precinct) ppl2 = baker.make("app.PrecinctToEVLocation", location=pl2, precinct=precinct) ppl3 = baker.make("app.PrecinctToEVLocation", location=pl3, precinct=precinct) response = post_address_search(nv_ev_zip9_request) assert response.status_code == 200 json_body = response.json() # TODO is there a sort order we should have here? assert len(json_body["early_vote_locations"]) == 3 search_logs = SearchLog.objects.all() count = search_logs.count() assert count == 1 # Unclear if finding EV location but not regular location should be success or failure assert search_logs.first().success
def test_dropbox_search(): precinct = baker.make("app.Precinct") ztp = baker.make("app.Zip9ToPrecinct", precinct=precinct, zip9="123456789") pl1 = baker.make("app.DropboxLocation") pl2 = baker.make("app.DropboxLocation") ppl1 = baker.make("app.PrecinctToDropboxLocation", location=pl1, precinct=precinct) ppl2 = baker.make("app.PrecinctToDropboxLocation", location=pl2, precinct=precinct) request = address_request("123", "Maple st", "Seattle", "WA", "12345") request["address"]["zip9"] = "123456789" logging.info(f"REQUEST {request}") response = post_address_search(request) response_json = response.json() logging.info(response_json) assert_success(response, "MATCH_ZIP9") assert len(response_json["dropbox_locations"]) == 2
def test_nc_early_success_with_lat_long(): responses.add(responses.GET, SMARTY_URL_GENERIC, json=[], status=200) county_name = "Franklin" pl0 = baker.make("app.EarlyVoteLocation", latitude="35", longitude="-115") pl1 = baker.make("app.EarlyVoteLocation", latitude="34", longitude="-114") pl2 = baker.make( "app.EarlyVoteLocation", latitude="37", longitude="-117", dates_hours="Sa 2/15 10AM - 6PM, Tu 2/18 2PM - 8PM", ) ppl0 = baker.make( "app.CountyToEVLocation", location=pl0, county=county_name, state_code="NC" ) ppl1 = baker.make( "app.CountyToEVLocation", location=pl1, county=county_name, state_code="NC" ) ppl2 = baker.make( "app.CountyToEVLocation", location=pl2, county=county_name, state_code="NC" ) req = {"state": "NC", "county": "FRANKLIN", "latitude": "33", "longitude": "-113"} response = post_address_search(req) assert response.status_code == 200 json_body = response.json() assert len(json_body["errors"]) == 0 check_search_log(success=True) # Check regular polling location assert not json_body.get("polling_locations") # Check that early vote locations returned are in correct sorted order assert len(json_body["early_vote_locations"]) == 3 early_locations = json_body["early_vote_locations"] assert float(early_locations[0].get("latitude")) == 34 assert float(early_locations[1].get("latitude")) == 35 assert float(early_locations[2].get("latitude")) == 37
def test_full_req_response(): precinct = baker.make( "app.Precinct", county="Clark", van_precinct_id=1617386, state_code="NV", fips="32003", precinct_code="3775", ) ztp = baker.make("app.Zip9ToPrecinct", zip9="891455373", precinct=precinct) pl0 = baker.make( "app.EarlyVoteLocation", location_id=8975760059578666627, location_name="CSN Charleston Campus, B Lobby", address="6375 W. Charleston Blvd.", city="Las Vegas", state_code="NV", zip="89146", dates_hours="Tu 2/18 8AM - 8PM", latitude="36.157265000", longitude="-115.232410000", ) pl1 = baker.make( "app.EarlyVoteLocation", location_id=1710710949278043919, location_name="UAW Local 3555", address="4310 Cameron St #11", city="Las Vegas", state_code="NV", zip="89103", dates_hours= "Sa 2/15 10AM - 6PM, Su 2/16 1PM - 5PM, Mo 2/17 10AM - 6PM, Tu 2/18 8AM - 8PM", latitude="36.111626800", longitude="-115.203850000", ) pl2 = baker.make( "app.EarlyVoteLocation", location_id=8323362047760264661, location_name="Temple Sinai", address="9001 Hillpointe Road", city="Las Vegas", state_code="NV", zip="89134", dates_hours="Sa 2/15 1PM - 6PM, Tu 2/18 10AM - 6PM", latitude="36.198949000", longitude="-115.292760000", ) ppl0 = baker.make("app.PrecinctToEVLocation", location=pl0, precinct=precinct) ppl1 = baker.make("app.PrecinctToEVLocation", location=pl1, precinct=precinct) ppl2 = baker.make("app.PrecinctToEVLocation", location=pl2, precinct=precinct) pl_reg = baker.make( "app.PollingLocation", location_id=6709390971067927642, location_name="Caucus Day Location - WALTER JOHNSON MIDDLE SCHOOL", address="7701 DUCHARME AVE", city="LAS VEGAS", state_code="NV", zip="89145", dates_hours= "Caucus Registration Opens at 10AM, Registration Closes at 12PM", latitude="36.168378000", longitude="-115.262055000", ) ppl_reg = baker.make("app.PrecinctToPollingLocation", location=pl_reg, precinct=precinct) request = { "address": { "street_number": "425", "street": "Warmside Dr", "city": "Las Vegas", "state": "NV", "zip5": "89145", "zip9": "891455373", "county": "Clark County", "latitude": 36.16741459999999, "longitude": -115.2447459, }, "metadata": { "query_params": "", "source": "web", "normalized_by_google": True, "autocomplete_selected": True, "heap_id": "8135830208496912", "pollaris_search_id": "18658113641015635837", }, } expected_response = { "errors": [], "precinct": { "van_precinct_id": 1617386, "state_code": "NV", "county": "Clark", "fips": "32003", "precinct_code": "3775", }, "match_type": "MATCH_ZIP9", "early_vote_locations": [ { "location_id": 8975760059578666627, "location_name": "CSN Charleston Campus, B Lobby", "address": "6375 W. Charleston Blvd.", "city": "Las Vegas", "state_code": "NV", "zip": "89146", "dates_hours": "Tu 2/18 8AM - 8PM", "latitude": "36.157265000", "longitude": "-115.232410000", "distance": 0.9825520301190909, }, { "location_id": 8323362047760264661, "location_name": "Temple Sinai", "address": "9001 Hillpointe Road", "city": "Las Vegas", "state_code": "NV", "zip": "89134", "dates_hours": "Sa 2/15 1PM - 6PM, Tu 2/18 10AM - 6PM", "latitude": "36.198949000", "longitude": "-115.292760000", "distance": 3.453980218009656, }, { "location_id": 1710710949278043919, "location_name": "UAW Local 3555", "address": "4310 Cameron St #11", "city": "Las Vegas", "state_code": "NV", "zip": "89103", "dates_hours": "Sa 2/15 10AM - 6PM, Su 2/16 1PM - 5PM, Mo 2/17 10AM - 6PM, Tu 2/18 8AM - 8PM", "latitude": "36.111626800", "longitude": "-115.203850000", "distance": 4.4750926279083, }, ], "polling_locations": [{ "location_id": 6709390971067927642, "location_name": "Caucus Day Location - WALTER JOHNSON MIDDLE SCHOOL", "address": "7701 DUCHARME AVE", "city": "LAS VEGAS", "state_code": "NV", "zip": "89145", "dates_hours": "Caucus Registration Opens at 10AM, Registration Closes at 12PM", "latitude": "36.168378000", "longitude": "-115.262055000", }], "home_address": { "street_number": "425", "street": "Warmside Dr", "city": "Las Vegas", "state": "NV", "zip5": "89145", "zip9": "891455373", "county": "Clark County", "latitude": 36.16741459999999, "longitude": -115.2447459, }, "pollaris_search_id": "18658113641015635837", } expected_search_log = { "heap_id": "8135830208496912", "autocomplete_selected": True, "search_status": "MATCH_ZIP9", "street": "Warmside Dr", "referrer": "http://test-referrer", "success": True, "zip9": "891455373", "street_number": "425", "zip5": "89145", "precinct": 1617386, "city": "Las Vegas", "other_data": { "latitude": 36.16741459999999, "longitude": -115.2447459, "query_params": "", "normalized_by_google": True, }, "county": "Clark County", "state_code": "NV", "search_string": None, "source": "web", "search_id": "18658113641015635837", } actual_response = post_address_search( request, HTTP_REFERER="http://test-referrer").json() assert actual_response == expected_response log = check_search_log(True) log_dict = model_to_dict(log) # ID is non-deterministic so don't use it in comparison del log_dict["id"] assert log_dict == expected_search_log
def test_search_zip9_invalid_json(): bad_request = "asdf" response = post_address_search(bad_request) assert response.status_code == 400 json_body = response.json() assert json_body["error_message"] == "Could not parse JSON"