API réception alertes chute (SmartEye/YOLO), analyse IA (Gemini 2.5 Flash), gestion alertes avec escalade (watchdog), notifications Firebase, dashboard web, documentation MkDocs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
124 lines
3.8 KiB
Python
Executable File
124 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Script de test pour valider la robustesse du parsing JSON
|
|
"""
|
|
import sys
|
|
sys.path.insert(0, '/var/www/lucas')
|
|
|
|
from analyze import nettoyer_json_response, extraire_json_intelligent, valider_reponse_ia
|
|
import json
|
|
|
|
# Tests de différents formats de réponses malformées
|
|
test_cases = [
|
|
# Cas 1: JSON propre
|
|
{
|
|
"input": '{"urgence": true, "confiance": 85, "message": "Personne au sol"}',
|
|
"expected_success": True,
|
|
"description": "JSON propre"
|
|
},
|
|
# Cas 2: JSON avec markdown
|
|
{
|
|
"input": '```json\n{"urgence": false, "confiance": 90, "message": "Pièce vide"}\n```',
|
|
"expected_success": True,
|
|
"description": "JSON dans markdown"
|
|
},
|
|
# Cas 3: JSON avec texte avant
|
|
{
|
|
"input": 'Voici mon analyse:\n{"urgence": true, "confiance": 75, "message": "Chute détectée"}',
|
|
"expected_success": True,
|
|
"description": "JSON avec texte avant"
|
|
},
|
|
# Cas 4: JSON avec texte après
|
|
{
|
|
"input": '{"urgence": false, "confiance": 95, "message": "Tout va bien"}\nVoilà mon analyse.',
|
|
"expected_success": True,
|
|
"description": "JSON avec texte après"
|
|
},
|
|
# Cas 5: JSON avec espaces
|
|
{
|
|
"input": ' \n\n {"urgence": true, "confiance": 80, "message": "Urgence"} \n\n ',
|
|
"expected_success": True,
|
|
"description": "JSON avec espaces"
|
|
},
|
|
# Cas 6: JSON multiligne
|
|
{
|
|
"input": '''{
|
|
"urgence": true,
|
|
"confiance": 88,
|
|
"message": "Personne allongée"
|
|
}''',
|
|
"expected_success": True,
|
|
"description": "JSON multiligne"
|
|
},
|
|
# Cas 7: Réponse complètement invalide
|
|
{
|
|
"input": 'Ceci n\'est pas du JSON du tout, juste du texte',
|
|
"expected_success": False,
|
|
"description": "Texte non-JSON"
|
|
},
|
|
# Cas 8: JSON incomplet
|
|
{
|
|
"input": '{"urgence": true, "confiance": ',
|
|
"expected_success": False,
|
|
"description": "JSON incomplet"
|
|
},
|
|
]
|
|
|
|
print("="*70)
|
|
print("TEST DE ROBUSTESSE DU PARSING JSON")
|
|
print("="*70)
|
|
|
|
passed = 0
|
|
failed = 0
|
|
|
|
for i, test in enumerate(test_cases, 1):
|
|
print(f"\n[TEST {i}] {test['description']}")
|
|
print(f"Input: {repr(test['input'][:60])}...")
|
|
|
|
try:
|
|
# Tenter l'extraction
|
|
result = extraire_json_intelligent(test['input'])
|
|
|
|
if result:
|
|
# Valider le résultat
|
|
is_valid = valider_reponse_ia(result)
|
|
|
|
if is_valid and test['expected_success']:
|
|
print(f"✓ SUCCÈS - JSON extrait: {result}")
|
|
passed += 1
|
|
elif not is_valid and test['expected_success']:
|
|
print(f"✗ ÉCHEC - JSON invalide: {result}")
|
|
failed += 1
|
|
elif is_valid and not test['expected_success']:
|
|
print(f"✗ ÉCHEC INATTENDU - JSON trouvé alors qu'on attendait un échec")
|
|
failed += 1
|
|
else:
|
|
print(f"✓ SUCCÈS - Échec attendu correctement géré")
|
|
passed += 1
|
|
else:
|
|
if test['expected_success']:
|
|
print(f"✗ ÉCHEC - Aucun JSON extrait")
|
|
failed += 1
|
|
else:
|
|
print(f"✓ SUCCÈS - Échec correctement détecté")
|
|
passed += 1
|
|
|
|
except Exception as e:
|
|
if test['expected_success']:
|
|
print(f"✗ ÉCHEC - Exception: {type(e).__name__}: {e}")
|
|
failed += 1
|
|
else:
|
|
print(f"✓ SUCCÈS - Exception attendue: {type(e).__name__}")
|
|
passed += 1
|
|
|
|
print("\n" + "="*70)
|
|
print(f"RÉSULTATS: {passed} réussis, {failed} échoués sur {len(test_cases)} tests")
|
|
print("="*70)
|
|
|
|
if failed == 0:
|
|
print("\n✓ TOUS LES TESTS SONT PASSÉS ! Le système est robuste.")
|
|
sys.exit(0)
|
|
else:
|
|
print(f"\n✗ {failed} test(s) ont échoué. Révision nécessaire.")
|
|
sys.exit(1)
|