Skip to content
Snippets Groups Projects
test_access_rights.py 6.74 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.urls import reverse
    
    from rest_framework import status
    
    from rest_framework.test import (APIRequestFactory, APITestCase,
                                     force_authenticate)
    
    
    from core.views import (ExamApiViewSet, StudentReviewerApiViewSet,
    
                            StudentSelfApiView, CorrectorApiViewSet)
    
    from util.factories import GradyUserFactory, make_exams
    
    class AccessRightsOfStudentAPIViewTests(APITestCase):
    
        """ All tests that ensure that only students can see what students
    
        should see belong here """
    
        @classmethod
        def setUpTestData(cls):
            cls.factory = APIRequestFactory()
            cls.user_factory = GradyUserFactory()
    
        def setUp(self):
    
            self.exam = make_exams(exams=[{
                    'module_reference': 'Test Exam 01',
                    'total_score': 100,
                    'pass_score': 60,
                }])[0]
            self.student = self.user_factory.make_student(exam=self.exam)
    
            self.tutor = self.user_factory.make_tutor()
            self.reviewer = self.user_factory.make_reviewer()
    
            self.request = self.factory.get(reverse('student-page'))
            self.view = StudentSelfApiView.as_view()
    
        def test_unauthenticated_access_denied(self):
    
            response = self.view(self.request)
    
            self.assertEqual(status.HTTP_401_UNAUTHORIZED, response.status_code)
    
    
        def test_tutor_has_no_access(self):
    
            force_authenticate(self.request, user=self.tutor)
    
            response = self.view(self.request)
    
            self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)
    
    
        def test_reviewer_has_no_access(self):
    
            force_authenticate(self.request, user=self.reviewer)
    
            response = self.view(self.request)
    
            self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)
    
    
        def test_student_is_authorized(self):
    
            force_authenticate(self.request, user=self.student)
    
            response = self.view(self.request)
    
            self.assertEqual(status.HTTP_200_OK, response.status_code)
    
    
    
    class AccessRightsOfTutorAPIViewTests(APITestCase):
    
        """ Tests to ensure that only Reviewers have access to the TutorList
            information """
    
        @classmethod
        def setUpTestData(cls):
            cls.factory = APIRequestFactory()
            cls.user_factory = GradyUserFactory()
    
        def setUp(self):
    
            self.exam = make_exams(exams=[{
                    'module_reference': 'Test Exam 01',
                    'total_score': 100,
                    'pass_score': 60,
                }])[0]
            self.student = self.user_factory.make_student(exam=self.exam)
    
            self.tutor = self.user_factory.make_tutor()
            self.reviewer = self.user_factory.make_reviewer()
    
    robinwilliam.hundt's avatar
    robinwilliam.hundt committed
            self.request = self.factory.get(reverse('corrector-list'))
    
            self.view = CorrectorApiViewSet.as_view({'get': 'list'})
    
    
        def test_unauthenticated_access_denied(self):
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
    
        def test_student_has_no_access(self):
    
            force_authenticate(self.request, user=self.student)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
        def test_tutor_has_no_access(self):
    
            force_authenticate(self.request, user=self.tutor)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
        def test_reviewer_has_access(self):
    
            force_authenticate(self.request, user=self.reviewer)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_200_OK)
    
    
    class AccessRightsOfStudentReviewerAPIViewTest(APITestCase):
    
        """ Tests to ensure that only Reviewers have access to the
        StudentReviewerApi endpoint information"""
    
    
        @classmethod
        def setUpTestData(cls):
            cls.factory = APIRequestFactory()
            cls.user_factory = GradyUserFactory()
    
        def setUp(self):
    
            self.exam = make_exams(exams=[{
                    'module_reference': 'Test Exam 01',
                    'total_score': 100,
                    'pass_score': 60,
                }])[0]
            self.student = self.user_factory.make_student(exam=self.exam)
    
            self.tutor = self.user_factory.make_tutor()
            self.reviewer = self.user_factory.make_reviewer()
            self.request = self.factory.get(reverse('student-list'))
    
            self.view = StudentReviewerApiViewSet.as_view({'get': 'list'})
    
    
        def test_unauthenticated_access_denied(self):
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
    
        def test_student_has_no_access(self):
    
            force_authenticate(self.request, user=self.student)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
        def test_tutor_has_no_access(self):
    
            force_authenticate(self.request, user=self.tutor)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
        def test_reviewer_has_access(self):
    
            force_authenticate(self.request, user=self.reviewer)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_200_OK)
    
    
    
    class AccessRightsOfExamTypeAPIViewTest(APITestCase):
        """ Tests who can access the exam list. The rational here is, that this
        list contains information about what number of points was necessary to pass
        the exam. There is no reason why anyone should see this information except
        for their own module. """
    
        @classmethod
        def setUpTestData(cls):
            cls.factory = APIRequestFactory()
            cls.user_factory = GradyUserFactory()
    
        def setUp(self):
    
            self.exam = make_exams(exams=[{
                    'module_reference': 'Test Exam 01',
                    'total_score': 100,
                    'pass_score': 60,
                }])[0]
            self.student = self.user_factory.make_student(exam=self.exam)
    
            self.tutor = self.user_factory.make_tutor()
            self.reviewer = self.user_factory.make_reviewer()
            self.request = self.factory.get(reverse('examtype-list'))
            self.view = ExamApiViewSet.as_view({'get': 'list'})
    
        def test_student_has_no_access(self):
    
            force_authenticate(self.request, user=self.student)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
    
        # TODO see issue #90 for details
        # def test_tutor_has_no_access(self):
        #     force_authenticate(self.request, user=self.tutor)
        #     response = self.view(self.request)
        #     self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
            force_authenticate(self.request, user=self.reviewer)
    
            response = self.view(self.request)
            self.assertEqual(response.status_code, status.HTTP_200_OK)