from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType from django.test import Client from hypothesis import given from hypothesis import strategies as st from hypothesis.extra.django import TestCase, from_model from paperwork.models import InstructorOrVendor, Waiver class PermissionRequiredViewTestCaseMixin: permissions = [] path = None @classmethod def setUpTestData(cls): User = get_user_model() cls.client = Client() cls.user_without_permission = User.objects.create_user( username="user_without_permission" ) cls.user_with_permission = User.objects.create_user( username="user_with_permission" ) resolved_permissions = [ Permission.objects.get( content_type=ContentType.objects.get_for_model(permission["model"]), codename=permission["codename"], ) for permission in cls.permissions ] cls.user_with_permission.user_permissions.add(*resolved_permissions) def test_missing_permission(self) -> None: self.client.force_login(self.user_without_permission) response = self.client.get(self.path) self.assertEqual(response.status_code, 403) class WaiverReportTestCase(PermissionRequiredViewTestCaseMixin, TestCase): permissions = [{"model": Waiver, "codename": "view_waiver"}] path = "/paperwork/waivers" @given(waivers=st.lists(from_model(Waiver, number=st.none()))) def test_waiver_report(self, waivers: list[Waiver]) -> None: self.client.force_login(self.user_with_permission) response = self.client.get(self.path) self.assertEqual(response.status_code, 200) class InstructorOrVendorReportTestCase(PermissionRequiredViewTestCaseMixin, TestCase): permissions = [{"model": InstructorOrVendor, "codename": "view_instructororvendor"}] path = "/paperwork/instructors-and-vendors" @given( instructors_or_vendors=st.lists( from_model(InstructorOrVendor, serial=st.none()) ) ) def test_waiver_report( self, instructors_or_vendors: list[InstructorOrVendor] ) -> None: self.client.force_login(self.user_with_permission) response = self.client.get(self.path) self.assertEqual(response.status_code, 200)