2021-12-02 12:08:03 +01:00
|
|
|
"""Test models referentiel compétences
|
|
|
|
|
|
|
|
Utiliser par exemple comme:
|
|
|
|
pytest tests/unit/test_refcomp.py
|
|
|
|
|
|
|
|
"""
|
2022-05-01 23:58:41 +02:00
|
|
|
|
2021-12-02 12:08:03 +01:00
|
|
|
from flask import g
|
2022-05-01 23:58:41 +02:00
|
|
|
|
2021-12-02 12:08:03 +01:00
|
|
|
from app import db
|
2021-12-03 14:13:49 +01:00
|
|
|
from app import models
|
2021-12-02 12:08:03 +01:00
|
|
|
from app.but.import_refcomp import orebut_import_refcomp
|
2022-05-01 23:58:41 +02:00
|
|
|
from app.models import UniteEns
|
2021-12-02 12:08:03 +01:00
|
|
|
from app.models.but_refcomp import (
|
|
|
|
ApcReferentielCompetences,
|
|
|
|
ApcCompetence,
|
|
|
|
ApcSituationPro,
|
2022-05-01 23:58:41 +02:00
|
|
|
ApcNiveau,
|
2021-12-02 12:08:03 +01:00
|
|
|
)
|
2022-10-29 15:42:03 +02:00
|
|
|
from app.models.formations import Formation
|
2021-12-02 12:08:03 +01:00
|
|
|
|
2022-05-01 23:58:41 +02:00
|
|
|
from tests.unit import setup
|
|
|
|
|
|
|
|
REF_RT_XML = open(
|
|
|
|
"ressources/referentiels/but2022/competences/but-RT-05012022-081735.xml"
|
|
|
|
).read()
|
2023-03-26 10:08:50 +02:00
|
|
|
REF_MLT_XML = open(
|
|
|
|
"ressources/referentiels/but2022/competences/but-MLT-05012022-081603.xml"
|
|
|
|
).read()
|
|
|
|
REF_GCCD_XML = open(
|
|
|
|
"ressources/referentiels/but2022/competences/but-GCCD-05012022-081630.xml"
|
|
|
|
).read()
|
2023-04-03 17:46:31 +02:00
|
|
|
REF_INFO_XML = open(
|
|
|
|
"ressources/referentiels/but2022/competences/but-INFO-05012022-081701.xml"
|
|
|
|
).read()
|
2022-05-01 23:58:41 +02:00
|
|
|
|
2021-12-02 12:08:03 +01:00
|
|
|
|
|
|
|
def test_but_refcomp(test_client):
|
|
|
|
"""modèles ref. comp."""
|
2021-12-03 14:13:49 +01:00
|
|
|
dept_id = models.Departement.query.first().id
|
2022-05-01 23:58:41 +02:00
|
|
|
ref_comp: ApcReferentielCompetences = orebut_import_refcomp(REF_RT_XML, dept_id)
|
|
|
|
assert ref_comp.competences.count() == 13
|
|
|
|
assert ref_comp.competences[0].situations.count() == 3
|
|
|
|
assert ref_comp.competences[0].situations[0].libelle.startswith("Conception ")
|
2021-12-03 14:13:49 +01:00
|
|
|
assert (
|
2022-05-01 23:58:41 +02:00
|
|
|
ref_comp.competences[-1].situations[-1].libelle
|
2021-12-03 14:13:49 +01:00
|
|
|
== "Administration des services multimédia"
|
|
|
|
)
|
2021-12-02 12:08:03 +01:00
|
|
|
# test cascades on delete
|
2022-05-01 23:58:41 +02:00
|
|
|
db.session.delete(ref_comp)
|
2021-12-02 12:08:03 +01:00
|
|
|
db.session.commit()
|
|
|
|
assert ApcCompetence.query.count() == 0
|
|
|
|
assert ApcSituationPro.query.count() == 0
|
2022-05-01 23:58:41 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_but_assoc_ue_parcours(test_client):
|
|
|
|
"""Association UE / Niveau compétence"""
|
|
|
|
dept_id = models.Departement.query.first().id
|
|
|
|
G, formation_id, (ue1_id, ue2_id, ue3_id), module_ids = setup.build_formation_test()
|
|
|
|
ref_comp: ApcReferentielCompetences = orebut_import_refcomp(REF_RT_XML, dept_id)
|
|
|
|
ue = UniteEns.query.get(ue1_id)
|
|
|
|
assert ue.niveau_competence is None
|
|
|
|
niveau = ApcNiveau.query.first()
|
|
|
|
ue.niveau_competence = niveau
|
|
|
|
db.session.add(ue)
|
|
|
|
db.session.commit()
|
|
|
|
ue = UniteEns.query.get(ue1_id)
|
|
|
|
assert ue.niveau_competence == niveau
|
|
|
|
assert len(niveau.ues) == 1
|
|
|
|
assert niveau.ues[0] == ue
|
2022-10-29 15:42:03 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_but_assoc_refcomp(test_client):
|
|
|
|
"""Association formation / référentiel de compétences"""
|
|
|
|
dept_id = models.Departement.query.first().id
|
|
|
|
G, formation_id, (ue1_id, ue2_id, ue3_id), module_ids = setup.build_formation_test()
|
|
|
|
formation: Formation = Formation.query.get(formation_id)
|
|
|
|
assert formation is not None
|
|
|
|
ref_comp: ApcReferentielCompetences = orebut_import_refcomp(REF_RT_XML, dept_id)
|
|
|
|
formation.referentiel_competence_id = ref_comp.id
|
|
|
|
db.session.add(formation)
|
|
|
|
db.session.commit()
|
|
|
|
ue = UniteEns.query.get(ue1_id)
|
|
|
|
niveau = (
|
|
|
|
ApcNiveau.query.filter_by(annee="BUT1")
|
|
|
|
.join(ApcCompetence)
|
|
|
|
.filter_by(referentiel_id=ref_comp.id)
|
|
|
|
.first()
|
|
|
|
)
|
|
|
|
assert niveau is not None
|
|
|
|
ue.niveau_competence_id = niveau.id
|
|
|
|
db.session.add(ue)
|
|
|
|
db.session.commit()
|
|
|
|
formation.refcomp_desassoc()
|
|
|
|
assert ue.niveau_competence_id is None
|
2023-03-26 10:08:50 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_refcomp_niveaux_mlt(test_client):
|
|
|
|
"""Test calcul niveaux / parcours pour un BUT MLT
|
|
|
|
avec en parcours "Mobilité et Supply Chain Connectées"
|
|
|
|
une compétence "Transporter" sur BUT1, BUT2
|
|
|
|
et une compétence "Digitaliser" sur BUT2, BUT3
|
|
|
|
"""
|
|
|
|
# Charger le ref. comp. MLT
|
|
|
|
dept_id = models.Departement.query.first().id
|
|
|
|
ref_comp: ApcReferentielCompetences = orebut_import_refcomp(REF_MLT_XML, dept_id)
|
|
|
|
# Vérifier qu'on a 2 parcours et 4 compétences dans chaque
|
|
|
|
nb_parcours = ref_comp.parcours.count()
|
|
|
|
assert nb_parcours == 2
|
|
|
|
assert [len(p.query_competences().all()) for p in ref_comp.parcours] == [
|
|
|
|
4
|
|
|
|
] * nb_parcours
|
|
|
|
# 3 niveaux en 1ere année (dans chaque parcours):
|
|
|
|
assert [
|
|
|
|
len(ApcNiveau.niveaux_annee_de_parcours(p, 1, ref_comp))
|
|
|
|
for p in ref_comp.parcours
|
|
|
|
] == [3, 3]
|
|
|
|
# 2 niveaux en 2ème année (dans chaque parcours):
|
|
|
|
assert [
|
|
|
|
len(ApcNiveau.niveaux_annee_de_parcours(p, 2, ref_comp))
|
|
|
|
for p in ref_comp.parcours
|
|
|
|
] == [4, 4]
|
|
|
|
# 3 niveaux en 3ème année (dans chaque parcours):
|
|
|
|
assert [
|
|
|
|
len(ApcNiveau.niveaux_annee_de_parcours(p, 3, ref_comp))
|
|
|
|
for p in ref_comp.parcours
|
|
|
|
] == [3, 3]
|
|
|
|
# Vérifier les niveaux_by_parcours
|
|
|
|
parcour = ref_comp.parcours.first()
|
|
|
|
# BUT 1
|
2023-04-03 17:46:31 +02:00
|
|
|
parcours, niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(1, [parcour])
|
2023-03-26 10:08:50 +02:00
|
|
|
assert parcours == [parcour] # le parcours indiqué
|
|
|
|
assert (tuple(niveaux_by_parcours.keys())) == (parcour.id, "TC")
|
|
|
|
assert niveaux_by_parcours[parcour.id] == [] # tout en tronc commun en BUT1 MLT
|
|
|
|
assert niveaux_by_parcours["TC"][0].competence.titre == "Transporter"
|
|
|
|
assert len(niveaux_by_parcours["TC"]) == 3
|
|
|
|
# BUT 2
|
2023-04-03 17:46:31 +02:00
|
|
|
parcours, niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(2, [parcour])
|
2023-03-26 10:08:50 +02:00
|
|
|
assert parcours == [parcour] # le parcours indiqué
|
|
|
|
assert (tuple(niveaux_by_parcours.keys())) == (parcour.id, "TC")
|
|
|
|
assert len(niveaux_by_parcours[parcour.id]) == 1
|
|
|
|
assert len(niveaux_by_parcours["TC"]) == 3
|
|
|
|
# BUT 3
|
2023-04-03 17:46:31 +02:00
|
|
|
parcours, niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(3, [parcour])
|
2023-03-26 10:08:50 +02:00
|
|
|
assert parcours == [parcour] # le parcours indiqué
|
|
|
|
assert (tuple(niveaux_by_parcours.keys())) == (parcour.id, "TC")
|
|
|
|
assert len(niveaux_by_parcours[parcour.id]) == 1
|
|
|
|
assert len(niveaux_by_parcours["TC"]) == 2
|
|
|
|
# Vérifier les niveaux de chaque année
|
|
|
|
assert len(ApcNiveau.niveaux_annee_de_parcours(parcour, 1)) == 3
|
|
|
|
assert len(ApcNiveau.niveaux_annee_de_parcours(parcour, 2)) == 4
|
|
|
|
assert len(ApcNiveau.niveaux_annee_de_parcours(parcour, 3)) == 3
|
|
|
|
|
|
|
|
|
|
|
|
def test_refcomp_niveaux_gccd(test_client):
|
|
|
|
"""Test calcul niveaux / parcours pour un BUT GCCD
|
|
|
|
avec en parcours "Travaux Bâtiment" 5 compétences
|
|
|
|
dont la première "Solutions Bâtiment" sur BUT1, BUT2, BUT3
|
|
|
|
et en parcours "Travaux Publics" la même sur BUT1, BUT2 seulement.
|
|
|
|
"""
|
|
|
|
# Charger le ref. comp. GCCD
|
|
|
|
dept_id = models.Departement.query.first().id
|
|
|
|
ref_comp: ApcReferentielCompetences = orebut_import_refcomp(REF_GCCD_XML, dept_id)
|
|
|
|
# Vérifier qu'on a 4 parcours et 5 compétences dans chaque
|
|
|
|
nb_parcours = ref_comp.parcours.count()
|
|
|
|
assert nb_parcours == 4
|
|
|
|
assert [len(p.query_competences().all()) for p in ref_comp.parcours] == [
|
|
|
|
5
|
|
|
|
] * nb_parcours
|
|
|
|
# 5 niveaux en 1ere année (dans chaque parcours):
|
|
|
|
assert [
|
|
|
|
len(ApcNiveau.niveaux_annee_de_parcours(p, 1, ref_comp))
|
|
|
|
for p in ref_comp.parcours
|
|
|
|
] == [5] * nb_parcours
|
|
|
|
# 5 niveaux en 2ème année (dans chaque parcours):
|
|
|
|
assert [
|
|
|
|
len(ApcNiveau.niveaux_annee_de_parcours(p, 2, ref_comp))
|
|
|
|
for p in ref_comp.parcours
|
|
|
|
] == [5] * nb_parcours
|
|
|
|
# 3 niveaux en 3ème année (dans chaque parcours):
|
|
|
|
assert [
|
|
|
|
len(ApcNiveau.niveaux_annee_de_parcours(p, 3, ref_comp))
|
|
|
|
for p in ref_comp.parcours
|
|
|
|
] == [3] * nb_parcours
|
|
|
|
# Vérifier les niveaux_by_parcours
|
|
|
|
parcour = ref_comp.parcours.first()
|
|
|
|
# BUT 1
|
2023-04-03 17:46:31 +02:00
|
|
|
parcours, niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(1, [parcour])
|
2023-03-26 10:08:50 +02:00
|
|
|
assert parcours == [parcour] # le parcours indiqué
|
|
|
|
assert (tuple(niveaux_by_parcours.keys())) == (parcour.id, "TC")
|
|
|
|
assert len(niveaux_by_parcours[parcour.id]) == 0
|
|
|
|
assert len(niveaux_by_parcours["TC"]) == 5
|
|
|
|
# BUT 3
|
2023-04-03 17:46:31 +02:00
|
|
|
parcours, niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(3, [parcour])
|
2023-03-26 10:08:50 +02:00
|
|
|
assert parcours == [parcour] # le parcours indiqué
|
|
|
|
assert (tuple(niveaux_by_parcours.keys())) == (parcour.id, "TC")
|
|
|
|
assert len(niveaux_by_parcours[parcour.id]) == 3
|
|
|
|
assert len(niveaux_by_parcours["TC"]) == 0
|
|
|
|
# Vérifier les niveaux de chaque année
|
|
|
|
assert len(ApcNiveau.niveaux_annee_de_parcours(parcour, 1)) == 5
|
|
|
|
assert len(ApcNiveau.niveaux_annee_de_parcours(parcour, 2)) == 5
|
|
|
|
assert len(ApcNiveau.niveaux_annee_de_parcours(parcour, 3)) == 3
|