165 lines
6.8 KiB
Python
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() |