示例#1
0
    def test_list_topics_by_unit(self):
        """
        Logged-in users can list topics for a given unit.
        """
        user = factories.UserFactory()
        factories.TopicFactory.create_batch(2)

        unit = factories.UnitFactory()
        expected_topics = [
            factories.TopicFactory(name="First topic", unit=unit),
            factories.TopicFactory(name="Second topic", unit=unit),
        ]

        response = self.client.get(
            f"/api/topics/?limit=999&unit={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"], 2)
        self.assertEqual(response.json()["results"][0]["id"],
                         str(expected_topics[0].id))
        self.assertEqual(response.json()["results"][1]["id"],
                         str(expected_topics[1].id))
示例#2
0
    def test_list_topics(self):
        """
        Logged-in users can list existing topics.
        """
        user = factories.UserFactory()
        root_topics = [
            factories.TopicFactory(name="First root topic"),
            factories.TopicFactory(name="Second root topic"),
        ]
        factories.TopicFactory(is_active=False)
        factories.TopicFactory(name="Child topic", parent=root_topics[0])

        response = self.client.get(
            "/api/topics/?limit=999",
            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]["name"],
                         "First root topic")
        self.assertEqual(response.json()["results"][1]["name"], "Child topic")
        self.assertEqual(response.json()["results"][2]["name"],
                         "Second root topic")
示例#3
0
    def test_retrieve_topic(self):
        """
        Logged-in users can retrieve an existing topic.
        """
        user = factories.UserFactory()
        topic = factories.TopicFactory()
        topic.refresh_from_db()

        response = self.client.get(
            f"/api/topics/{topic.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(topic.id),
                "created_at": topic.created_at.isoformat()[:-6] +
                "Z",  # NB: DRF literally does this
                "is_active": True,
                "name": topic.name,
                "parent": None,
                "path": "0000",
                "unit": str(topic.unit.id),
                "unit_name": topic.unit.name,
            },
        )
示例#4
0
    def test_create_referral_by_random_logged_in_user_with_invalid_form(
            self, _):
        """
        If the form is invalid (for example, missing a required field), referral creation
        should fail.
        """
        user = factories.UserFactory()
        topic = factories.TopicFactory()

        form_data = {
            "context": "le contexte",
            "prior_work": "le travail préalable",
            "requester": "le demandeur ou la demandeuse",
            "topic": str(topic.id),
            "urgency": models.Referral.URGENCY_2,
            "urgency_explanation": "la justification de l'urgence",
        }
        response = self.client.post(
            "/api/referrals/",
            form_data,
            HTTP_AUTHORIZATION=
            f"Token {Token.objects.get_or_create(user=user)[0]}",
        )
        self.assertEqual(response.status_code, 400)
        self.assertEqual(
            response.json(),
            {"question": ["Ce champ est obligatoire."]},
        )
示例#5
0
    def test_create_referral_by_random_logged_in_user(self, _):
        """
        Any logged-in user can create a referral using the CREATE endpoint.
        """
        topic = factories.TopicFactory()
        urgency_level = factories.ReferralUrgencyFactory()
        user = factories.UserFactory()

        file1 = BytesIO(b"firstfile")
        file1.name = "the first file name"
        file2 = BytesIO(b"secondfile")
        file2.name = "the second file name"
        form_data = {
            "context": "le contexte",
            "files": (file1, file2),
            "prior_work": "le travail préalable",
            "question": "la question posée",
            "requester": "le demandeur ou la demandeuse",
            "topic": str(topic.id),
            "urgency_level": urgency_level.id,
            "urgency_explanation": "la justification de l'urgence",
        }
        response = self.client.post(
            "/api/referrals/",
            form_data,
            HTTP_AUTHORIZATION=
            f"Token {Token.objects.get_or_create(user=user)[0]}",
        )
        self.assertEqual(response.status_code, 201)

        referral = models.Referral.objects.get(id=response.json()["id"])
        # All simple fields match the incoming request
        self.assertEqual(referral.context, "le contexte")
        self.assertEqual(referral.prior_work, "le travail préalable")
        self.assertEqual(referral.question, "la question posée")
        self.assertEqual(referral.requester, "le demandeur ou la demandeuse")
        self.assertEqual(referral.urgency_level, urgency_level)
        self.assertEqual(referral.urgency_explanation,
                         "la justification de l'urgence")
        # The correct foreign keys were added to the referral
        self.assertEqual(referral.topic, topic)
        self.assertEqual(referral.user, user)
        # The attachments for the referral were created and linked with it
        self.assertEqual(referral.attachments.count(), 2)
        self.assertEqual(referral.attachments.all()[0].file.read(),
                         b"firstfile")
        self.assertEqual(referral.attachments.all()[0].name,
                         "the first file name")
        self.assertEqual(referral.attachments.all()[1].file.read(),
                         b"secondfile")
        self.assertEqual(referral.attachments.all()[1].name,
                         "the second file name")
        # The "create" activity for the Referral is generated
        activities = models.ReferralActivity.objects.filter(
            referral__id=referral.id)
        self.assertEqual(len(activities), 1)
        self.assertEqual(activities[0].referral, referral)
        self.assertEqual(activities[0].actor, user)
        self.assertEqual(activities[0].verb,
                         models.ReferralActivityVerb.CREATED)
示例#6
0
    def test_list_topics_from_anonymous_user(self):
        """
        Anonymous users cannot list existing topics.
        """
        factories.TopicFactory()
        response = self.client.get("/api/topics/?limit=999")

        self.assertEqual(response.status_code, 401)
示例#7
0
    def test_retrieve_topic_by_anonymous_user(self):
        """
        Anonymous users cannot retrieve an existing topic.
        """
        topic = factories.TopicFactory()

        response = self.client.get(f"/api/topics/{topic.id}/", )

        self.assertEqual(response.status_code, 401)
示例#8
0
    def test_list_topics_by_search_query(self):
        """
        Logged-in users can search through topics with an arbitrary text query.
        """
        user = factories.UserFactory()

        factories.TopicFactory(name="The amazing topic")
        factories.TopicFactory(name="The topic that amazes")
        factories.TopicFactory(name="The boring old topic")

        response = self.client.get(
            "/api/topics/?limit=999&query=amaz",
            HTTP_AUTHORIZATION=
            f"Token {Token.objects.get_or_create(user=user)[0]}",
        )

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["count"], 2)
        self.assertEqual(response.json()["results"][0]["name"],
                         "The amazing topic")
        self.assertEqual(response.json()["results"][1]["name"],
                         "The topic that amazes")
示例#9
0
    def test_retrieve_topic(self):
        """
        Logged-in users can retrieve an existing topic.
        """
        user = factories.UserFactory()
        topic = factories.TopicFactory()

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

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json(), TopicSerializer(topic).data)
示例#10
0
    def test_destroy_topic(self):
        """
        The topic API does not support topic deletion.
        """
        user = factories.UserFactory(is_staff=True)
        topic = factories.TopicFactory()

        response = self.client.delete(
            f"/api/topics/{topic.id}/",
            HTTP_AUTHORIZATION=f"Token {Token.objects.get_or_create(user=user)[0]}",
        )

        self.assertEqual(response.status_code, 403)
        self.assertEqual(Topic.objects.count(), 1)
示例#11
0
    def test_update_topic(self):
        """
        The topic API does not support topic update.
        """
        user = factories.UserFactory(is_staff=True)
        topic = factories.TopicFactory(name="old topic name")

        response = self.client.put(
            f"/api/topics/{topic.id}/",
            {**TopicSerializer(topic).data, "name": "new topic name"},
            HTTP_AUTHORIZATION=f"Token {Token.objects.get_or_create(user=user)[0]}",
        )

        self.assertEqual(response.status_code, 403)
        topic.refresh_from_db()
        self.assertEqual(topic.name, "old topic name")
示例#12
0
    def test_create_referral_by_admin_user(self, _):
        """
        Admin users can create referrals just like regular logged-in users.
        """
        topic = factories.TopicFactory()
        urgency_level = factories.ReferralUrgencyFactory()
        user = factories.UserFactory(is_staff=True, is_superuser=True)

        form_data = {
            "context": "le contexte",
            "prior_work": "le travail préalable",
            "question": "la question posée",
            "requester": "le demandeur ou la demandeuse",
            "topic": str(topic.id),
            "urgency_level": urgency_level.id,
            "urgency_explanation": "la justification de l'urgence",
        }
        response = self.client.post(
            "/api/referrals/",
            form_data,
            HTTP_AUTHORIZATION=
            f"Token {Token.objects.get_or_create(user=user)[0]}",
        )
        self.assertEqual(response.status_code, 201)

        referral = models.Referral.objects.get(id=response.json()["id"])
        # All simple fields match the incoming request
        self.assertEqual(referral.context, "le contexte")
        self.assertEqual(referral.prior_work, "le travail préalable")
        self.assertEqual(referral.question, "la question posée")
        self.assertEqual(referral.requester, "le demandeur ou la demandeuse")
        self.assertEqual(referral.urgency_level, urgency_level)
        self.assertEqual(referral.urgency_explanation,
                         "la justification de l'urgence")
        # The correct foreign keys were added to the referral
        self.assertEqual(referral.topic, topic)
        self.assertEqual(referral.user, user)
        # The "create" activity for the Referral is generated
        activities = models.ReferralActivity.objects.filter(
            referral__id=referral.id)
        self.assertEqual(len(activities), 1)
        self.assertEqual(activities[0].referral, referral)
        self.assertEqual(activities[0].actor, user)
        self.assertEqual(activities[0].verb,
                         models.ReferralActivityVerb.CREATED)
示例#13
0
    def test_create_referral_by_anonymous_user(self, _):
        """
        Anonymous users cannot create a referral.
        """
        topic = factories.TopicFactory()

        form_data = {
            "context": "le contexte",
            "prior_work": "le travail préalable",
            "question": "la question posée",
            "requester": "le demandeur ou la demandeuse",
            "topic": str(topic.id),
        }
        response = self.client.post(
            "/api/referrals/",
            form_data,
        )
        self.assertEqual(response.status_code, 401)