import the namespace with the models

This commit is contained in:
Faraphel 2023-12-01 18:44:08 +01:00
parent 1e46056003
commit 60cbbbd273
5 changed files with 248 additions and 89 deletions

View file

@ -4,22 +4,64 @@ Tests for the Palto project's API v1.
Everything to test the API v1 is described here. Everything to test the API v1 is described here.
""" """
from django import test from rest_framework import status
from rest_framework import test
from Palto.Palto import models, factories from Palto.Palto import factories
class UserTestCase(test.TestCase): class TokenJwtTestCase(test.APITestCase):
@staticmethod
def fake_factory():
""" """
Test the creation of fake users Test the JWT token creation
""" """
for _ in range(100):
factories.FakeUserFactory() class UserApiTestCase(test.APITestCase):
def setUp(self):
self.user_admin = factories.FakeUserFactory(is_superuser=True)
self.user_anonymous = factories.FakeUserFactory()
def test_permission_admin(self):
""" Test the permissions of the object for an admin """
self.client.force_login(self.user_admin)
# check for a get request
response = self.client.get("/api/v1/users/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
# check for a post request
response = self.client.post("/api/v1/users/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
class DepartmentTestCase(test.TestCase): class DepartmentApiTestCase(test.APITestCase):
def creation(self): pass
class StudentGroupApiTestCase(test.APITestCase):
pass
class TeachingUnitApiTestCase(test.APITestCase):
pass
class StudentCardApiTestCase(test.APITestCase):
pass
class TeachingSessionApiTestCase(test.APITestCase):
pass
class AttendanceApiTestCase(test.APITestCase):
pass
class AbsenceApiTestCase(test.APITestCase):
pass
class AbsenceAttachmentApiTestCase(test.APITestCase):
pass pass

View file

@ -14,53 +14,53 @@ from ... import models
class UserViewSet(viewsets.ModelViewSet): class UserViewSet(viewsets.ModelViewSet):
serializer_class = serializers.UserSerializer serializer_class = serializers.UserSerializer
queryset = models.User.objects.all() queryset = models.User.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.UserPermission] permission_classes = [IsAuthenticated, permissions.UserPermission]
class DepartmentViewSet(UserViewSet): class DepartmentViewSet(UserViewSet):
serializer_class = serializers.DepartmentSerializer serializer_class = serializers.DepartmentSerializer
queryset = models.Department.objects.all() queryset = models.Department.objects.all().order_by("pk")
permission_classes = [permissions.DepartmentPermission] permission_classes = [permissions.DepartmentPermission]
class StudentGroupViewSet(UserViewSet): class StudentGroupViewSet(UserViewSet):
serializer_class = serializers.StudentGroupSerializer serializer_class = serializers.StudentGroupSerializer
queryset = models.StudentGroup.objects.all() queryset = models.StudentGroup.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.StudentGroupPermission] permission_classes = [IsAuthenticated, permissions.StudentGroupPermission]
class TeachingUnitViewSet(UserViewSet): class TeachingUnitViewSet(UserViewSet):
serializer_class = serializers.TeachingUnitSerializer serializer_class = serializers.TeachingUnitSerializer
queryset = models.TeachingUnit.objects.all() queryset = models.TeachingUnit.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.TeachingUnitPermission] permission_classes = [IsAuthenticated, permissions.TeachingUnitPermission]
class StudentCardViewSet(UserViewSet): class StudentCardViewSet(UserViewSet):
serializer_class = serializers.StudentCardSerializer serializer_class = serializers.StudentCardSerializer
queryset = models.StudentCard.objects.all() queryset = models.StudentCard.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.StudentCardPermission] permission_classes = [IsAuthenticated, permissions.StudentCardPermission]
class TeachingSessionViewSet(UserViewSet): class TeachingSessionViewSet(UserViewSet):
serializer_class = serializers.TeachingSessionSerializer serializer_class = serializers.TeachingSessionSerializer
queryset = models.TeachingSession.objects.all() queryset = models.TeachingSession.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.TeachingSessionPermission] permission_classes = [IsAuthenticated, permissions.TeachingSessionPermission]
class AttendanceViewSet(UserViewSet): class AttendanceViewSet(UserViewSet):
serializer_class = serializers.AttendanceSerializer serializer_class = serializers.AttendanceSerializer
queryset = models.Attendance.objects.all() queryset = models.Attendance.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.AttendancePermission] permission_classes = [IsAuthenticated, permissions.AttendancePermission]
class AbsenceViewSet(UserViewSet): class AbsenceViewSet(UserViewSet):
serializer_class = serializers.AbsenceSerializer serializer_class = serializers.AbsenceSerializer
queryset = models.Absence.objects.all() queryset = models.Absence.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.AbsencePermission] permission_classes = [IsAuthenticated, permissions.AbsencePermission]
class AbsenceAttachmentViewSet(UserViewSet): class AbsenceAttachmentViewSet(UserViewSet):
serializer_class = serializers.AbsenceAttachmentSerializer serializer_class = serializers.AbsenceAttachmentSerializer
queryset = models.AbsenceAttachment.objects.all() queryset = models.AbsenceAttachment.objects.all().order_by("pk")
permission_classes = [IsAuthenticated, permissions.AbsenceAttachmentPermission] permission_classes = [IsAuthenticated, permissions.AbsenceAttachmentPermission]

View file

@ -4,134 +4,198 @@ Factories for the Palto project.
Factories are class that allow for the automatic creation of instances of our models, primarily for testing purpose. Factories are class that allow for the automatic creation of instances of our models, primarily for testing purpose.
""" """
import random import random
from datetime import datetime, timedelta
import factory import factory
import faker
from django.utils import timezone
from Palto.Palto import models from Palto.Palto import models
# TODO(Raphaël): Voir pour la cohérence fake = faker.Faker()
class FakeUserFactory(factory.django.DjangoModelFactory): class FakeUserFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.User model = models.User
username = factory.Faker("user_name") username: str = factory.Sequence(lambda obj: f"{fake.user_name()}{random.randint(1000, 9999)}")
first_name = factory.Faker("first_name") first_name: str = factory.Faker("first_name")
last_name = factory.Faker("last_name") last_name: str = factory.Faker("last_name")
email = factory.Faker("email") email: str = factory.Faker("email")
class FakeDepartmentFactory(factory.django.DjangoModelFactory): class FakeDepartmentFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.Department model = models.Department
name = factory.Faker("company") name: str = factory.Faker("company")
email = factory.Faker("company_email") email: str = factory.Faker("company_email")
managers = factory.RelatedFactoryList( @factory.post_generation
FakeUserFactory, def managers(self, create, extracted, **kwargs):
"managing_departments", if not create:
size=lambda: random.randint(1, 3) return
)
teachers = factory.RelatedFactoryList( if extracted is not None:
FakeUserFactory, self.managers.add(*extracted)
"teaching_departments", else:
size=lambda: random.randint(1, 50) self.managers.add(*[FakeUserFactory() for _ in range(random.randint(1, 3))])
)
students = factory.RelatedFactoryList( @factory.post_generation
FakeUserFactory, def teachers(self, create, extracted, **kwargs):
"studying_departments", if not create:
size=lambda: random.randint(1, 500) return
)
if extracted is not None:
self.teachers.add(*extracted)
else:
self.teachers.add(*[FakeUserFactory() for _ in range(random.randint(2, 10))])
@factory.post_generation
def students(self, create, extracted, **kwargs):
if not create:
return
if extracted is not None:
self.students.add(*extracted)
else:
self.students.add(*[FakeUserFactory() for _ in range(random.randint(50, 150))])
class FakeStudentGroupFactory(factory.django.DjangoModelFactory): class FakeStudentGroupFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.StudentGroup model = models.StudentGroup
name = factory.Faker("administrative_unit") name: str = factory.Faker("administrative_unit")
owner = factory.SubFactory(FakeUserFactory) owner: models.User = factory.SubFactory(FakeUserFactory)
department = factory.SubFactory(FakeDepartmentFactory) department: models.Department = factory.SubFactory(FakeDepartmentFactory)
students = factory.RelatedFactoryList(FakeUserFactory, "student_groups", size=lambda: random.randint(0, 32))
@factory.post_generation
def students(self, create, extracted, **kwargs):
if not create:
return
if extracted is not None:
self.students.add(*extracted)
else:
# create a group of between 5 and 50 students from this department
self.students.add(*self.department.students.order_by('?')[:random.randint(5, 50)])
class FakeTeachingUnitFactory(factory.django.DjangoModelFactory): class FakeTeachingUnitFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.TeachingUnit model = models.TeachingUnit
name = factory.Faker("administrative_unit") name: str = factory.Faker("administrative_unit")
department = factory.SubFactory( department: models.Department = factory.SubFactory(
FakeDepartmentFactory FakeDepartmentFactory
) )
managers = factory.RelatedFactoryList(
FakeUserFactory, @factory.post_generation
"managing_units", def managers(self, create, extracted, **kwargs):
size=lambda: random.randint(1, 3) if not create:
) return
teachers = factory.RelatedFactoryList(
FakeUserFactory, if extracted is not None:
"teaching_units", self.managers.add(*extracted)
size=lambda: random.randint(1, 5) else:
) # create a group of between 1 and 2 managers from the teacher's department
student_groups = factory.RelatedFactoryList( self.managers.add(*self.department.teachers.order_by('?')[:random.randint(1, 2)])
FakeStudentGroupFactory,
"studying_units", @factory.post_generation
size=lambda: random.randint(1, 3) def teachers(self, create, extracted, **kwargs):
) if not create:
return
if extracted is not None:
self.teachers.add(*extracted)
else:
# create a group of between 2 and 10 teachers from the teacher's department
self.teachers.add(*self.department.teachers.order_by('?')[:random.randint(2, 10)])
@factory.post_generation
def student_groups(self, create, extracted, **kwargs):
if not create:
return
if extracted is not None:
self.student_groups.add(*extracted)
else:
# create a group of between 1 and 2 student groups from the department
self.student_groups.add(*[
FakeStudentGroupFactory.create(department=self.department)
for _ in range(random.randint(1, 2))
])
class FakeStudentCardFactory(factory.django.DjangoModelFactory): class FakeStudentCardFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.StudentCard model = models.StudentCard
uid = factory.Faker("binary", length=7) uid: bytes = factory.Faker("binary", length=7)
department = factory.SubFactory(FakeDepartmentFactory) department: models.Department = factory.SubFactory(FakeDepartmentFactory)
owner = factory.SubFactory(FakeUserFactory) owner: models.User = factory.SubFactory(FakeUserFactory)
class FakeTeachingSessionFactory(factory.django.DjangoModelFactory): class FakeTeachingSessionFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.TeachingSession model = models.TeachingSession
start = factory.Faker("date_time") start: timedelta = factory.Faker("date_time", tzinfo=timezone.get_current_timezone())
duration = factory.Faker("time_delta") duration: timedelta = factory.Faker("time_delta")
note = factory.Faker("paragraph") note: str = factory.Faker("paragraph")
unit = factory.SubFactory(FakeTeachingUnitFactory) unit: models.TeachingUnit = factory.SubFactory(FakeTeachingUnitFactory)
group = factory.SubFactory(FakeStudentGroupFactory) group: models.StudentGroup = factory.SubFactory(FakeStudentGroupFactory)
owner = factory.SubFactory(FakeUserFactory) teacher: models.User = factory.SubFactory(FakeUserFactory)
class FakeAttendanceFactory(factory.django.DjangoModelFactory): class FakeAttendanceFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.Attendance model = models.Attendance
date = factory.Faker("date_time") date: datetime = factory.Faker("date_time", tzinfo=timezone.get_current_timezone())
student = factory.SubFactory(FakeUserFactory) student: models.User = factory.SubFactory(FakeUserFactory)
session = factory.SubFactory(FakeTeachingSessionFactory) session: models.TeachingSession = factory.SubFactory(FakeTeachingSessionFactory)
class FakeAbsenceFactory(factory.django.DjangoModelFactory): class FakeAbsenceFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.Absence model = models.Absence
message = factory.Faker("paragraph") message: str = factory.Faker("paragraph")
student = factory.SubFactory(FakeUserFactory) student: models.User = factory.SubFactory(FakeUserFactory)
session = factory.SubFactory(FakeTeachingSessionFactory)
@factory.post_generation
def sessions(self, create, extracted, **kwargs):
if not create:
return
if extracted is not None:
self.sessions.add(*extracted)
else:
# all the sessions should be in the same department
department = FakeDepartmentFactory()
# create a group of between 1 and 8 sessions from the department
self.sessions.add(*[
FakeTeachingSessionFactory.create(unit__department=department)
for _ in range(random.randint(1, 8))
])
class FakeAbsenceAttachmentFactory(factory.django.DjangoModelFactory): class FakeAbsenceAttachmentFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = models.AbsenceAttachment model = models.AbsenceAttachment
content = factory.django.FileField() content: str = factory.django.FileField()
absence = factory.SubFactory(FakeAbsenceFactory) absence: models.Absence = factory.SubFactory(FakeAbsenceFactory)

View file

@ -56,7 +56,7 @@ class Department(models.Model):
""" """
id: uuid.UUID = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False, max_length=36) id: uuid.UUID = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False, max_length=36)
name: str = models.CharField(max_length=64) name: str = models.CharField(max_length=64, unique=True)
email: str = models.EmailField() email: str = models.EmailField()
managers = models.ManyToManyField(to=get_user_model(), blank=True, related_name="managing_departments") managers = models.ManyToManyField(to=get_user_model(), blank=True, related_name="managing_departments")
@ -229,14 +229,13 @@ class Absence(models.Model):
message: str = models.TextField() message: str = models.TextField()
student: User = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE, related_name="absented_sessions") student: User = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE, related_name="absented_sessions")
session: TeachingSession = models.ManyToManyField(to=TeachingSession, blank=True, related_name="absences") sessions: TeachingSession = models.ManyToManyField(to=TeachingSession, blank=True, related_name="absences")
def __repr__(self): def __repr__(self):
return ( return (
f"<{self.__class__.__name__} " f"<{self.__class__.__name__} "
f"id={str(self.id)[:8]} " f"id={str(self.id)[:8]} "
f"student={self.student.username} " f"student={self.student.username}"
f"session={str(self.session.id)[:8]}"
f">" f">"
) )

View file

@ -4,7 +4,61 @@ Tests for the Palto project.
Tests allow to easily check after modifying the logic behind a feature that everything still work as intended. Tests allow to easily check after modifying the logic behind a feature that everything still work as intended.
""" """
from django.test import TestCase from django import test
from Palto.Palto import factories
# Create your tests here. # Create your tests here.
from .api.v1 import tests class UserTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeUserFactory()
class DepartmentTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeDepartmentFactory()
class StudentGroupTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeStudentGroupFactory()
class TeachingUnitTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeTeachingUnitFactory()
class StudentCardTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeStudentCardFactory()
class TeachingSessionTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeTeachingSessionFactory()
class AttendanceTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeAttendanceFactory()
class AbsenceTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeAbsenceFactory()
class AbsenceAttachmentTestCase(test.TestCase):
@staticmethod
def test_creation():
factories.FakeAbsenceAttachmentFactory()