From 4aa85bac8de52005dba1623a8102989a75dcea8b Mon Sep 17 00:00:00 2001
From: Iziram <matthias.hartmann@iziram.fr>
Date: Tue, 25 Jun 2024 10:44:21 +0200
Subject: [PATCH] =?UTF-8?q?Assiduit=C3=A9=20:=20test=20api=20routes=20?=
 =?UTF-8?q?=C3=A9valuations?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/api/assiduites.py                         |  6 ++-
 app/scodoc/sco_assiduites.py                  |  4 +-
 tests/api/test_api_assiduites.py              | 42 +++++++++++++++++++
 .../fakedatabase/create_test_api_database.py  |  5 ++-
 4 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/app/api/assiduites.py b/app/api/assiduites.py
index b1386ca72..503130eda 100644
--- a/app/api/assiduites.py
+++ b/app/api/assiduites.py
@@ -12,6 +12,7 @@ from flask_json import as_json
 from flask_login import current_user, login_required
 from flask_sqlalchemy.query import Query
 from sqlalchemy.orm.exc import ObjectDeletedError
+from werkzeug.exceptions import HTTPException
 
 from app import db, log, set_sco_dept
 import app.scodoc.sco_assiduites as scass
@@ -377,7 +378,10 @@ def evaluation_assiduites(evaluation_id):
     }
     """
     # Récupération de l'évaluation
-    evaluation: Evaluation = Evaluation.get_evaluation(evaluation_id)
+    try:
+        evaluation: Evaluation = Evaluation.get_evaluation(evaluation_id)
+    except HTTPException:
+        return json_error(404, "L'évaluation n'existe pas")
 
     evaluation_assiduites_par_etudid: dict[int, list[Assiduite]] = {}
     for assi in scass.get_evaluation_assiduites(evaluation):
diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py
index 1383f6ba0..fbe9ea4e1 100644
--- a/app/scodoc/sco_assiduites.py
+++ b/app/scodoc/sco_assiduites.py
@@ -737,12 +737,12 @@ def get_evaluation_assiduites(evaluation: Evaluation) -> Query:
     Renvoie une query d'assiduité en fonction des étudiants inscrits à l'évaluation
     et de la date de l'évaluation.
 
-    Attention : Si l'évaluation n'a pas de date, renvoie None
+    Attention : Si l'évaluation n'a pas de date, renvoie une liste vide
     """
 
     # Evaluation sans date
     if evaluation.date_debut is None:
-        return None
+        return []
 
     # Récupération des étudiants inscrits à l'évaluation
     etuds: Query = Identite.query.join(
diff --git a/tests/api/test_api_assiduites.py b/tests/api/test_api_assiduites.py
index 824fb51a7..b8f3f7e41 100644
--- a/tests/api/test_api_assiduites.py
+++ b/tests/api/test_api_assiduites.py
@@ -43,6 +43,8 @@ ASSIDUITES_FIELDS = {
     "external_data": dict,
 }
 
+ASSIDUITES_EVALUATIONS_FIELDS = {"evaluation_id": int, "assiduites": list}
+
 CREATE_FIELD = {"assiduite_id": int}
 BATCH_FIELD = {"errors": list, "success": list}
 
@@ -139,6 +141,46 @@ def test_route_assiduites(api_headers):
     check_failure_get(f"/assiduites/{FAUX}/query?", api_headers)
 
 
+def test_route_assiduites_evaluations(api_headers):
+    """test de la route /assiduites/<etudid:int>/evaluations"""
+
+    # Bon fonctionnement
+
+    data = GET(
+        path=f"/assiduites/{ETUDID}/evaluations", headers=api_headers, dept=DEPT_ACRONYM
+    )
+    assert isinstance(data, list)
+    for evals in data:
+        check_fields(evals, ASSIDUITES_FIELDS)
+        for assi in evals["assiduites"]:
+            check_fields(assi, ASSIDUITES_FIELDS)
+
+    # Mauvais fonctionnement
+    check_failure_get(f"/assiduites/{FAUX}/evaluations", api_headers)
+
+
+def test_route_evaluations_assiduites(api_headers):
+    """test de la route /evaluation/<int:evaluation_id>/assiduites"""
+
+    # Bon fonctionnement
+    evaluation_id = 1
+    data = GET(
+        path=f"/evaluation/{evaluation_id}/assiduites",
+        headers=api_headers,
+        dept=DEPT_ACRONYM,
+    )
+    assert isinstance(data, dict)
+    for key, val in data.items():
+        assert isinstance(key, str), "Erreur les clés ne sont pas des strings"
+        assert isinstance(val, list), "Erreur, les valeurs ne sont pas des listes"
+
+        for assi in val:
+            check_fields(assi, ASSIDUITES_FIELDS)
+
+    # Mauvais fonctionnement
+    check_failure_get(f"/evaluation/{FAUX}/assiduites", api_headers)
+
+
 def test_route_formsemestre_assiduites(api_headers):
     """test de la route /assiduites/formsemestre/<formsemestre_id:int>"""
 
diff --git a/tools/fakedatabase/create_test_api_database.py b/tools/fakedatabase/create_test_api_database.py
index cd5182bee..adeaa7c33 100644
--- a/tools/fakedatabase/create_test_api_database.py
+++ b/tools/fakedatabase/create_test_api_database.py
@@ -395,12 +395,13 @@ def ajouter_assiduites_justificatifs(formsemestre: FormSemestre):
     MODS.append(None)
 
     for etud in formsemestre.etuds:
+        # Se base sur la date des évaluations
         base_date = datetime.datetime(
-            2021, 9, [6, 13, 20, 27][random.randint(0, 3)], 8, 0, 0
+            2022, 3, [1, 8, 15, 22, 29][random.randint(0, 4)], 8, 0, 0
         )
         base_date = localize_datetime(base_date)
 
-        for i in range(random.randint(1, 5)):
+        for i in range(random.randint(1, 4)):
             etat = random.randint(0, 2)
             moduleimpl = random.choice(MODS)
             deb_date = base_date + datetime.timedelta(days=i)
-- 
GitLab