Пример #1
0
    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)])
Пример #2
0
    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)
Пример #3
0
    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)])
Пример #4
0
    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)
Пример #5
0
 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)
Пример #6
0
    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)
Пример #7
0
 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,
     )
Пример #8
0
 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)
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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}],
                        },
                    ),
                    {},
                ),
            )