def test_assign_already_assigned_referral(self, _): """ A referral which was assigned to one user can be assigned to an additional one, staying in the ASSIGNED state. """ referral = factories.ReferralFactory( state=models.ReferralState.ASSIGNED) exsting_assignee = factories.ReferralAssignmentFactory( referral=referral, unit=referral.topic.unit).assignee user = factories.UnitMembershipFactory( role=models.UnitMembershipRole.OWNER, unit=referral.topic.unit).user assignee = factories.UnitMembershipFactory( unit=referral.topic.unit).user response = self.client.post( f"/api/referrals/{referral.id}/assign/", {"assignee_id": assignee.id}, HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=user)[0]}", ) self.assertEqual(response.status_code, 200) self.assertEqual(response.json()["state"], models.ReferralState.ASSIGNED) self.assertEqual(response.json()["assignees"], [str(exsting_assignee.id), str(assignee.id)])
def test_list_unitmemberships_for_unit_from_anonymous_user(self): """ Anonymous users cannot list existing unit memberships. """ membership = factories.UnitMembershipFactory() response = self.client.get( f"/api/unitmemberships/?limit=999&unit={membership.unit.id}") self.assertEqual(response.status_code, 401)
def test_assign_referral_by_linked_unit_organizer(self, _): """ Organizers of the linked unit can assign a referral. """ referral = factories.ReferralFactory() user = factories.UnitMembershipFactory( role=models.UnitMembershipRole.OWNER, unit=referral.topic.unit).user assignee = factories.UnitMembershipFactory( unit=referral.topic.unit).user response = self.client.post( f"/api/referrals/{referral.id}/assign/", {"assignee_id": assignee.id}, HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=user)[0]}", ) self.assertEqual(response.status_code, 200) self.assertEqual(response.json()["state"], models.ReferralState.ASSIGNED) self.assertEqual(response.json()["assignees"], [str(assignee.id)])
def test_list_unitmemberships_from_random_logged_in_user(self): """ Unit memberships cannot be listed without a unit param. """ factories.UnitMembershipFactory() user = factories.UserFactory() response = self.client.get( "/api/unitmemberships/?limit=999", HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=user)[0]}", ) self.assertEqual(response.status_code, 404)
def test_assign_referral_by_linked_unit_member(self, _): """ Regular members of the linked unit cannot assign a referral. """ referral = factories.ReferralFactory() user = factories.UnitMembershipFactory( role=models.UnitMembershipRole.MEMBER, unit=referral.topic.unit).user response = self.client.post( f"/api/referrals/{referral.id}/assign/", {"assignee_id": "42"}, HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=user)[0]}", ) self.assertEqual(response.status_code, 403)
def test_list_unitmemberships_for_nonexistent_unit(self): """ The request errors out when a user attempts to list memberships for a unit that does not exist. """ membership = factories.UnitMembershipFactory( role=models.UnitMembershipRole.MEMBER) id = uuid.uuid4() response = self.client.get( f"/api/unitmemberships/?limit=999&unit={id}", HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=membership.user)[0]}", ) self.assertEqual(response.status_code, 404)
def test_whoami_by_logged_in_user(self): """ Logged-in users can make `whoami` requests and receive their own user object. """ user = factories.UserFactory() factories.UnitMembershipFactory(user=user) response = self.client.get( "/api/users/whoami/", HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=user)[0]}", ) self.assertEqual(response.status_code, 200) self.assertEqual(response.json()["id"], str(user.id)) self.assertEqual( response.json()["memberships"][0]["id"], user.unitmembership_set.first().id, ) self.assertEqual( response.json()["memberships"][0]["unit_name"], user.unitmembership_set.first().unit.name, )
def test_unassign_referral_by_linked_unit_member(self, _): """ Regular members of the linked unit cannot unassign anyonce (incl. themselves) from a referral. """ referral = factories.ReferralFactory( state=models.ReferralState.ASSIGNED) assignee = factories.UnitMembershipFactory( role=models.UnitMembershipRole.MEMBER).user assignment = factories.ReferralAssignmentFactory( assignee=assignee, referral=referral, unit=referral.topic.unit, ) response = self.client.post( f"/api/referrals/{referral.id}/assign/", {"assignee_id": assignment.assignee.id}, HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=assignment.assignee)[0]}", ) self.assertEqual(response.status_code, 403)
def test_list_unitmemberships_for_unit_from_unit_member(self): """ Unit members can list memberships for their unit. """ membership = factories.UnitMembershipFactory( role=models.UnitMembershipRole.MEMBER) other_memberships = factories.UnitMembershipFactory.create_batch( 2, unit=membership.unit) response = self.client.get( f"/api/unitmemberships/?limit=999&unit={membership.unit.id}", HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=membership.user)[0]}", ) self.assertEqual(response.status_code, 200) self.assertEqual(response.json()["count"], 3) self.assertEqual(response.json()["results"][0]["id"], membership.id) self.assertEqual(response.json()["results"][1]["id"], other_memberships[0].id) self.assertEqual(response.json()["results"][2]["id"], other_memberships[1].id)
def test_list_unitmemberships_for_unit_from_random_logged_in_user(self): """ Random logged in users can list existing unit memberships. """ membership = factories.UnitMembershipFactory() other_memberships = factories.UnitMembershipFactory.create_batch( 2, unit=membership.unit) user = factories.UserFactory() response = self.client.get( f"/api/unitmemberships/?limit=999&unit={membership.unit.id}", HTTP_AUTHORIZATION= f"Token {Token.objects.get_or_create(user=user)[0]}", ) self.assertEqual(response.status_code, 200) self.assertEqual(response.json()["count"], 3) self.assertEqual(response.json()["results"][0]["id"], membership.id) self.assertEqual(response.json()["results"][1]["id"], other_memberships[0].id) self.assertEqual(response.json()["results"][2]["id"], other_memberships[1].id)
def test_create_referralmessage_by_referral_linked_user(self, mock_mailer_send): """ A referral's linked user can create messages for their referral. """ # Create a unit with an owner, and admin and a member unit1 = factories.UnitFactory() unit1_owner_membership = factories.UnitMembershipFactory( unit=unit1, role=models.UnitMembershipRole.OWNER ) factories.UnitMembershipFactory( unit=unit1, role=models.UnitMembershipRole.ADMIN ) factories.UnitMembershipFactory( unit=unit1, role=models.UnitMembershipRole.MEMBER ) # Create another unit with two owners and a member unit2 = factories.UnitFactory() unit2_owner1_membership = factories.UnitMembershipFactory( unit=unit2, role=models.UnitMembershipRole.OWNER ) unit2_owner2_membership = factories.UnitMembershipFactory( unit=unit2, role=models.UnitMembershipRole.OWNER ) factories.UnitMembershipFactory( unit=unit2, role=models.UnitMembershipRole.MEMBER ) referral = factories.ReferralFactory() referral.units.set([unit1, unit2]) file1 = BytesIO(b"firstfile") file1.name = "the first file name" file2 = BytesIO(b"secondfile") file2.name = "the second file name" form_data = { "content": "some message", "files": (file1, file2), "referral": str(referral.id), } self.assertEqual(models.ReferralMessage.objects.count(), 0) self.assertEqual(models.ReferralMessageAttachment.objects.count(), 0) token = Token.objects.get_or_create(user=referral.users.first())[0] response = self.client.post( "/api/referralmessages/", form_data, HTTP_AUTHORIZATION=f"Token {token}", ) self.assertEqual(response.status_code, 201) # The referral message instance was created with our values self.assertEqual(models.ReferralMessage.objects.count(), 1) self.assertEqual(response.json()["content"], "some message") self.assertEqual(response.json()["user"]["id"], str(referral.users.first().id)) self.assertEqual(response.json()["referral"], referral.id) # The related attachment instances were created along with the message self.assertEqual(models.ReferralMessageAttachment.objects.count(), 2) self.assertEqual( response.json()["attachments"][0]["name"], "the first file name" ) self.assertEqual( response.json()["attachments"][1]["name"], "the second file name" ) # The relevant email should be sent to all owners of units linked to the referral # but not to the referral user (they sent the message) or regular members self.assertEqual(mock_mailer_send.call_count, 3) for index, owner_membership in enumerate( [ unit1_owner_membership, unit2_owner1_membership, unit2_owner2_membership, ] ): self.assertEqual( tuple(mock_mailer_send.call_args_list[index]), ( ( { "params": { "case_number": referral.id, "link_to_referral": ( f"https://partaj/app/unit/{owner_membership.unit.id}" f"/referrals-list/referral-detail/{referral.id}/messages" ), "message_author": referral.users.first().get_full_name(), "referral_author": referral.users.first().get_full_name(), "title": referral.object, "topic": referral.topic.name, }, "replyTo": { "email": "*****@*****.**", "name": "Partaj", }, "templateId": settings.SENDINBLUE[ "REFERRAL_NEW_MESSAGE_FOR_UNIT_MEMBER_TEMPLATE_ID" ], "to": [{"email": owner_membership.user.email}], }, ), {}, ), )