183 lines
8.8 KiB
Python
183 lines
8.8 KiB
Python
import pytest
|
|
from models import db, CompetenceScaleValue, AppConfig, Competence
|
|
from app_config import config_manager
|
|
|
|
|
|
class TestConfigIntegrationReal:
|
|
"""Tests d'intégration réalistes pour le système de configuration."""
|
|
|
|
def test_auto_initialization_scale_values(self, app):
|
|
"""Test l'initialisation automatique des valeurs d'échelle."""
|
|
with app.app_context():
|
|
# S'assurer que la table est vide
|
|
CompetenceScaleValue.query.delete()
|
|
db.session.commit()
|
|
|
|
# Appeler get_competence_scale_values() devrait déclencher l'initialisation
|
|
scale_values = config_manager.get_competence_scale_values()
|
|
|
|
# Vérifier que les valeurs par défaut ont été créées
|
|
assert len(scale_values) > 0
|
|
|
|
# Vérifier que les valeurs de base existent
|
|
assert '0' in scale_values
|
|
assert '1' in scale_values
|
|
assert '2' in scale_values
|
|
assert '3' in scale_values
|
|
assert '.' in scale_values
|
|
assert 'd' in scale_values
|
|
assert 'a' in scale_values
|
|
|
|
# Vérifier les propriétés des valeurs
|
|
assert scale_values['0']['label'] == 'Non acquis'
|
|
assert scale_values['3']['label'] == 'Expert'
|
|
assert scale_values['.']['label'] == 'Pas de réponse'
|
|
assert scale_values['d']['included_in_total'] == False # Dispensé ne compte pas
|
|
|
|
def test_config_scale_page_workflow(self, app):
|
|
"""Test le workflow complet de la page config/scale."""
|
|
with app.app_context():
|
|
# 1. Récupérer les valeurs initiales
|
|
initial_values = config_manager.get_competence_scale_values()
|
|
assert '2' in initial_values
|
|
|
|
# 2. Modifier une valeur existante (simuler ce que fait routes/config.py)
|
|
success = config_manager.update_scale_value('2', 'Acquis (modifié)', '#00ff00', True)
|
|
assert success == True
|
|
|
|
# 3. Vérifier que la modification a été prise en compte
|
|
updated_values = config_manager.get_competence_scale_values()
|
|
assert updated_values['2']['label'] == 'Acquis (modifié)'
|
|
assert updated_values['2']['color'] == '#00ff00'
|
|
|
|
# 4. Ajouter une nouvelle valeur spéciale
|
|
success = config_manager.add_scale_value('X', 'Valeur X', '#purple', False)
|
|
assert success == True
|
|
|
|
# 5. Vérifier que la nouvelle valeur existe
|
|
updated_values = config_manager.get_competence_scale_values()
|
|
assert 'X' in updated_values
|
|
assert updated_values['X']['label'] == 'Valeur X'
|
|
|
|
# 6. Supprimer la valeur ajoutée
|
|
success = config_manager.delete_scale_value('X')
|
|
assert success == True
|
|
|
|
# 7. Vérifier qu'elle a été supprimée
|
|
final_values = config_manager.get_competence_scale_values()
|
|
assert 'X' not in final_values
|
|
|
|
def test_config_validation_with_real_data(self, app):
|
|
"""Test la validation avec les vraies données de configuration."""
|
|
with app.app_context():
|
|
# S'assurer que les valeurs par défaut existent
|
|
scale_values = config_manager.get_competence_scale_values()
|
|
|
|
# Valeurs de score standard (0-3)
|
|
for i in range(4):
|
|
assert config_manager.validate_grade_value(str(i), 'score') == True
|
|
|
|
# Score invalide (> 3)
|
|
assert config_manager.validate_grade_value('4', 'score') == False
|
|
|
|
# Valeurs spéciales
|
|
assert config_manager.validate_grade_value('.', 'notes') == True
|
|
assert config_manager.validate_grade_value('d', 'score') == True
|
|
assert config_manager.validate_grade_value('a', 'notes') == True
|
|
|
|
# Notes numériques valides
|
|
assert config_manager.validate_grade_value('15.5', 'notes') == True
|
|
assert config_manager.validate_grade_value('0', 'notes') == True
|
|
assert config_manager.validate_grade_value('20', 'notes') == True
|
|
|
|
# Notes invalides
|
|
assert config_manager.validate_grade_value('-1', 'notes') == False
|
|
assert config_manager.validate_grade_value('abc', 'notes') == False
|
|
|
|
def test_get_display_info_with_real_data(self, app):
|
|
"""Test get_display_info avec les vraies données."""
|
|
with app.app_context():
|
|
# S'assurer que les valeurs existent
|
|
scale_values = config_manager.get_competence_scale_values()
|
|
|
|
# Test avec une valeur de score existante
|
|
if '2' in scale_values:
|
|
info = config_manager.get_display_info('2', 'score')
|
|
assert info['label'] == scale_values['2']['label']
|
|
assert info['color'] == scale_values['2']['color']
|
|
|
|
# Test avec valeur spéciale
|
|
if '.' in scale_values:
|
|
info = config_manager.get_display_info('.', 'notes')
|
|
assert info['label'] == scale_values['.']['label']
|
|
assert info['color'] == scale_values['.']['color']
|
|
|
|
# Test avec note numérique (valeur par défaut)
|
|
info = config_manager.get_display_info('15.5', 'notes')
|
|
assert info['label'] == '15.5'
|
|
assert info['color'] == '#374151' # Couleur par défaut
|
|
|
|
def test_route_compatibility(self, app):
|
|
"""Test la compatibilité avec les routes existantes."""
|
|
with app.app_context():
|
|
# Test du format attendu par la route config.scale
|
|
scale_values = config_manager.get_competence_scale_values()
|
|
|
|
# Vérifier le format de données
|
|
for value, config in scale_values.items():
|
|
assert isinstance(value, str) # Clé doit être string
|
|
assert 'label' in config
|
|
assert 'color' in config
|
|
assert 'included_in_total' in config
|
|
assert isinstance(config['included_in_total'], bool)
|
|
|
|
# Vérifier format couleur
|
|
color = config['color']
|
|
assert color.startswith('#')
|
|
assert len(color) == 7 # Format #RRGGBB
|
|
|
|
# Test des opérations CRUD utilisées par les routes
|
|
original_count = len(scale_values)
|
|
|
|
# Ajouter (utilisé par routes/config.py:add_scale_value)
|
|
success = config_manager.add_scale_value('TEST', 'Test Value', '#123456', True)
|
|
assert success == True
|
|
assert len(config_manager.get_competence_scale_values()) == original_count + 1
|
|
|
|
# Modifier (utilisé par routes/config.py:update_scale)
|
|
success = config_manager.update_scale_value('TEST', 'Modified Test', '#654321', False)
|
|
assert success == True
|
|
updated_values = config_manager.get_competence_scale_values()
|
|
assert updated_values['TEST']['label'] == 'Modified Test'
|
|
assert updated_values['TEST']['color'] == '#654321'
|
|
assert updated_values['TEST']['included_in_total'] == False
|
|
|
|
# Supprimer (utilisé par routes/config.py:delete_scale_value)
|
|
success = config_manager.delete_scale_value('TEST')
|
|
assert success == True
|
|
assert len(config_manager.get_competence_scale_values()) == original_count
|
|
|
|
def test_grading_system_integration(self, app):
|
|
"""Test l'intégration avec le système de notation unifié."""
|
|
with app.app_context():
|
|
# Vérifier que les types de notation sont bien définis
|
|
grading_types = config_manager.get_grading_types()
|
|
assert 'notes' in grading_types
|
|
assert 'score' in grading_types
|
|
|
|
# Vérifier que les valeurs spéciales sont cohérentes
|
|
special_values = config_manager.get_special_values()
|
|
scale_values = config_manager.get_competence_scale_values()
|
|
|
|
# Les valeurs spéciales doivent exister dans l'échelle
|
|
for special_key in special_values.keys():
|
|
assert special_key in scale_values
|
|
|
|
# Vérifier les significations des scores
|
|
score_meanings = config_manager.get_score_meanings()
|
|
for score in range(4): # 0, 1, 2, 3
|
|
assert score in score_meanings
|
|
score_str = str(score)
|
|
if score_str in scale_values:
|
|
# Le label de l'échelle doit correspondre à la signification
|
|
assert scale_values[score_str]['label'] == score_meanings[score]['label'] |