Files
notytex/tests/test_special_values.py
2025-08-05 21:23:49 +02:00

165 lines
6.8 KiB
Python

#!/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'<option value="([^"]*)"[^>]*>([^<]*)</option>'
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" ✅ <option value=\"{value}\">{text}</option>")
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'<option value="([^"]*)"'
html_options = re.findall(option_pattern, content)
html_has_special = all(v in html_options for v in special_values)
checks.append(("HTML contient options spéciales", html_has_special))
# Affichage des résultats
all_passed = True
for check_name, passed in checks:
status = "" if passed else ""
print(f" {status} {check_name}")
if not passed:
all_passed = False
if all_passed:
print("\n 🎉 SUCCÈS : Les valeurs spéciales sont maintenant fonctionnelles !")
print(" 📋 L'utilisateur peut:")
print(" - Sélectionner '.' et 'd' dans les listes déroulantes (type score)")
print(" - Taper '.' et 'd' dans les champs numériques (type notes)")
print(" - Utiliser les raccourcis clavier pour saisir rapidement")
else:
print("\n ⚠️ Certains problèmes subsistent")
print("\n=== Fin du test ===")
if __name__ == '__main__':
test_final_special_values()