v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- Frontend v4 accessible sur réseau local (192.168.1.40) - Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard) - Ollama GPU fonctionnel - Self-healing interactif - Dashboard confiance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
227
scripts/test_final_palette_complete_10jan2026.py
Normal file
227
scripts/test_final_palette_complete_10jan2026.py
Normal file
@@ -0,0 +1,227 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test Final - Validation Complète de la Palette VWB
|
||||
Auteur : Dom, Alice, Kiro - 10 janvier 2026
|
||||
|
||||
Ce script effectue une validation finale complète pour confirmer que tous
|
||||
les problèmes de la palette et du catalogue ont été résolus.
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
def test_palette_complete():
|
||||
"""Test final de validation complète"""
|
||||
|
||||
print("🎯 TEST FINAL - VALIDATION COMPLÈTE DE LA PALETTE VWB")
|
||||
print("=" * 60)
|
||||
print("Auteur : Dom, Alice, Kiro - 10 janvier 2026")
|
||||
print(f"Timestamp : {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print()
|
||||
|
||||
backend_url = "http://localhost:5004"
|
||||
success_count = 0
|
||||
total_tests = 6
|
||||
|
||||
# Test 1 : Backend opérationnel
|
||||
print("🔄 Test 1/6 : Backend VWB opérationnel...")
|
||||
try:
|
||||
response = requests.get(f"{backend_url}/api/health", timeout=5)
|
||||
if response.status_code == 200:
|
||||
print("✅ Backend VWB opérationnel")
|
||||
success_count += 1
|
||||
else:
|
||||
print(f"❌ Backend erreur HTTP {response.status_code}")
|
||||
except Exception as e:
|
||||
print(f"❌ Backend inaccessible : {e}")
|
||||
|
||||
# Test 2 : Service catalogue avec toutes les actions
|
||||
print("🔄 Test 2/6 : Service catalogue complet...")
|
||||
try:
|
||||
response = requests.get(f"{backend_url}/api/vwb/catalog/actions", timeout=10)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
action_count = len(data.get("actions", []))
|
||||
if action_count >= 9:
|
||||
print(f"✅ Service catalogue complet : {action_count} actions")
|
||||
success_count += 1
|
||||
else:
|
||||
print(f"❌ Actions insuffisantes : {action_count} (attendu: ≥9)")
|
||||
else:
|
||||
print(f"❌ Service catalogue erreur HTTP {response.status_code}")
|
||||
except Exception as e:
|
||||
print(f"❌ Service catalogue inaccessible : {e}")
|
||||
|
||||
# Test 3 : Toutes les catégories disponibles
|
||||
print("🔄 Test 3/6 : Toutes les catégories disponibles...")
|
||||
try:
|
||||
response = requests.get(f"{backend_url}/api/vwb/catalog/categories", timeout=5)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
categories = data.get("categories", [])
|
||||
category_ids = [cat["id"] for cat in categories]
|
||||
|
||||
expected_categories = ["vision_ui", "control", "data", "navigation", "validation"]
|
||||
missing = set(expected_categories) - set(category_ids)
|
||||
|
||||
if len(missing) == 0:
|
||||
print(f"✅ Toutes les catégories présentes : {category_ids}")
|
||||
success_count += 1
|
||||
else:
|
||||
print(f"❌ Catégories manquantes : {missing}")
|
||||
else:
|
||||
print(f"❌ Catégories erreur HTTP {response.status_code}")
|
||||
except Exception as e:
|
||||
print(f"❌ Catégories inaccessibles : {e}")
|
||||
|
||||
# Test 4 : Catalogue statique complet
|
||||
print("🔄 Test 4/6 : Catalogue statique complet...")
|
||||
try:
|
||||
static_catalog_path = Path("visual_workflow_builder/frontend/src/data/staticCatalog.ts")
|
||||
if static_catalog_path.exists():
|
||||
content = static_catalog_path.read_text(encoding='utf-8')
|
||||
|
||||
# Vérifier les 5 catégories
|
||||
expected_categories = ["vision_ui", "control", "data", "navigation", "validation"]
|
||||
found_categories = []
|
||||
|
||||
for category in expected_categories:
|
||||
if f"'{category}'" in content or f'"{category}"' in content:
|
||||
found_categories.append(category)
|
||||
|
||||
# Compter les actions
|
||||
action_count = content.count("id: '") + content.count('id: "')
|
||||
|
||||
if len(found_categories) == 5 and action_count >= 12:
|
||||
print(f"✅ Catalogue statique complet : {len(found_categories)} catégories, {action_count} actions")
|
||||
success_count += 1
|
||||
else:
|
||||
print(f"❌ Catalogue statique incomplet : {len(found_categories)} catégories, {action_count} actions")
|
||||
else:
|
||||
print("❌ Fichier catalogue statique manquant")
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur lecture catalogue statique : {e}")
|
||||
|
||||
# Test 5 : Types TypeScript valides
|
||||
print("🔄 Test 5/6 : Types TypeScript valides...")
|
||||
try:
|
||||
import subprocess
|
||||
result = subprocess.run(
|
||||
["npx", "tsc", "--noEmit"],
|
||||
cwd="visual_workflow_builder/frontend",
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=30
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("✅ Types TypeScript valides")
|
||||
success_count += 1
|
||||
else:
|
||||
print(f"❌ Erreurs TypeScript détectées")
|
||||
if result.stderr:
|
||||
print(f" Erreurs : {result.stderr[:200]}...")
|
||||
except subprocess.TimeoutExpired:
|
||||
print("❌ Timeout lors de la vérification TypeScript")
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur vérification TypeScript : {e}")
|
||||
|
||||
# Test 6 : Intégration palette prête
|
||||
print("🔄 Test 6/6 : Intégration palette prête...")
|
||||
try:
|
||||
required_files = [
|
||||
"visual_workflow_builder/frontend/src/components/Palette/index.tsx",
|
||||
"visual_workflow_builder/frontend/src/hooks/useCatalogActions.ts",
|
||||
"visual_workflow_builder/frontend/src/services/catalogService.ts",
|
||||
"visual_workflow_builder/frontend/src/types/catalog.ts",
|
||||
"visual_workflow_builder/frontend/src/data/staticCatalog.ts"
|
||||
]
|
||||
|
||||
all_files_exist = True
|
||||
for file_path in required_files:
|
||||
if not Path(file_path).exists():
|
||||
print(f"❌ Fichier manquant : {file_path}")
|
||||
all_files_exist = False
|
||||
|
||||
if all_files_exist:
|
||||
# Vérifier le contenu du composant Palette
|
||||
palette_content = Path("visual_workflow_builder/frontend/src/components/Palette/index.tsx").read_text(encoding='utf-8')
|
||||
|
||||
integration_checks = [
|
||||
"useCatalogActions",
|
||||
"catalogCategories",
|
||||
"VWBCatalogAction",
|
||||
"catalog_"
|
||||
]
|
||||
|
||||
all_integrations = True
|
||||
for check in integration_checks:
|
||||
if check not in palette_content:
|
||||
print(f"❌ Intégration manquante : {check}")
|
||||
all_integrations = False
|
||||
|
||||
if all_integrations:
|
||||
print("✅ Intégration palette complète")
|
||||
success_count += 1
|
||||
else:
|
||||
print("❌ Intégrations manquantes dans la palette")
|
||||
else:
|
||||
print("❌ Fichiers requis manquants")
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur vérification intégration : {e}")
|
||||
|
||||
# Résumé final
|
||||
print()
|
||||
print("=" * 60)
|
||||
print("📊 RÉSUMÉ FINAL")
|
||||
print("=" * 60)
|
||||
|
||||
success_rate = (success_count / total_tests) * 100
|
||||
|
||||
print(f"Tests réussis : {success_count}/{total_tests} ({success_rate:.1f}%)")
|
||||
print()
|
||||
|
||||
if success_count == total_tests:
|
||||
print("🎉 SUCCÈS COMPLET ! TOUS LES PROBLÈMES SONT RÉSOLUS !")
|
||||
print()
|
||||
print("✅ Palette affiche toutes les catégories (5 au lieu de 1)")
|
||||
print("✅ Toutes les actions sont présentes (12+ au lieu de 5)")
|
||||
print("✅ Conflits de types résolus")
|
||||
print("✅ API complète et fonctionnelle")
|
||||
print("✅ Compatibilité cross-machine assurée")
|
||||
print("✅ Intégration palette prête")
|
||||
print()
|
||||
print("🚀 La palette VWB est maintenant complètement opérationnelle !")
|
||||
print()
|
||||
print("Prochaines étapes :")
|
||||
print("1. Démarrer le frontend : cd visual_workflow_builder/frontend && npm start")
|
||||
print("2. Tester la palette dans l'interface utilisateur")
|
||||
print("3. Valider le drag & drop des actions")
|
||||
|
||||
return True
|
||||
else:
|
||||
print(f"⚠️ {total_tests - success_count} problème(s) persistent")
|
||||
print()
|
||||
print("Problèmes à résoudre :")
|
||||
if success_count < total_tests:
|
||||
print("- Voir les détails des tests échoués ci-dessus")
|
||||
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""Fonction principale"""
|
||||
try:
|
||||
success = test_palette_complete()
|
||||
return 0 if success else 1
|
||||
except KeyboardInterrupt:
|
||||
print("\n🛑 Test interrompu par l'utilisateur")
|
||||
return 130
|
||||
except Exception as e:
|
||||
print(f"\n❌ Erreur critique : {e}")
|
||||
return 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user