Files
notytex/tests/test_config_integration.py

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']