コード例 #1
0
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
コード例 #2
0
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)
コード例 #3
0
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")
コード例 #4
0
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",
    )
コード例 #5
0
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)
コード例 #6
0
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")
コード例 #7
0
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",
    )
コード例 #8
0
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")
コード例 #9
0
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
コード例 #10
0
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
コード例 #11
0
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")
コード例 #12
0
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")
コード例 #13
0
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",
    )
コード例 #14
0
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
コード例 #15
0
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"])
コード例 #16
0
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")
コード例 #17
0
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")
コード例 #18
0
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
コード例 #19
0
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
コード例 #20
0
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
コード例 #21
0
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
コード例 #22
0
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"