Files
notytex/tests/test_repositories.py
2025-08-05 06:13:54 +02:00

277 lines
9.9 KiB
Python

import pytest
from datetime import date
from models import db, Assessment, ClassGroup, Exercise, GradingElement
from repositories.assessment_repository import AssessmentRepository
class TestAssessmentRepository:
"""Tests pour le repository Assessment."""
def test_find_by_id(self, app):
"""Test de recherche par ID."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
assessment = Assessment(
title="Test Assessment",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, 15)
)
db.session.add(assessment)
db.session.commit()
# Test
found = repo.find_by_id(assessment.id)
assert found is not None
assert found.title == "Test Assessment"
assert found.id == assessment.id
def test_find_all(self, app):
"""Test de recherche de tous les éléments."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
assessment1 = Assessment(
title="Assessment 1",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, 15)
)
assessment2 = Assessment(
title="Assessment 2",
trimester=2,
class_group_id=class_group.id,
date=date(2023, 12, 15)
)
db.session.add_all([assessment1, assessment2])
db.session.commit()
# Test
all_assessments = repo.find_all()
assert len(all_assessments) >= 2
titles = [a.title for a in all_assessments]
assert "Assessment 1" in titles
assert "Assessment 2" in titles
def test_find_by_filters_trimester(self, app):
"""Test de recherche par trimestre."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
assessment1 = Assessment(
title="Assessment T1",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, 15)
)
assessment2 = Assessment(
title="Assessment T2",
trimester=2,
class_group_id=class_group.id,
date=date(2023, 12, 15)
)
db.session.add_all([assessment1, assessment2])
db.session.commit()
# Test
t1_assessments = repo.find_by_filters(trimester=1)
assert len(t1_assessments) >= 1
assert all(a.trimester == 1 for a in t1_assessments)
t2_assessments = repo.find_by_filters(trimester=2)
assert len(t2_assessments) >= 1
assert all(a.trimester == 2 for a in t2_assessments)
def test_find_by_filters_class_id(self, app):
"""Test de recherche par classe."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group1 = ClassGroup(name="6A", year="2023-2024")
class_group2 = ClassGroup(name="6B", year="2023-2024")
db.session.add_all([class_group1, class_group2])
db.session.commit()
assessment1 = Assessment(
title="Assessment 6A",
trimester=1,
class_group_id=class_group1.id,
date=date(2023, 10, 15)
)
assessment2 = Assessment(
title="Assessment 6B",
trimester=1,
class_group_id=class_group2.id,
date=date(2023, 10, 15)
)
db.session.add_all([assessment1, assessment2])
db.session.commit()
# Test
class1_assessments = repo.find_by_filters(class_id=class_group1.id)
assert len(class1_assessments) >= 1
assert all(a.class_group_id == class_group1.id for a in class1_assessments)
class2_assessments = repo.find_by_filters(class_id=class_group2.id)
assert len(class2_assessments) >= 1
assert all(a.class_group_id == class_group2.id for a in class2_assessments)
def test_find_with_full_details(self, app):
"""Test de recherche avec tous les détails."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
assessment = Assessment(
title="Test Assessment",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, 15)
)
db.session.add(assessment)
db.session.commit()
exercise = Exercise(
title="Exercise 1",
assessment_id=assessment.id
)
db.session.add(exercise)
db.session.commit()
grading_element = GradingElement(
label="Question 1",
max_points=5.0,
exercise_id=exercise.id
)
db.session.add(grading_element)
db.session.commit()
# Test
found = repo.find_with_full_details(assessment.id)
assert found is not None
assert found.title == "Test Assessment"
assert found.class_group is not None
assert found.class_group.name == "6A"
assert len(found.exercises) >= 1
assert found.exercises[0].title == "Exercise 1"
assert len(found.exercises[0].grading_elements) >= 1
assert found.exercises[0].grading_elements[0].label == "Question 1"
def test_find_recent(self, app):
"""Test de recherche des évaluations récentes."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
# Créer plusieurs assessments avec dates différentes
assessments = []
for i in range(7):
assessment = Assessment(
title=f"Assessment {i}",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, i + 1)
)
assessments.append(assessment)
db.session.add_all(assessments)
db.session.commit()
# Test
recent = repo.find_recent(limit=5)
assert len(recent) == 5
# Vérifier que c'est trié par date décroissante
dates = [a.date for a in recent]
assert dates == sorted(dates, reverse=True)
def test_save_and_commit(self, app):
"""Test de sauvegarde."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
# Créer un assessment
assessment = Assessment(
title="New Assessment",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, 15)
)
# Test save
saved = repo.save(assessment)
assert saved is assessment
# L'objet est dans la session mais pas encore committé
assert assessment.id is None # Pas d'ID tant qu'on n'a pas flush/commit
# Commit
repo.commit()
# Maintenant en base avec un ID
assert assessment.id is not None
found = Assessment.query.filter_by(title="New Assessment").first()
assert found is not None
assert found.title == "New Assessment"
def test_delete(self, app):
"""Test de suppression."""
with app.app_context():
repo = AssessmentRepository()
# Créer des données de test
class_group = ClassGroup(name="6A", year="2023-2024")
db.session.add(class_group)
db.session.commit()
assessment = Assessment(
title="To Delete",
trimester=1,
class_group_id=class_group.id,
date=date(2023, 10, 15)
)
db.session.add(assessment)
db.session.commit()
assessment_id = assessment.id
# Vérifier qu'il existe
found = repo.find_by_id(assessment_id)
assert found is not None
# Supprimer
repo.delete(assessment)
repo.commit()
# Vérifier qu'il n'existe plus
found = repo.find_by_id(assessment_id)
assert found is None