#!/usr/bin/env python3 """ Test Réel de l'Interface des Propriétés VWB Auteur : Dom, Alice, Kiro - 12 janvier 2026 Ce script teste l'interface réelle pour identifier pourquoi les propriétés ne s'affichent pas correctement. """ import requests import json import time import sys from pathlib import Path def test_backend_vwb(): """Test du backend VWB""" print("🔍 Test du Backend VWB") print("=" * 50) # Tester la connexion au backend backend_url = "http://localhost:5004" try: # Test de santé du catalogue print("🏥 Test de santé du catalogue...") response = requests.get(f"{backend_url}/api/vwb/catalog/health", timeout=5) if response.status_code == 200: health_data = response.json() print("✅ Backend VWB accessible") print(f" Status: {health_data.get('status', 'unknown')}") print(f" Services: {health_data.get('services', {})}") else: print(f"❌ Backend VWB inaccessible (status: {response.status_code})") return False except requests.exceptions.RequestException as e: print(f"❌ Erreur de connexion au backend: {e}") print("💡 Vérifiez que le backend VWB est démarré sur le port 5002") return False try: # Test de récupération des actions print("\n📋 Test de récupération des actions...") response = requests.get(f"{backend_url}/api/vwb/catalog/actions", timeout=5) if response.status_code == 200: actions_data = response.json() actions = actions_data.get('actions', []) print(f"✅ {len(actions)} actions disponibles") # Afficher quelques actions for i, action in enumerate(actions[:5]): print(f" {i+1}. {action.get('id')} - {action.get('name')}") if len(actions) > 5: print(f" ... et {len(actions) - 5} autres") else: print(f"❌ Erreur récupération actions (status: {response.status_code})") return False except requests.exceptions.RequestException as e: print(f"❌ Erreur récupération actions: {e}") return False try: # Test d'une action spécifique print("\n🎯 Test d'action spécifique (navigate_to_url)...") response = requests.get(f"{backend_url}/api/vwb/catalog/actions/navigate_to_url", timeout=5) if response.status_code == 200: action_data = response.json() action = action_data.get('action', {}) print(f"✅ Action navigate_to_url trouvée") print(f" Nom: {action.get('name')}") print(f" Catégorie: {action.get('category')}") print(f" Paramètres: {len(action.get('parameters', {}))}") else: print(f"❌ Action navigate_to_url non trouvée (status: {response.status_code})") except requests.exceptions.RequestException as e: print(f"❌ Erreur test action spécifique: {e}") return True def test_frontend_connection(): """Test de la connexion frontend""" print("\n🌐 Test de la Connexion Frontend") print("=" * 50) frontend_url = "http://localhost:3000" try: print("🔗 Test de connexion au frontend...") response = requests.get(frontend_url, timeout=5) if response.status_code == 200: print("✅ Frontend accessible") print("💡 Ouvrez http://localhost:3000 dans votre navigateur") print("💡 Créez une étape 'navigate_to_url' et vérifiez les propriétés") else: print(f"❌ Frontend inaccessible (status: {response.status_code})") return False except requests.exceptions.RequestException as e: print(f"❌ Erreur de connexion au frontend: {e}") print("💡 Vérifiez que le frontend est démarré avec 'npm start'") return False return True def test_static_catalog(): """Test du catalogue statique""" print("\n📚 Test du Catalogue Statique") print("=" * 50) # Vérifier le fichier de catalogue statique static_catalog_path = Path("visual_workflow_builder/frontend/src/data/staticCatalog.ts") if not static_catalog_path.exists(): print(f"❌ Fichier catalogue statique non trouvé: {static_catalog_path}") return False print("✅ Fichier catalogue statique trouvé") # Lire le contenu pour vérifier les actions try: content = static_catalog_path.read_text(encoding='utf-8') # Vérifier la présence d'actions clés key_actions = ['navigate_to_url', 'click_anchor', 'type_text'] found_actions = [] for action in key_actions: if f"'{action}'" in content or f'"{action}"' in content: found_actions.append(action) print(f"📋 Actions trouvées dans le catalogue statique:") for action in found_actions: print(f" ✅ {action}") missing_actions = set(key_actions) - set(found_actions) if missing_actions: print(f"❌ Actions manquantes:") for action in missing_actions: print(f" ❌ {action}") return len(missing_actions) == 0 except Exception as e: print(f"❌ Erreur lecture catalogue statique: {e}") return False def create_test_workflow(): """Crée un workflow de test pour vérifier les propriétés""" print("\n🧪 Création d'un Workflow de Test") print("=" * 50) # Workflow de test avec différents types d'étapes test_workflow = { "id": "test_proprietes_workflow", "name": "Test Propriétés VWB", "description": "Workflow pour tester l'affichage des propriétés", "steps": [ { "id": "step_navigate", "type": "navigate_to_url", "name": "Naviguer vers URL", "position": {"x": 100, "y": 100}, "data": { "isVWBCatalogAction": True, "vwbActionId": "navigate_to_url", "parameters": { "url": "https://example.com" } } }, { "id": "step_click", "type": "click_anchor", "name": "Cliquer sur élément", "position": {"x": 100, "y": 200}, "data": { "isVWBCatalogAction": True, "vwbActionId": "click_anchor", "parameters": { "visual_anchor": None } } }, { "id": "step_type", "type": "type_text", "name": "Saisir texte", "position": {"x": 100, "y": 300}, "data": { "isVWBCatalogAction": True, "vwbActionId": "type_text", "parameters": { "visual_anchor": None, "text": "Hello World" } } }, { "id": "step_standard", "type": "click", "name": "Clic standard", "position": {"x": 100, "y": 400}, "data": { "parameters": { "target": None, "clickType": "left" } } } ], "connections": [] } # Sauvegarder le workflow de test test_file = Path("test_workflow_proprietes.json") try: with open(test_file, 'w', encoding='utf-8') as f: json.dump(test_workflow, f, indent=2, ensure_ascii=False) print(f"✅ Workflow de test créé: {test_file}") print("💡 Importez ce workflow dans l'interface pour tester") # Afficher les instructions print("\n📋 Instructions de test:") print("1. Ouvrez l'interface VWB (http://localhost:3000)") print("2. Importez le workflow test_workflow_proprietes.json") print("3. Sélectionnez chaque étape et vérifiez les propriétés:") print(" - step_navigate: Devrait afficher VWBActionProperties") print(" - step_click: Devrait afficher VWBActionProperties") print(" - step_type: Devrait afficher VWBActionProperties") print(" - step_standard: Devrait afficher StandardParametersEditor") return True except Exception as e: print(f"❌ Erreur création workflow de test: {e}") return False def main(): """Fonction principale""" print("🔧 Test Complet de Configuration des Outils VWB") print("=" * 60) print("Auteur : Dom, Alice, Kiro - 12 janvier 2026") print("=" * 60) # Tests séquentiels tests = [ ("Backend VWB", test_backend_vwb), ("Catalogue Statique", test_static_catalog), ("Connexion Frontend", test_frontend_connection), ("Workflow de Test", create_test_workflow) ] results = {} for test_name, test_func in tests: print(f"\n🧪 Exécution: {test_name}") try: results[test_name] = test_func() except Exception as e: print(f"❌ Erreur inattendue dans {test_name}: {e}") results[test_name] = False # Résumé des résultats print("\n" + "=" * 60) print("📊 RÉSUMÉ DES TESTS") print("=" * 60) passed = 0 total = len(tests) for test_name, result in results.items(): status = "✅ PASSÉ" if result else "❌ ÉCHEC" print(f"{status} - {test_name}") if result: passed += 1 print(f"\n🎯 Résultat global: {passed}/{total} tests passés") if passed == total: print("🎉 Tous les tests sont passés !") print("💡 Si les propriétés ne s'affichent toujours pas, vérifiez:") print(" 1. Les logs de la console du navigateur") print(" 2. L'onglet Network pour les requêtes API") print(" 3. Les erreurs TypeScript dans la compilation") else: print("⚠️ Certains tests ont échoué. Corrigez les problèmes identifiés.") return passed == total if __name__ == "__main__": success = main() sys.exit(0 if success else 1)