#!/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())