From bf7a237b717f637810719e11da70771d4e6d4240 Mon Sep 17 00:00:00 2001 From: prafful Date: Wed, 6 Nov 2024 18:04:11 +0530 Subject: [PATCH] added filter and improved tests --- care/facility/api/viewsets/facility_flag.py | 15 ++++++++++ .../facility/tests/test_facility_flags_api.py | 29 +++++++++++++++++++ care/users/api/viewsets/user_flag.py | 15 ++++++++++ care/users/tests/test_user_flags_api.py | 26 +++++++++++++++++ 4 files changed, 85 insertions(+) diff --git a/care/facility/api/viewsets/facility_flag.py b/care/facility/api/viewsets/facility_flag.py index 8c16e1aea3..b3e18e5365 100644 --- a/care/facility/api/viewsets/facility_flag.py +++ b/care/facility/api/viewsets/facility_flag.py @@ -1,3 +1,4 @@ +from django_filters import rest_framework as filters from rest_framework import viewsets from care.facility.api.serializers.facility_flag import FacilityFlagSerializer @@ -5,8 +6,22 @@ from care.utils.custom_permissions import IsSuperUser +class FacilityFlagFilter(filters.FilterSet): + flag = filters.CharFilter(field_name="flag", lookup_expr="icontains") + facility = filters.UUIDFilter(field_name="facility__external_id") + + class FacilityFlagViewSet(viewsets.ModelViewSet): + """ + CRUD operations for FacilityFlag model. + + This viewset is restricted to superusers only and provides endpoints to manage facility flags. + """ + queryset = FacilityFlag.objects.all() serializer_class = FacilityFlagSerializer permission_classes = [IsSuperUser] lookup_field = "external_id" + + filter_backends = [filters.DjangoFilterBackend] + filterset_class = FacilityFlagFilter diff --git a/care/facility/tests/test_facility_flags_api.py b/care/facility/tests/test_facility_flags_api.py index 17a4b22c31..2cf0884b9b 100644 --- a/care/facility/tests/test_facility_flags_api.py +++ b/care/facility/tests/test_facility_flags_api.py @@ -1,6 +1,7 @@ from rest_framework import status from rest_framework.test import APITestCase +from care.facility.models import FacilityFlag from care.utils.registries.feature_flag import FlagRegistry, FlagType from care.utils.tests.test_utils import TestUtils @@ -51,11 +52,20 @@ def test_list_facility_flags(self): def test_create_facility_flag(self): self.client.force_authenticate(user=self.super_user) + response = self.client.post(self.get_url(), {}) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("This field is required.", response.json()["flag"]) + self.assertIn("This field is required.", response.json()["facility"]) + # Attempting to create a duplicate flag response = self.client.post( self.get_url(), {"flag": "TEST_FLAG", "facility": self.facility.external_id} ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn( + "The fields facility, flag must make a unique set.", + response.json()["non_field_errors"], + ) # Creating a new facility flag response = self.client.post( @@ -116,6 +126,25 @@ def test_patch_facility_flag(self): self.facility_flag_1.facility.external_id, self.facility2.external_id ) + def test_delete_facility_flag(self): + self.client.force_authenticate(user=self.super_user) + + # Confirm if the object exist + self.assertTrue( + FacilityFlag.objects.filter( + external_id=self.facility_flag_1.external_id + ).exists() + ) + response = self.client.delete(self.get_url(self.facility_flag_1.external_id)) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + self.facility_flag_1.refresh_from_db() + self.assertFalse( + FacilityFlag.objects.filter( + external_id=self.facility_flag_1.external_id + ).exists() + ) + def test_creating_facility_flag_with_non_existing_flag(self): self.client.force_authenticate(user=self.super_user) diff --git a/care/users/api/viewsets/user_flag.py b/care/users/api/viewsets/user_flag.py index 815e4be29d..bce2ad0c3b 100644 --- a/care/users/api/viewsets/user_flag.py +++ b/care/users/api/viewsets/user_flag.py @@ -1,3 +1,4 @@ +from django_filters import rest_framework as filters from rest_framework import viewsets from care.users.api.serializers.user_flag import UserFlagSerializer @@ -5,8 +6,22 @@ from care.utils.custom_permissions import IsSuperUser +class UserFlagFilter(filters.FilterSet): + flag = filters.CharFilter(field_name="flag", lookup_expr="icontains") + user = filters.UUIDFilter(field_name="user__external_id") + + class UserFlagViewSet(viewsets.ModelViewSet): + """ + CRUD operations for UserFlag model. + + This viewset is restricted to superusers only and provides endpoints to manage user flags. + """ + queryset = UserFlag.objects.all() serializer_class = UserFlagSerializer permission_classes = [IsSuperUser] lookup_field = "external_id" + + filter_backends = [filters.DjangoFilterBackend] + filterset_class = UserFlagFilter diff --git a/care/users/tests/test_user_flags_api.py b/care/users/tests/test_user_flags_api.py index e943719783..0a2a02321c 100644 --- a/care/users/tests/test_user_flags_api.py +++ b/care/users/tests/test_user_flags_api.py @@ -1,6 +1,7 @@ from rest_framework import status from rest_framework.test import APITestCase +from care.users.models import UserFlag from care.utils.registries.feature_flag import FlagRegistry, FlagType from care.utils.tests.test_utils import TestUtils @@ -49,11 +50,20 @@ def test_list_user_flags(self): def test_create_user_flag(self): self.client.force_authenticate(user=self.super_user) + response = self.client.post(self.get_url(), {}) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("This field is required.", response.json()["flag"]) + self.assertIn("This field is required.", response.json()["user"]) + # Attempting to create a duplicate flag response = self.client.post( self.get_url(), {"flag": "TEST_FLAG", "user": self.user.external_id} ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn( + "The fields user, flag must make a unique set.", + response.json()["non_field_errors"], + ) # Creating a new user flag response = self.client.post( @@ -109,6 +119,22 @@ def test_patch_user_flag(self): self.assertEqual(self.user_flag_1.flag, "TEST_FLAG") self.assertEqual(self.user_flag_1.user.external_id, self.user_2.external_id) + def test_delete_user_flag(self): + self.client.force_authenticate(user=self.super_user) + + # Confirm if the object exist + self.assertTrue( + UserFlag.objects.filter(external_id=self.user_flag_1.external_id).exists() + ) + + response = self.client.delete(self.get_url(self.user_flag_1.external_id)) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + + self.user_flag_1.refresh_from_db() + self.assertFalse( + UserFlag.objects.filter(external_id=self.user_flag_1.external_id).exists() + ) + def test_creating_user_flag_with_non_existing_flag(self): self.client.force_authenticate(user=self.super_user)