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