From ae703416813dbfa659a157e13ab31e8618fda219 Mon Sep 17 00:00:00 2001
From: sks444 <krishnasingh.ss30@gmail.com>
Date: Wed, 25 Nov 2020 17:07:33 +0530
Subject: [PATCH] Add tests for the screening apis

---
 .../apply/api/v1/screening/tests/__init__.py  |   0
 .../api/v1/screening/tests/test_views.py      | 248 ++++++++++++++++++
 hypha/apply/api/v1/urls.py                    |   2 +-
 requirements-dev.txt                          |   1 +
 4 files changed, 250 insertions(+), 1 deletion(-)
 create mode 100644 hypha/apply/api/v1/screening/tests/__init__.py
 create mode 100644 hypha/apply/api/v1/screening/tests/test_views.py

diff --git a/hypha/apply/api/v1/screening/tests/__init__.py b/hypha/apply/api/v1/screening/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/hypha/apply/api/v1/screening/tests/test_views.py b/hypha/apply/api/v1/screening/tests/test_views.py
new file mode 100644
index 000000000..3e7c62e99
--- /dev/null
+++ b/hypha/apply/api/v1/screening/tests/test_views.py
@@ -0,0 +1,248 @@
+from django.test import override_settings
+from django.urls import reverse_lazy
+from model_bakery import baker
+from rest_framework import status
+from rest_framework.test import APITestCase
+
+from hypha.apply.funds.models import ScreeningStatus
+from hypha.apply.funds.tests.factories.models import ApplicationSubmissionFactory
+from hypha.apply.users.tests.factories import ReviewerFactory, StaffFactory, UserFactory
+
+
+@override_settings(ROOT_URLCONF='hypha.apply.urls')
+@override_settings(SECURE_SSL_REDIRECT=False)
+class ScreeningStatusViewSetTests(APITestCase):
+    def setUp(self):
+        ScreeningStatus.objects.all().delete()
+        self.yes_screening_status = baker.make(
+            'funds.ScreeningStatus',
+            yes=True
+        )
+
+    def get_screening_status_url(self, pk=None):
+        if pk:
+            return reverse_lazy('api:v1:screenings-detail', kwargs={'pk': pk})
+        return reverse_lazy('api:v1:screenings-list')
+
+    def test_staff_can_list_screening_statuses(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        response = self.client.get(
+            self.get_screening_status_url()
+        )
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(len(response.json()), ScreeningStatus.objects.count())
+        self.assertEqual(response.json()[0]['id'], self.yes_screening_status.id)
+        self.assertEqual(response.json()[0]['title'], self.yes_screening_status.title)
+        self.assertEqual(response.json()[0]['yes'], self.yes_screening_status.yes)
+        self.assertEqual(response.json()[0]['default'], self.yes_screening_status.default)
+
+    def test_staff_can_view_screening_statuses_detail(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        response = self.client.get(
+            self.get_screening_status_url(pk=self.yes_screening_status.id)
+        )
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+    def test_user_cant_list_screening_statuses(self):
+        user = UserFactory()
+        self.client.force_authenticate(user)
+        response = self.client.get(
+            self.get_screening_status_url()
+        )
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+
+    def test_reviewer_cant_list_screening_statuses(self):
+        user = ReviewerFactory()
+        self.client.force_authenticate(user)
+        response = self.client.get(
+            self.get_screening_status_url()
+        )
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+
+
+@override_settings(SECURE_SSL_REDIRECT=False)
+@override_settings(ROOT_URLCONF='hypha.apply.urls')
+class SubmissionScreeningStatusViewSetTests(APITestCase):
+    def setUp(self):
+        ScreeningStatus.objects.all().delete()
+        self.yes_screening_status = baker.make(
+            'funds.ScreeningStatus',
+            yes=True
+        )
+        self.yes_default_screening_status = baker.make(
+            'funds.ScreeningStatus',
+            yes=True,
+            default=True
+        )
+        self.no_screening_status = baker.make(
+            'funds.ScreeningStatus',
+            yes=False
+        )
+        self.no_default_screening_status = baker.make(
+            'funds.ScreeningStatus',
+            yes=False,
+            default=True
+        )
+        self.submission = ApplicationSubmissionFactory()
+
+    def get_submission_screening_status_url(self, submission_id=None):
+        return reverse_lazy('api:v1:submission-screening_statuses-list', kwargs={'submission_pk': submission_id})
+
+    def test_cant_add_screening_status_without_setting_default(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.clear()
+        response = self.client.post(
+            self.get_submission_screening_status_url(submission_id=self.submission.id),
+            data={'id': self.yes_screening_status.id}
+        )
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertEqual(
+            response.json()['detail'],
+            "Can't set screening status without default being set"
+        )
+
+    def test_cant_add_two_types_of_screening_status(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.clear()
+        self.submission.screening_statuses.add(self.yes_default_screening_status)
+        response = self.client.post(
+            self.get_submission_screening_status_url(submission_id=self.submission.id),
+            data={'id': self.no_screening_status.id}
+        )
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertEqual(
+            response.json()['detail'],
+            "Can't set screening status for both yes and no"
+        )
+
+    def test_add_screening_status(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.clear()
+        self.submission.screening_statuses.add(self.yes_default_screening_status)
+        response = self.client.post(
+            self.get_submission_screening_status_url(submission_id=self.submission.id),
+            data={'id': self.yes_screening_status.id}
+        )
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertEqual(len(response.json()), self.submission.screening_statuses.count())
+        first_submission_screening_status = self.submission.screening_statuses.first()
+        self.assertEqual(response.json()[0]['id'], first_submission_screening_status.id)
+        self.assertEqual(response.json()[0]['title'], first_submission_screening_status.title)
+        self.assertEqual(response.json()[0]['yes'], first_submission_screening_status.yes)
+        self.assertEqual(response.json()[0]['default'], first_submission_screening_status.default)
+        self.assertEqual(response.json()[1]['id'], self.submission.screening_statuses.last().id)
+
+    def test_staff_can_list_submission_screening_statuses(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.clear()
+        response = self.client.get(
+            self.get_submission_screening_status_url(submission_id=self.submission.id)
+        )
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(len(response.json()), self.submission.screening_statuses.count())
+
+    def test_set_default_screening_status(self):
+        user = StaffFactory()
+        self.submission.screening_statuses.clear()
+        self.client.force_authenticate(user)
+        response = self.client.post(
+            reverse_lazy('api:v1:submission-screening_statuses-default', kwargs={'submission_pk': self.submission.id}),
+            data={'yes': True}
+        )
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        default_set = self.submission.screening_statuses.get(default=True)
+        self.assertEqual(response.json()['id'], default_set.id)
+        self.assertEqual(response.json()['yes'], default_set.yes)
+
+    def test_change_default_screening_status(self):
+        user = StaffFactory()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.clear()
+        response = self.client.post(
+            reverse_lazy('api:v1:submission-screening_statuses-default', kwargs={'submission_pk': self.submission.id}),
+            data={'yes': True}
+        )
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        default_set = self.submission.screening_statuses.get(default=True)
+        self.assertEqual(response.json()['id'], default_set.id)
+        self.assertEqual(response.json()['yes'], default_set.yes)
+
+        response = self.client.post(
+            reverse_lazy('api:v1:submission-screening_statuses-default', kwargs={'submission_pk': self.submission.id}),
+            data={'yes': False}
+        )
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        default_set = self.submission.screening_statuses.get(default=True)
+        self.assertEqual(response.json()['id'], default_set.id)
+        self.assertEqual(response.json()['yes'], default_set.yes)
+
+    def test_cant_change_default_screening_status(self):
+        user = StaffFactory()
+        self.submission.screening_statuses.clear()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.add(self.yes_default_screening_status, self.yes_screening_status)
+        response = self.client.post(
+            reverse_lazy('api:v1:submission-screening_statuses-default', kwargs={'submission_pk': self.submission.id}),
+            data={'yes': False}
+        )
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertEqual(
+            response.json()['detail'],
+            "Can't set default as more than one screening status is already set."
+        )
+
+    def test_remove_submission_screening_status(self):
+        user = StaffFactory()
+        self.submission.screening_statuses.clear()
+        self.client.force_authenticate(user)
+        self.submission.screening_statuses.add(self.yes_default_screening_status, self.yes_screening_status)
+        response = self.client.delete(
+            reverse_lazy('api:v1:submission-screening_statuses-detail', kwargs={'submission_pk': self.submission.id, 'pk': self.yes_screening_status.id})
+        )
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(len(response.json()), 1)
+
+    def test_cant_remove_submission_default_screening_status(self):
+        user = StaffFactory()
+        self.submission.screening_statuses.clear()
+        self.submission.screening_statuses.add(self.yes_default_screening_status)
+        self.client.force_authenticate(user)
+        response = self.client.delete(
+            reverse_lazy('api:v1:submission-screening_statuses-detail', kwargs={'submission_pk': self.submission.id, 'pk': self.yes_default_screening_status.id})
+        )
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+        self.assertEqual(
+            response.json()['detail'],
+            "Can't delete default screening status."
+        )
+
+    def test_cant_remove_not_set_screening_status(self):
+        user = StaffFactory()
+        self.submission.screening_statuses.clear()
+        self.client.force_authenticate(user)
+        response = self.client.delete(
+            reverse_lazy('api:v1:submission-screening_statuses-detail', kwargs={'submission_pk': self.submission.id, 'pk': self.yes_screening_status.id})
+        )
+        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+    def test_user_cant_list_screening_statuses(self):
+        user = UserFactory()
+        self.client.force_authenticate(user)
+        response = self.client.get(
+            self.get_submission_screening_status_url(submission_id=self.submission.id)
+        )
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+
+    def test_reviewer_cant_list_screening_statuses(self):
+        user = ReviewerFactory()
+        self.client.force_authenticate(user)
+        response = self.client.get(
+            self.get_submission_screening_status_url(submission_id=self.submission.id)
+        )
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
diff --git a/hypha/apply/api/v1/urls.py b/hypha/apply/api/v1/urls.py
index 523a9444d..8a38f23af 100644
--- a/hypha/apply/api/v1/urls.py
+++ b/hypha/apply/api/v1/urls.py
@@ -31,7 +31,7 @@ submission_router.register(r'actions', SubmissionActionViewSet, basename='submis
 submission_router.register(r'comments', SubmissionCommentViewSet, basename='submission-comments')
 submission_router.register(r'reviews', SubmissionReviewViewSet, basename='reviews')
 submission_router.register(r'determinations', SubmissionDeterminationViewSet, basename='determinations')
-submission_router.register(r'screening_statuses', SubmissionScreeningStatusViewSet, basename='screening_statuses')
+submission_router.register(r'screening_statuses', SubmissionScreeningStatusViewSet, basename='submission-screening_statuses')
 
 urlpatterns = [
     path('user/', CurrentUser.as_view(), name='user'),
diff --git a/requirements-dev.txt b/requirements-dev.txt
index a16304fe3..8c2b9a3ee 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -4,6 +4,7 @@ django-debug-toolbar==2.2
 factory_boy==2.12
 flake8==3.8.3
 isort==4.3.21
+model-bakery==1.2.1
 responses==0.10.16
 stellar==0.4.5
 wagtail-factories==2.0.0
-- 
GitLab