diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py index fbe9ea4e1..6626c9037 100644 --- a/app/scodoc/sco_assiduites.py +++ b/app/scodoc/sco_assiduites.py @@ -793,27 +793,25 @@ def get_etud_evaluations_assiduites(etud: Identite) -> list[dict]: for evaluation in evaluations: eval_assis: dict = {"evaluation_id": evaluation.id, "assiduites": []} # Pas d'assiduités si pas de date - if evaluation.date_debut is None: - continue + if evaluation.date_debut is not None: + date_debut: datetime = evaluation.date_debut + date_fin: datetime - date_debut: datetime = evaluation.date_debut - date_fin: datetime + if evaluation.date_fin is not None: + date_fin = evaluation.date_fin + else: + # On met à la fin de la journée de date_debut + date_fin = datetime.combine(date_debut.date(), time.max) - if evaluation.date_fin is not None: - date_fin = evaluation.date_fin - else: - # On met à la fin de la journée de date_debut - date_fin = datetime.combine(date_debut.date(), time.max) - - # Filtrage par rapport à la plage de l'évaluation - assiduites: Query = etud.assiduites.filter( - Assiduite.date_debut >= date_debut, - Assiduite.date_fin <= date_fin, - ) - # On récupère les assiduités et on met à jour le dictionnaire - eval_assis["assiduites"] = [ - assi.to_dict(format_api=True) for assi in assiduites - ] + # Filtrage par rapport à la plage de l'évaluation + assiduites: Query = etud.assiduites.filter( + Assiduite.date_debut >= date_debut, + Assiduite.date_fin <= date_fin, + ) + # On récupère les assiduités et on met à jour le dictionnaire + eval_assis["assiduites"] = [ + assi.to_dict(format_api=True) for assi in assiduites + ] # On ajoute le dictionnaire à la liste des évaluations etud_evaluations_assiduites.append(eval_assis) diff --git a/tests/unit/test_assiduites.py b/tests/unit/test_assiduites.py index e6e057c87..1ca1579cf 100644 --- a/tests/unit/test_assiduites.py +++ b/tests/unit/test_assiduites.py @@ -7,13 +7,17 @@ ses fonctions liées Ecrit par HARTMANN Matthias (en s'inspirant de tests.unit.test_abs_count.py par Fares Amer ) """ + import pytest +from flask_sqlalchemy.query import Query + import app.scodoc.sco_assiduites as scass import app.scodoc.sco_utils as scu from app import db, log from app.models import ( Assiduite, + Evaluation, FormSemestre, Identite, Justificatif, @@ -1115,6 +1119,7 @@ def _setup_fake_db( "formsemestres": formsemestres, "etuds": etuds, "etud_faux": etud_faux, + "g_fake": g_fake, } @@ -1730,3 +1735,104 @@ def test_cache_assiduites(test_client): ) == (1, 1, 2) # Deuxième semestre 2nj / 1j / 3t (Identique car cache et non modifié) assert scass.get_assiduites_count(etud.id, formsemestre2.to_dict()) == (2, 1, 3) + + +def test_recuperation_evaluations(test_client): + """ + Vérification du bon fonctionnement de la récupération des assiduités d'une évaluation + et de la récupération de l'assiduité aux évaluations d'un étudiant + """ + + data = _setup_fake_db( + [("2024-01-01", "2024-06-30")], + 1, + 1, + ) + moduleimpl: ModuleImpl = data["moduleimpls"][0] + etud: Identite = data["etuds"][0] + + # Création d'assiduités pour tester les évaluations + assiduites_dates = [ + "2024-01-01", + "2024-01-02", + "2024-01-03", + ] + assiduites = [] + for assi in assiduites_dates: + assiduites.append( + Assiduite.create_assiduite( + etud=etud, + date_debut=scu.is_iso_formated(assi + "T10:00", True), + date_fin=scu.is_iso_formated(assi + "T12:00", True), + etat=scu.EtatAssiduite.ABSENT, + ) + ) + + # On génère une évaluation sans date + # elle devrait renvoyer une liste vide + evaluation_1: Evaluation = Evaluation.create( + moduleimpl=moduleimpl, + ) + assert scass.get_evaluation_assiduites(evaluation_1) == [] + + # On génère une évaluation le 01/01/24 de 10h à 12h + evaluation_2: Evaluation = Evaluation.create( + moduleimpl=moduleimpl, + date_debut=scu.is_iso_formated("2024-01-01T10:00", True), + date_fin=scu.is_iso_formated("2024-01-01T12:00", True), + ) + query: Query = scass.get_evaluation_assiduites(evaluation_2) + assert isinstance(query, Query), "Erreur, la fonction ne renvoie pas une Query" + + # On vérifie le contenu de la query + # Cette query devrait contenir que la première assiduité + assert ( + query.count() == 1 + ), "Erreur, la query ne contient pas le bon nombre d'assiduités" + assert ( + query.first() == assiduites[0] + ), "Erreur, la query ne contient pas la bonne assiduité" + + # On génère une évaluation du 02/01/24 au 03/01/24 + evaluation_3: Evaluation = Evaluation.create( + moduleimpl=moduleimpl, + date_debut=scu.is_iso_formated("2024-01-02T10:00", True), + date_fin=scu.is_iso_formated("2024-01-03T12:00", True), + ) + + query: Query = scass.get_evaluation_assiduites(evaluation_3) + assert isinstance(query, Query), "Erreur, la fonction ne renvoie pas une Query" + + # On vérifie le contenu de la query + # On devrait avoir les deux dernières assiduités + assert ( + query.count() == 2 + ), "Erreur, la query ne contient pas le bon nombre d'assiduités" + assert ( + query.all() == assiduites[1:] + ), "Erreur, la query ne contient pas les bonnes assiduités" + + # Test de la récupération des assiduités aux évaluations + evaluations_assiduites = scass.get_etud_evaluations_assiduites(etud) + + assert isinstance( + evaluations_assiduites, list + ), "Erreur, la fonction ne renvoie pas une liste" + assert len(evaluations_assiduites) == 3, "Erreur, le nombre d'évaluations est faux" + assert all( + isinstance(e, dict) for e in evaluations_assiduites + ), "Erreur, les éléments de la liste ne sont pas des dictionnaires" + assert all( + "evaluation_id" in e and "assiduites" in e for e in evaluations_assiduites + ), "Erreur, les dictionnaires ne contiennent pas les bonnes clés" + assert ( + evaluations_assiduites[0]["assiduites"] == [] + ), "Erreur, la première évaluation ne devrait pas contenir d'assiduités" + + assert evaluations_assiduites[1]["assiduites"][0] == assiduites[0].to_dict( + format_api=True + ), "Erreur, la deuxième évaluation n'est pas bonne" + + assert evaluations_assiduites[2]["assiduites"] == [ + assi.to_dict(format_api=True) for assi in assiduites[1:] + ], "Erreur, la troisième évaluation n'est pas bonne"