def test_single_jurisdiction_multiple_admins(client, election_id):
    rv = client.put(
        f"/election/{election_id}/jurisdiction/file",
        data={
            "jurisdictions": (
                io.BytesIO(
                    b"Jurisdiction,Admin Email\nJ1,[email protected]\nJ1,[email protected]"
                ),
                "jurisdictions.csv",
            )
        },
    )
    assert_ok(rv)

    # Process the file in the background.
    assert bgcompute_update_election_jurisdictions_file() == 1

    election = Election.query.filter_by(id=election_id).one()
    assert [j.name for j in election.jurisdictions] == ["J1"]

    jurisdiction = election.jurisdictions[0]
    assert [a.user.email for a in jurisdiction.jurisdiction_administrations] == [
        "*****@*****.**",
        "*****@*****.**",
    ]
def test_metadata(client, election_id):
    rv = client.get(f"/election/{election_id}/jurisdiction/file")
    assert json.loads(rv.data) == {"file": None, "processing": None}

    rv = client.put(
        f"/election/{election_id}/jurisdiction/file",
        data={
            "jurisdictions": (
                io.BytesIO(b"Jurisdiction,Admin Email\n" b"J1,[email protected]"),
                "jurisdictions.csv",
            )
        },
    )
    assert_ok(rv)

    election = Election.query.filter_by(id=election_id).one()
    assert election.jurisdictions_file.contents == (
        "Jurisdiction,Admin Email\n" "J1,[email protected]"
    )
    assert election.jurisdictions_file.name == "jurisdictions.csv"
    assert election.jurisdictions_file.uploaded_at

    # Get the file data before processing.
    rv = client.get(f"/election/{election_id}/jurisdiction/file")
    response = json.loads(rv.data)
    file = response["file"]
    processing = response["processing"]
    assert file["name"] == "jurisdictions.csv"
    assert file["uploadedAt"]
    assert processing["status"] == ProcessingStatus.READY_TO_PROCESS
    assert processing["startedAt"] is None
    assert processing["completedAt"] is None
    assert processing["error"] is None

    # Actually process the file.
    assert bgcompute_update_election_jurisdictions_file() == 1

    # Now there should be data.
    rv = client.get(f"/election/{election_id}/jurisdiction/file")
    response = json.loads(rv.data)
    file = response["file"]
    processing = response["processing"]
    assert file["name"] == "jurisdictions.csv"
    assert file["uploadedAt"]
    assert processing["status"] == ProcessingStatus.PROCESSED
    assert processing["startedAt"]
    assert processing["completedAt"]
    assert processing["error"] is None

    rv = client.get(f"/election/{election_id}/jurisdiction/file/csv")
    assert (
        rv.headers["Content-Disposition"] == 'attachment; filename="jurisdictions.csv"'
    )
    assert rv.data.decode("utf-8") == election.jurisdictions_file.contents
Example #3
0
def jurisdiction_ids(client: FlaskClient, election_id: str) -> List[str]:
    rv = client.put(
        f"/election/{election_id}/jurisdiction/file",
        data={
            "jurisdictions": (
                # We expect the API to order the jurisdictions by name, so we
                # upload them out of order.
                io.BytesIO(("Jurisdiction,Admin Email\n"
                            f"J2,{DEFAULT_JA_EMAIL}\n"
                            "J3,[email protected]\n"
                            f"J1,{DEFAULT_JA_EMAIL}\n").encode()),
                "jurisdictions.csv",
            )
        },
    )
    assert_ok(rv)
    bgcompute_update_election_jurisdictions_file()
    jurisdictions = (Jurisdiction.query.filter_by(
        election_id=election_id).order_by(Jurisdiction.name).all())
    return [j.id for j in jurisdictions]
def test_no_jurisdiction(client, election_id):
    rv = client.put(
        f"/election/{election_id}/jurisdiction/file",
        data={
            "jurisdictions": (
                io.BytesIO(b"Jurisdiction,Admin Email"),
                "jurisdictions.csv",
            )
        },
    )
    assert_ok(rv)

    # Process the file in the background.
    assert bgcompute_update_election_jurisdictions_file() == 1

    election = Election.query.filter_by(id=election_id).one()
    assert election.jurisdictions == []
    assert JurisdictionAdministration.query.count() == 0
    assert User.query.count() == 0
def test_convert_emails_to_lowercase(client, election_id):
    rv = client.put(
        f"/election/{election_id}/jurisdiction/file",
        data={
            "jurisdictions": (
                io.BytesIO(
                    b"Jurisdiction,Admin Email\n"
                    b"J1,[email protected]\n"
                    b"J2,[email protected]\n"
                    b"J3,[email protected]\n"
                ),
                "jurisdictions.csv",
            )
        },
    )
    assert_ok(rv)

    # Process the file in the background.
    assert bgcompute_update_election_jurisdictions_file() == 1

    election = Election.query.filter_by(id=election_id).one()
    for jurisdiction in election.jurisdictions:
        for admin in jurisdiction.jurisdiction_administrations:
            assert admin.user.email == admin.user.email.lower()