Newer
Older
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()
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)
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)