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"]
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
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
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, )
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
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", ]
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( )
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
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
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
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
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
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 == "+"
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]
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
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 == ""
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)
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 )
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
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"
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
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
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)
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"]
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