#!/usr/bin/env python3 """ Test Palette Cross-Machine dans Navigateur - 10 janvier 2026 Auteur : Dom, Alice, Kiro Ce script teste le fonctionnement réel de la palette d'outils VWB dans le navigateur avec détection automatique d'URL cross-machine. """ import subprocess import time import requests import json import sys from pathlib import Path import threading import signal import os class VWBTestServer: """Serveur de test pour le backend VWB""" def __init__(self): self.process = None self.port = 5004 self.is_running = False def start(self): """Démarrer le serveur backend""" print(f"🚀 Démarrage du serveur backend sur le port {self.port}...") try: # Démarrer le serveur backend backend_path = Path("visual_workflow_builder/backend") if not backend_path.exists(): print("❌ Répertoire backend non trouvé") return False # Utiliser le script de démarrage existant script_path = Path("scripts/start_vwb_backend_catalogue_complet_10jan2026.py") if script_path.exists(): self.process = subprocess.Popen([ sys.executable, str(script_path) ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: # Fallback vers démarrage direct self.process = subprocess.Popen([ sys.executable, "-m", "flask", "run", "--host", "0.0.0.0", "--port", str(self.port) ], cwd=backend_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={**os.environ, "FLASK_APP": "app_catalogue_simple.py"}) # Attendre que le serveur démarre for i in range(30): # 30 secondes max try: response = requests.get(f"http://localhost:{self.port}/health", timeout=1) if response.status_code == 200: print(f"✅ Serveur backend démarré sur le port {self.port}") self.is_running = True return True except: time.sleep(1) print("❌ Timeout lors du démarrage du serveur") return False except Exception as e: print(f"❌ Erreur lors du démarrage du serveur: {e}") return False def stop(self): """Arrêter le serveur backend""" if self.process: print("🛑 Arrêt du serveur backend...") self.process.terminate() try: self.process.wait(timeout=5) except subprocess.TimeoutExpired: self.process.kill() self.is_running = False def test_backend_health(): """Tester la santé du backend""" print("🔍 Test de santé du backend...") try: response = requests.get("http://localhost:5004/health", timeout=5) if response.status_code == 200: data = response.json() print(f"✅ Backend en ligne: {data.get('status', 'unknown')}") return True else: print(f"❌ Backend répond avec le code: {response.status_code}") return False except Exception as e: print(f"❌ Erreur de connexion au backend: {e}") return False def test_catalog_api(): """Tester l'API du catalogue""" print("🔍 Test de l'API catalogue...") try: response = requests.get("http://localhost:5004/api/vwb/catalog/actions", timeout=5) if response.status_code == 200: data = response.json() actions = data.get('actions', []) print(f"✅ API catalogue fonctionnelle: {len(actions)} actions disponibles") # Afficher quelques actions pour vérification for action in actions[:3]: print(f" - {action.get('name', 'Sans nom')} ({action.get('id', 'sans-id')})") return True else: print(f"❌ API catalogue répond avec le code: {response.status_code}") return False except Exception as e: print(f"❌ Erreur lors du test de l'API catalogue: {e}") return False def test_frontend_build(): """Tester la compilation du frontend""" print("🔍 Test de compilation du frontend...") frontend_path = Path("visual_workflow_builder/frontend") if not frontend_path.exists(): print("❌ Répertoire frontend non trouvé") return False try: # Vérifier que les fichiers TypeScript compilent result = subprocess.run([ "npx", "tsc", "--noEmit" ], cwd=frontend_path, capture_output=True, text=True, timeout=60) if result.returncode == 0: print("✅ Frontend compile sans erreurs TypeScript") return True else: print("❌ Erreurs de compilation frontend:") print(result.stderr) return False except Exception as e: print(f"❌ Erreur lors de la compilation frontend: {e}") return False def test_catalog_service_detection(): """Tester la détection automatique d'URL du service catalogue""" print("🔍 Test de détection automatique d'URL...") # Simuler différents scénarios de détection test_urls = [ "http://localhost:5004", "http://127.0.0.1:5004", ] working_urls = [] for url in test_urls: try: response = requests.get(f"{url}/health", timeout=2) if response.status_code == 200: working_urls.append(url) print(f"✅ URL fonctionnelle détectée: {url}") except: print(f"❌ URL non accessible: {url}") if working_urls: print(f"✅ Détection automatique réussie: {len(working_urls)} URL(s) fonctionnelle(s)") return True else: print("❌ Aucune URL fonctionnelle détectée") return False def test_static_fallback(): """Tester le fallback vers le catalogue statique""" print("🔍 Test du fallback catalogue statique...") # Lire le fichier du catalogue statique static_catalog_path = Path("visual_workflow_builder/frontend/src/data/staticCatalog.ts") if not static_catalog_path.exists(): print("❌ Catalogue statique non trouvé") return False content = static_catalog_path.read_text() # Vérifier que les actions de base sont présentes required_actions = [ "click_anchor", "type_text", "wait_for_anchor", "extract_text", "hotkey" ] missing_actions = [] for action in required_actions: if action not in content: missing_actions.append(action) if missing_actions: print(f"❌ Actions manquantes dans le catalogue statique: {missing_actions}") return False else: print(f"✅ Catalogue statique complet: {len(required_actions)} actions de base") return True def create_test_html(): """Créer une page HTML de test pour le navigateur""" print("🔍 Création de la page de test navigateur...") html_content = """
Cette page teste la détection automatique d'URL et le fallback statique de la palette d'outils.