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