def test_list_referralmessage_for_referral_by_referral_linked_unit_member(self, _):
        """
        A referral's linked unit member can list all referral messages linked to said referral.
        """
        user = factories.UserFactory()
        referral = factories.ReferralFactory()
        referral.units.get().members.add(user)
        referral_messages = [
            factories.ReferralMessageFactory(
                created_at=arrow.utcnow().shift(days=-15).datetime,
                referral=referral,
            ),
            factories.ReferralMessageFactory(
                created_at=arrow.utcnow().shift(days=-7).datetime,
                referral=referral,
            ),
        ]

        response = self.client.get(
            f"/api/referralmessages/?referral={referral.id}",
            HTTP_AUTHORIZATION=f"Token {Token.objects.get_or_create(user=user)[0]}",
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.json(),
            {
                "count": 2,
                "next": None,
                "previous": None,
                "results": [
                    {
                        "attachments": [],
                        "content": referral_message.content,
                        "created_at": referral_message.created_at.isoformat()[:-6]
                        + "Z",  # NB: DRF literally does this
                        "id": str(referral_message.id),
                        "referral": referral.id,
                        "user": {
                            "first_name": referral_message.user.first_name,
                            "id": str(referral_message.user.id),
                            "last_name": referral_message.user.last_name,
                            "unit_name": referral_message.user.unit_name,
                        },
                    }
                    for referral_message in referral_messages
                ],
            },
        )
 def test_retrieve_referralmessage_by_anonymous_user(self, _):
     """
     Anonymous users cannot retrieve any referral messages.
     """
     referral_message = factories.ReferralMessageFactory()
     response = self.client.get(
         f"/api/referralmessages/{referral_message.id}/",
     )
     self.assertEqual(response.status_code, 401)
    def test_list_referralmessage_for_referral_by_anonymous_user(self, _):
        """
        Anonymous users cannot make list requests for referral messages.
        """
        referral = factories.ReferralFactory()
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-15).datetime,
            referral=referral,
        )
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-7).datetime,
            referral=referral,
        )

        response = self.client.get(
            f"/api/referralmessages/?referral={referral.id}",
        )
        self.assertEqual(response.status_code, 401)
    def test_list_referral_message_missing_referral_param(self, _):
        """
        List requests for referral messages without a referral param are not supported.
        """
        referral = factories.ReferralFactory()
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-15).datetime,
            referral=referral,
        )
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-7).datetime,
            referral=referral,
        )

        token = Token.objects.get_or_create(user=referral.users.first())[0]
        response = self.client.get(
            "/api/referralmessages/",
            HTTP_AUTHORIZATION=f"Token {token}",
        )
        self.assertEqual(response.status_code, 404)
    def test_list_referral_message_for_nonexistent_referral(self, _):
        """
        The user could access one referral's messages, but passes an ID that matches no referral,
        receiving an error response.
        """
        referral = factories.ReferralFactory()
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-15).datetime,
            referral=referral,
        )
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-7).datetime,
            referral=referral,
        )

        token = Token.objects.get_or_create(user=referral.users.first())[0]
        response = self.client.get(
            f"/api/referralmessages/?referral={42}",
            HTTP_AUTHORIZATION=f"Token {token}",
        )
        self.assertEqual(response.status_code, 404)
    def test_list_referralmessage_for_referral_by_random_logged_in_user(self, _):
        """
        Random logged-in users cannot make list requests for referral messages for referrals
        to which they have no link
        """
        user = factories.UserFactory()
        referral = factories.ReferralFactory()
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-15).datetime,
            referral=referral,
        )
        factories.ReferralMessageFactory(
            created_at=arrow.utcnow().shift(days=-7).datetime,
            referral=referral,
        )

        response = self.client.get(
            f"/api/referralmessages/?referral={referral.id}",
            HTTP_AUTHORIZATION=f"Token {Token.objects.get_or_create(user=user)[0]}",
        )
        self.assertEqual(response.status_code, 403)
    def test_retrieve_referralmessage_by_referral_linked_user(self, _):
        """
        A referral's linked user can retrieve any referral message linked to that referral.
        """
        referral_message = factories.ReferralMessageFactory()
        user = referral_message.referral.users.first()
        response = self.client.get(
            f"/api/referralmessages/{referral_message.id}/",
            HTTP_AUTHORIZATION=f"Token {Token.objects.get_or_create(user=user)[0]}",
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["id"], str(referral_message.id))
    def test_retrieve_referralmessage_by_random_logged_in_user(self, _):
        """
        Random logged-in users cannot retrieve referral messages linked to referrals to which
        they themselves are not linked.
        """
        user = factories.UserFactory()
        referral_message = factories.ReferralMessageFactory()
        response = self.client.get(
            f"/api/referralmessages/{referral_message.id}/",
            HTTP_AUTHORIZATION=f"Token {Token.objects.get_or_create(user=user)[0]}",
        )

        self.assertEqual(response.status_code, 403)