- 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>
308 lines
10 KiB
Python
308 lines
10 KiB
Python
#!/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) |