#!/usr/bin/env python3 """ Test final pour valider que les valeurs spéciales fonctionnent correctement dans l'interface de notation. """ from app import create_app from app_config import config_manager from models import db, Grade import re def test_final_special_values(): """Test final des valeurs spéciales.""" app = create_app('development') with app.app_context(): print("=== TEST FINAL : Valeurs spéciales fonctionnelles ===\n") # 1. Vérifier la configuration print("1. Configuration des valeurs spéciales:") scale_values = config_manager.get_competence_scale_values() special_values = ['.', 'd'] for value in special_values: if value in scale_values: config = scale_values[value] print(f" ✅ '{value}': {config['label']} (couleur: {config['color']})") else: print(f" ❌ '{value}': NON CONFIGURÉE") print() # 2. Vérifier la génération JavaScript print("2. Configuration JavaScript:") with app.test_client() as client: response = client.get('/assessments/1/grading') content = response.get_data(as_text=True) start = content.find('special_values: {') if start != -1: end = content.find('}', start) + 1 js_config = content[start:end] print(f" {js_config}") # Vérifier que les valeurs sont présentes for value in special_values: if f"'{value}'" in js_config: print(f" ✅ '{value}' présent dans la config JS") else: print(f" ❌ '{value}' absent de la config JS") else: print(" ❌ Configuration JavaScript non trouvée") print() # 3. Vérifier les options SELECT print("3. Options des champs SELECT (type 'score'):") with app.test_client() as client: response = client.get('/assessments/1/grading') content = response.get_data(as_text=True) # Extraire toutes les options option_pattern = r'' options = re.findall(option_pattern, content) special_options = [(v, t) for v, t in options if v in special_values] print(f" Options spéciales trouvées: {len(special_options)}") for value, text in special_options: print(f" ✅ ") print() # 4. Test de soumission complète print("4. Test de soumission avec valeurs spéciales:") # Nettoyer les données existantes pour ce test Grade.query.filter_by(student_id=1).delete() db.session.commit() with app.test_client() as client: # Test avec différentes valeurs spéciales test_data = { 'grade_1_1': '.', # Champ notes avec "pas de réponse" 'grade_1_2': 'd', # Champ score avec "dispensé" 'grade_1_3': '2', # Valeur normale pour contrôle } response = client.post('/assessments/1/grading/save', data=test_data, follow_redirects=False) print(f" Soumission: statut {response.status_code}") if response.status_code == 302: # Redirection = succès print(" ✅ Soumission acceptée") # Vérifier que les valeurs ont été sauvées grades = Grade.query.filter_by(student_id=1).all() print(f" Grades sauvés: {len(grades)}") for grade in grades: display_info = config_manager.get_display_info(grade.value, 'score') print(f" Élément {grade.grading_element_id}: '{grade.value}' → {display_info['label']}") else: print(" ❌ Erreur lors de la soumission") print() # 5. Test de l'affichage après sauvegarde print("5. Test d'affichage après sauvegarde:") with app.test_client() as client: response = client.get('/assessments/1/grading') if response.status_code == 200: content = response.get_data(as_text=True) # Vérifier que les valeurs spéciales sont présélectionnées for value in special_values: if f'selected>{value}' in content or f'value="{value}"' in content: print(f" ✅ Valeur '{value}' correctement affichée/sélectionnée") else: print(f" 📋 Valeur '{value}' peut ne pas être visible (normal si pas dans ce champ)") print() # 6. Résumé final print("6. RÉSUMÉ FINAL:") # Vérification complète checks = [] # Config de base all_special_configured = all(v in scale_values for v in special_values) checks.append(("Valeurs spéciales configurées", all_special_configured)) # JavaScript with app.test_client() as client: response = client.get('/assessments/1/grading') content = response.get_data(as_text=True) js_has_special = all(f"'{v}'" in content for v in special_values) checks.append(("JavaScript contient valeurs spéciales", js_has_special)) # Options HTML option_pattern = r'