Exemple #1
0
def test_admin_list_pagination(client, supportal_admin_user,
                               cambridge_leader_user, mattapan_leader_user):
    cambridge_leader_user.created_at = timezone.now()
    cambridge_leader_user.save()

    mattapan_leader_user.created_at = timezone.now() - datetime.timedelta(
        days=1)
    mattapan_leader_user.save()

    supportal_admin_user.created_at = timezone.now() - datetime.timedelta(
        days=2)
    supportal_admin_user.save()

    # List First Page
    list_res = client.get("/v1/users/?page=1&page_size=1",
                          **utils.id_auth(supportal_admin_user))
    assert list_res.status_code == 200
    full_get_list = list_res.data["results"]
    assert len(full_get_list) == 1
    assert cambridge_leader_user.id == full_get_list[0]["id"]

    # List Second Page
    second_list_res = client.get(list_res.data["next"],
                                 **utils.id_auth(supportal_admin_user))
    assert second_list_res.status_code == 200
    full_get_list = second_list_res.data["results"]
    assert len(full_get_list) == 1
    assert mattapan_leader_user.id == full_get_list[0]["id"]
Exemple #2
0
def test_demo_assign(api_client, cambridge_leader_user, cambridge_prospect):
    cambridge_leader_user.verified_at = None
    cambridge_leader_user.save()

    auth = utils.id_auth(cambridge_leader_user)
    res = api_client.post(f"/v1/vol_prospect_assignments/assign/", **auth)
    assert res.status_code == status.HTTP_201_CREATED

    assignments = cambridge_leader_user.vol_prospect_assignments.all()
    assert (cambridge_leader_user.vol_prospect_assignments.get_demo_queryset().
            count() == 10)
    # VPA assignment manager get_queryset is overwritten to not return demo users
    assert assignments.filter(person__is_demo=False).count() == 0

    cambridge_leader_user.verified_at = datetime.now(tz=timezone.utc)
    cambridge_leader_user.save()
    cambridge_leader_user.vol_prospect_assignments.delete_demo_assignments(
        user=cambridge_leader_user)

    auth = utils.id_auth(cambridge_leader_user)
    res = api_client.post(f"/v1/vol_prospect_assignments/assign/", **auth)
    assert res.status_code == status.HTTP_201_CREATED

    assignments = cambridge_leader_user.vol_prospect_assignments.all()
    # none of the assignments should be demo users
    assert (cambridge_leader_user.vol_prospect_assignments.get_demo_queryset().
            count() == 0)
    assert assignments.count() == 1
Exemple #3
0
def _test_delete_user_operation(client, user):
    # Delete
    assert user.is_active
    del_res = client.delete(f"/v1/users/{user.id}/", **utils.id_auth(user))
    assert del_res.status_code == 204

    user.refresh_from_db()
    assert not user.is_active
    get_res = client.get(f"/v1/users/{user.id}/", **utils.id_auth(user))
    assert get_res.status_code == 401
def test_create_two_with_null_ngp_id(api_client, superuser):
    """Test that creation with null NGP id works as intended.

    i.e. no upsert, only create.
    """
    payload = {**SOMERVILLE_PROSPECT_PAYLOAD, "ngp_id": None}
    resp = api_client.post("/v1/people/", payload, **id_auth(superuser))
    assert resp.status_code == status.HTTP_201_CREATED

    payload = {**CALIFORNIA_PROSPECT_PAYLOAD, "ngp_id": None}
    resp = api_client.post("/v1/people/", payload, **id_auth(superuser))
    assert resp.status_code == status.HTTP_201_CREATED

    people = Person.objects.filter(ngp_id=None, is_demo=False).all()
    assert len(people) == 2
Exemple #5
0
def test_demo_list_assignments(api_client, cambridge_leader_user,
                               cambridge_prospect):
    cambridge_leader_user.verified_at = None
    cambridge_leader_user.save()

    # add demo assignments via api call
    auth = utils.id_auth(cambridge_leader_user)
    api_client.post(f"/v1/vol_prospect_assignments/assign/", **auth)

    # list back the demo assignments
    all_res = api_client.get(f"/v1/vol_prospect_assignments/", **auth)
    assert len(all_res.data) == 10
    for res in all_res.data:
        assert res["person"]["is_demo"]

    cambridge_leader_user.verified_at = datetime.now(tz=timezone.utc)
    cambridge_leader_user.save()

    baker.make("VolProspectAssignment",
               user=cambridge_leader_user,
               person=cambridge_prospect)

    all_res = api_client.get(f"/v1/vol_prospect_assignments/", **auth)
    assert len(all_res.data) == 1
    for res in all_res.data:
        assert res["person"]["is_demo"] is False
def test_create_many(api_client, superuser):
    payload = [
        CAMBRIDGE_LEADER_PAYLOAD,
        SOMERVILLE_PROSPECT_PAYLOAD,
        CALIFORNIA_PROSPECT_PAYLOAD,
    ]
    resp = api_client.post("/v1/people/", payload, **id_auth(superuser))

    golden_cambridge_leader = FullPersonSerializer(
        baker.prepare_recipe("supportal.tests.cambridge_leader")).data
    golden_somerville_prospect = FullPersonSerializer(
        baker.prepare_recipe("supportal.tests.somerville_prospect")).data
    golden_california_prospect = FullPersonSerializer(
        baker.prepare_recipe("supportal.tests.california_prospect")).data

    assert_person_payloads_same(
        FullPersonSerializer(
            Person.objects.get(ngp_id=golden_cambridge_leader["ngp_id"])).data,
        golden_cambridge_leader,
    )
    assert_person_payloads_same(
        FullPersonSerializer(
            Person.objects.get(
                ngp_id=golden_somerville_prospect["ngp_id"])).data,
        golden_somerville_prospect,
    )
    assert_person_payloads_same(
        FullPersonSerializer(
            Person.objects.get(
                ngp_id=golden_california_prospect["ngp_id"])).data,
        golden_california_prospect,
    )
Exemple #7
0
def test_create_contact_event_with_ma_and_errors(
        api_client, cambridge_prospect_assignment):
    auth = utils.id_auth(cambridge_prospect_assignment.user)

    with unittest.mock.patch(
            "supportal.app.models.vol_prospect_models.EventSignup"
    ) as event_sign_up_mock:
        event_sign_up_mock.objects.create.return_value.sync_to_mobilize_america.return_value = (
            False,
            {
                "error": {
                    "detail": "eek"
                }
            },
        )
        payload = {
            "vol_prospect_assignment": cambridge_prospect_assignment.id,
            "result": "SUCCESSFUL_CANVASSED",
            "ma_event_id": 123456,
            "ma_timeslot_ids": [1],
        }
        res = api_client.post(f"/v1/vol_prospect_contact_events/",
                              data=payload,
                              **auth)
    assert res.status_code == 400
def test_non_admins_cannot_impersonate(rf, user, roslindale_leader_user,
                                       backend):
    user.is_admin = False
    user.impersonated_user = roslindale_leader_user
    user.save()
    u, _ = backend.authenticate(rf.get("/foo", **utils.id_auth(user)))
    assert u != roslindale_leader_user
Exemple #9
0
def test_create_contact_event(api_client, cambridge_prospect_assignment):
    auth = utils.id_auth(cambridge_prospect_assignment.user)
    payload = {
        "vol_prospect_assignment": cambridge_prospect_assignment.id,
        "result": "UNAVAILABLE_BUSY",
        "note": "",
    }
    res = api_client.post(f"/v1/vol_prospect_contact_events/",
                          data=payload,
                          **auth)
    assert res.status_code == 201
    assert res.data["result"] == "UNAVAILABLE_BUSY"
    assert res.data["note"] == ""

    new_event = {
        "vol_prospect_assignment": cambridge_prospect_assignment.id,
        "result": "SUCCESSFUL_CANVASSED",
        "metadata": {
            "survey_response_id": "12345"
        },
        "note": "note",
    }
    res = api_client.post(f"/v1/vol_prospect_contact_events/",
                          data=new_event,
                          **auth)
    assert res.data["note"] == "note"

    list_res = api_client.get(f"/v1/vol_prospect_contact_events/", **auth)
    assert list_res.status_code == 200
    assert len(list_res.data) == 2
    assert [d["result"] for d in list_res.data] == [
        "SUCCESSFUL_CANVASSED",
        "UNAVAILABLE_BUSY",
    ]
Exemple #10
0
def test_create_contact_event_with_ma(api_client,
                                      cambridge_prospect_assignment):
    auth = utils.id_auth(cambridge_prospect_assignment.user)
    payload = {
        "vol_prospect_assignment": cambridge_prospect_assignment.id,
        "result": "SUCCESSFUL_CANVASSED",
        "ma_event_id": 123456,
        "ma_timeslot_ids": [1],
    }
    with unittest.mock.patch(
            "supportal.app.models.vol_prospect_models.EventSignup"
    ) as event_sign_up_mock:
        event_sign_up_mock.objects.create.return_value.sync_to_mobilize_america.return_value = (
            True,
            None,
        )
        res = api_client.post(f"/v1/vol_prospect_contact_events/",
                              data=payload,
                              **auth)
        assert res.status_code == 201
    person = cambridge_prospect_assignment.person
    event_sign_up_mock.objects.create.assert_called_once_with(
        email=person.email,
        family_name=person.last_name,
        given_name=person.first_name,
        ma_event_id=123456,
        ma_timeslot_ids=[1],
        zip5=person.zip5,
        phone=person.phone,
        source="switchboard",
    )
    event_sign_up_mock.objects.create.return_value.sync_to_mobilize_america.assert_called_once_with(
    )
Exemple #11
0
def test_adding_demo_user_already_exists(client, supportal_admin_user,
                                         cambridge_leader_user, monkeypatch):
    assert cambridge_leader_user.verified_at is not None
    user_payload = {
        "email": cambridge_leader_user.email,
        "first_name": "Susan",
        "last_name": "",
        "address": "123 Fake St, Somerville MA 941045",
        "is_mobilize_america_signup": True,
    }

    # Create
    # Until we have a better way of mocking Cognito in tests, mokeypatch
    # the create_cognito_user method on the user manager
    monkeypatch.setattr(
        UserManager,
        "create_cognito_user",
        lambda self, e: {"User": {
            "Username": "******"
        }},
    )
    create_res = client.post(
        "/v1/users/",
        data=user_payload,
        **utils.id_auth(supportal_admin_user),
        content_type="application/json",
    )
    assert create_res.status_code == 201
    cambridge_leader_user.refresh_from_db
    assert cambridge_leader_user.verified_at is not None
Exemple #12
0
def test_adding_non_demo_user(client, supportal_admin_user, monkeypatch):
    email = "*****@*****.**"
    user_payload = {
        "email": email,
        "first_name": "Susan",
        "last_name": "",
        "address": "123 Fake St, Somerville MA 941045",
        "is_mobilize_america_signup": False,
    }

    # Create
    # Until we have a better way of mocking Cognito in tests, mokeypatch
    # the create_cognito_user method on the user manager
    monkeypatch.setattr(
        UserManager,
        "create_cognito_user",
        lambda self, e: {"User": {
            "Username": "******"
        }},
    )
    create_res = client.post(
        "/v1/users/",
        data=user_payload,
        **utils.id_auth(supportal_admin_user),
        content_type="application/json",
    )
    assert create_res.status_code == 201
    user = User.objects.get_user_by_email(email)
    assert user.verified_at is not None
Exemple #13
0
def test_invite_user_already_created(
    mock, api_client, cambridge_leader_user, hayes_valley_leader_user
):
    cambridge_leader_user.added_by = hayes_valley_leader_user
    cambridge_leader_user.save()

    assert not hayes_valley_leader_user.is_admin
    assert not hayes_valley_leader_user.is_staff
    assert not hayes_valley_leader_user.is_superuser

    for i in range(0, 10):
        vpa = baker.make("VolProspectAssignment", user=cambridge_leader_user)
        vpa.create_contact_event(
            result=CanvassResult.UNREACHABLE_MOVED, metadata={"moved_to": "CA"}
        )
        hvpa = baker.make("VolProspectAssignment", user=hayes_valley_leader_user)
        hvpa.create_contact_event(
            result=CanvassResult.UNREACHABLE_MOVED, metadata={"moved_to": "CA"}
        )

    email_to_send = cambridge_leader_user.email
    auth = utils.id_auth(hayes_valley_leader_user)

    res = api_client.post(
        f"/v1/invites/",
        data=json.dumps({"email": email_to_send}),
        content_type="application/json",
        **auth,
    )

    assert res.status_code == status.HTTP_204_NO_CONTENT
    assert User.objects.filter(email=email_to_send).count() == 1
Exemple #14
0
def test_bulk_verify_view(
    api_client, supportal_admin_user, hayes_valley_leader_user, cambridge_leader_user
):
    hayes_valley_leader_user.verified_at = None
    cambridge_leader_user.verified_at = None
    hayes_valley_leader_user.save()
    cambridge_leader_user.save()

    auth = utils.id_auth(supportal_admin_user)
    with unittest.mock.patch(
        "supportal.app.views.invite_views.get_email_service"
    ) as email_mock:
        res = api_client.post(
            f"/v1/verify",
            data=json.dumps(
                {
                    "emails": [
                        hayes_valley_leader_user.email,
                        cambridge_leader_user.email,
                    ]
                }
            ),
            content_type="application/json",
            **auth,
        )
    assert res.status_code == status.HTTP_200_OK
    hayes_valley_leader_user.refresh_from_db()
    cambridge_leader_user.refresh_from_db()
    assert hayes_valley_leader_user.verified_at is not None
    assert cambridge_leader_user.verified_at is not None
Exemple #15
0
def setup_assignments_and_events(cambridge_event, somerville_prospect):
    user = cambridge_event.vol_prospect_assignment.user
    somerville_assignment = baker.make("VolProspectAssignment",
                                       user=user,
                                       person=somerville_prospect)
    somerville_assignment.create_contact_event(
        result=CanvassResult.SUCCESSFUL_CANVASSED)
    auth = utils.id_auth(user)
    return auth, somerville_assignment
Exemple #16
0
def test_impersonated_me_api_call(client, user, roslindale_leader_user):
    """/me: users can access their own information"""
    user.is_admin = True
    user.impersonated_user = roslindale_leader_user
    user.save()
    res = client.get("/v1/me", **utils.id_auth(user))
    assert res.status_code == 200
    assert res.data["email"] != user.email
    assert res.data["email"] == roslindale_leader_user.email
def test_update_one(api_client, superuser, somerville_prospect):
    count = Person.objects.filter(ngp_id="123456").count()
    payload = {**SOMERVILLE_PROSPECT_PAYLOAD, "phone": "+"}
    resp = api_client.post("/v1/people/", payload, **id_auth(superuser))
    assert resp.status_code == status.HTTP_201_CREATED

    count = Person.objects.filter(ngp_id="").count()
    person = Person.objects.get(ngp_id="")
    assert person.phone == "+"
Exemple #18
0
def test_admin_list_user_doesnt_include_inactive(
    client,
    supportal_admin_user,
    cambridge_leader_user,
    mattapan_leader_user,
    hayes_valley_leader_user,
):

    client.delete(f"/v1/users/{cambridge_leader_user.id}/",
                  **utils.id_auth(supportal_admin_user))

    # List first page and state filter
    list_res = client.get("/v1/users/?ordering=-state,email",
                          **utils.id_auth(supportal_admin_user))
    assert list_res.status_code == 200
    full_get_list = list_res.data["results"]
    assert len(full_get_list) == 3
    assert cambridge_leader_user.id not in [u["id"] for u in full_get_list]
Exemple #19
0
def test_fails_with_invalid_email(api_client, supportal_admin_user):
    auth = utils.id_auth(supportal_admin_user)
    res = api_client.post(
        f"/v1/invites/",
        data=json.dumps({"email": "iamnotanemail"}),
        content_type="application/json",
        **auth,
    )
    assert res.status_code == status.HTTP_400_BAD_REQUEST
Exemple #20
0
def test_empty_patch_notes(api_client, cambridge_prospect_assignment):
    auth = utils.id_auth(cambridge_prospect_assignment.user)
    res = api_client.patch(
        f"/v1/vol_prospect_assignments/{cambridge_prospect_assignment.id}/",
        data=json.dumps({"note": ""}),
        content_type="application/json",
        **auth,
    )
    cambridge_prospect_assignment.refresh_from_db()
    assert cambridge_prospect_assignment.note == ""
Exemple #21
0
def test_patch_fails_when_user_mismatch(api_client,
                                        cambridge_prospect_assignment,
                                        roslindale_prospect_assignment):
    auth = utils.id_auth(cambridge_prospect_assignment.user)
    res = api_client.patch(
        f"/v1/vol_prospect_assignments/{roslindale_prospect_assignment.id}/",
        data=json.dumps({"note": "not allowed"}),
        content_type="application/json",
        **auth,
    )
    assert res.status_code == 404
def test_create_one(api_client, superuser):
    payload = SOMERVILLE_PROSPECT_PAYLOAD
    resp = api_client.post("/v1/people/", payload, **id_auth(superuser))
    assert resp.status_code == status.HTTP_201_CREATED

    golden_person = FullPersonSerializer(
        baker.prepare_recipe("supportal.tests.somerville_prospect")).data

    person = Person.objects.get(ngp_id="")
    assert_person_payloads_same(
        FullPersonSerializer(person).data, golden_person)
Exemple #23
0
def test_verify_view(api_client, supportal_admin_user, hayes_valley_leader_user):
    hayes_valley_leader_user.verified_at = None
    hayes_valley_leader_user.save()

    VolProspectAssignment.objects.assign(hayes_valley_leader_user)

    email_to_verify = hayes_valley_leader_user.email
    assert hayes_valley_leader_user.verified_at is None
    assert (
        hayes_valley_leader_user.vol_prospect_assignments.get_demo_queryset().count()
        == 10
    )
    assert (
        hayes_valley_leader_user.vol_prospect_assignments.filter(
            person__is_demo=False
        ).count()
        == 0
    )

    auth = utils.id_auth(supportal_admin_user)
    with unittest.mock.patch(
        "supportal.app.views.invite_views.get_email_service"
    ) as email_mock:
        res = api_client.post(
            f"/v1/verify",
            data=json.dumps({"email": email_to_verify}),
            content_type="application/json",
            **auth,
        )
        # call again because all these methods call twice
        api_client.post(
            f"/v1/verify",
            data=json.dumps({"email": email_to_verify}),
            content_type="application/json",
            **auth,
        )
    assert res.status_code == status.HTTP_200_OK

    email_mock.return_value.send_email.assert_called_once_with(
        configuration_set_name="organizing_emails",
        from_email=settings.FROM_EMAIL,
        payload={"email": email_to_verify, "transactional": True},
        recipient=email_to_verify,
        reply_to_email=settings.REPLY_TO_EMAIL,
        template_name=EmailSend.VERIFIED_EMAIL,
        application_name="supportal",
    )

    hayes_valley_leader_user.refresh_from_db()
    assert hayes_valley_leader_user.verified_at is not None
    assert (
        hayes_valley_leader_user.vol_prospect_assignments.get_demo_queryset().count()
        == 0
    )
Exemple #24
0
def test_cannot_retrieve_expired_assignment(
        api_client, cambridge_prospect_unreachable_event):
    vpa = cambridge_prospect_unreachable_event.vol_prospect_assignment
    vpa.expired_at = datetime(2019, 10, 27, tzinfo=timezone.utc)
    vpa.save()
    auth = utils.id_auth(
        cambridge_prospect_unreachable_event.vol_prospect_assignment.user)
    assignment_id = cambridge_prospect_unreachable_event.vol_prospect_assignment.id
    res = api_client.get(f"/v1/vol_prospect_assignments/{assignment_id}/",
                         **auth)
    assert res.status_code == 404
Exemple #25
0
def test_get_contact_event(api_client, cambridge_prospect_unreachable_event):
    event = cambridge_prospect_unreachable_event
    user = event.vol_prospect_assignment.user
    auth = utils.id_auth(user)
    res = api_client.get(f"/v1/vol_prospect_contact_events/{event.id}/",
                         **auth)
    assert res.status_code == 200
    assert res.data["id"] == event.id
    assert res.data[
        "vol_prospect_assignment"] == event.vol_prospect_assignment.id
    assert res.data["result"] == "UNREACHABLE_MOVED"
    assert res.data["note"] == "test"
Exemple #26
0
def test_skip(api_client, cambridge_prospect_assignment):
    assert cambridge_prospect_assignment.status != VolProspectAssignmentStatus.SKIPPED
    auth = utils.id_auth(cambridge_prospect_assignment.user)
    res = api_client.patch(
        f"/v1/vol_prospect_assignments/{cambridge_prospect_assignment.id}/",
        # TODO: figure out why this requires json.dumps
        data=json.dumps({"status": "SKIPPED"}),
        content_type="application/json",
        **auth,
    )
    cambridge_prospect_assignment.refresh_from_db()
    assert cambridge_prospect_assignment.status == VolProspectAssignmentStatus.SKIPPED
Exemple #27
0
def test_create_permissions(api_client, user, cambridge_prospect_assignment):
    assert user != cambridge_prospect_assignment.user
    auth = utils.id_auth(user)
    # Post a payload that would be valid for cambridge_prospect_assignment.user
    payload = {
        "vol_prospect_assignment": cambridge_prospect_assignment.id,
        "result": "UNAVAILABLE_BUSY",
    }
    res = api_client.post(f"/v1/vol_prospect_contact_events/",
                          data=payload,
                          **auth)
    assert res.status_code == 404
Exemple #28
0
def test_bulk_adding_user(client, supportal_admin_user, monkeypatch):
    email = "*****@*****.**"
    assert (User.objects.filter(
        email__in=[supportal_admin_user.email, email]).count() == 1)
    user_payload = [
        {
            "email": "bad",
            "first_name": "Susan",
            "last_name": "",
            "address": "123 Fake St, Somerville MA 941045",
            "is_mobilize_america_signup": True,
        },
        {
            "email": email,
            "first_name": "Susan",
            "last_name": "",
            "address": "123 Fake St, Somerville MA 941045",
            "is_mobilize_america_signup": True,
        },
        {
            "email": supportal_admin_user.email,
            "first_name": "Susan",
            "last_name": "",
            "address": "123 Fake St, Somerville MA 941045",
            "is_mobilize_america_signup": False,
        },
    ]

    # Create
    # Until we have a better way of mocking Cognito in tests, mokeypatch
    # the create_cognito_user method on the user manager
    monkeypatch.setattr(
        UserManager,
        "create_cognito_user",
        lambda self, e: {"User": {
            "Username": "******"
        }},
    )
    create_res = client.post(
        "/v1/users/",
        data=user_payload,
        **utils.id_auth(supportal_admin_user),
        content_type="application/json",
    )

    assert create_res.data[0]["error"] and create_res.data[0]["email"] == "bad"
    assert (User.objects.filter(email="bad").count()) == 0
    assert create_res.status_code == 201
    user = User.objects.get_user_by_email(email)
    assert user.verified_at is None
    assert (User.objects.filter(
        email__in=[supportal_admin_user.email, email]).count() == 2)
Exemple #29
0
def test_assignments_has_email(api_client, cambridge_leader_user,
                               cambridge_prospect):
    baker.make(
        "VolProspectAssignment",
        user=cambridge_leader_user,
        person=cambridge_prospect,
        suppressed_at=datetime(2019, 10, 27, tzinfo=timezone.utc),
    )

    auth = utils.id_auth(cambridge_leader_user)
    all_res = api_client.get(f"/v1/vol_prospect_assignments/", **auth)
    assert all_res.status_code == 200
    assert len(all_res.data) == 1
    assert all_res.data[0]["person"]["has_email"]
Exemple #30
0
def test_assignments_are_throttled(api_client, cambridge_prospect_assignment,
                                   settings):
    throttle_settings = settings.REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]
    assert "hour.vol_prospect_assignments" in throttle_settings
    assert "day.vol_prospect_assignments" in throttle_settings
    throttle_settings["day.vol_prospect_assignments"] = "1/day"
    auth = utils.id_auth(cambridge_prospect_assignment.user)
    res = api_client.get(
        f"/v1/vol_prospect_assignments/{cambridge_prospect_assignment.id}/",
        **auth)
    assert res.status_code == 200
    res = api_client.get(
        f"/v1/vol_prospect_assignments/{cambridge_prospect_assignment.id}/",
        **auth)
    assert res.status_code == 429