- 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>
235 lines
7.8 KiB
Python
235 lines
7.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test simple de la documentation avec un navigateur headless
|
|
"""
|
|
|
|
import time
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
|
|
def test_with_curl():
|
|
"""Test simple avec curl pour vérifier l'application"""
|
|
|
|
print("🌐 Test de l'application avec curl...")
|
|
|
|
try:
|
|
# Test de l'accès à l'application
|
|
result = subprocess.run([
|
|
'curl', '-s', '-o', '/dev/null', '-w', '%{http_code}',
|
|
'http://localhost:3000'
|
|
], capture_output=True, text=True, timeout=10)
|
|
|
|
if result.returncode == 0 and result.stdout.strip() == '200':
|
|
print("✅ Application accessible sur http://localhost:3000")
|
|
return True
|
|
else:
|
|
print(f"❌ Application non accessible: code {result.stdout.strip()}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ Erreur lors du test curl: {e}")
|
|
return False
|
|
|
|
def test_with_browser():
|
|
"""Test avec un navigateur simple"""
|
|
|
|
print("🌐 Test avec navigateur...")
|
|
|
|
# Vérifier si chromium ou chrome est disponible
|
|
browsers = ['chromium-browser', 'google-chrome', 'chromium', 'chrome']
|
|
browser_cmd = None
|
|
|
|
for browser in browsers:
|
|
try:
|
|
result = subprocess.run(['which', browser], capture_output=True, text=True)
|
|
if result.returncode == 0:
|
|
browser_cmd = browser
|
|
break
|
|
except:
|
|
continue
|
|
|
|
if not browser_cmd:
|
|
print("⚠️ Aucun navigateur Chrome/Chromium trouvé")
|
|
return False
|
|
|
|
print(f"🔍 Utilisation de {browser_cmd}")
|
|
|
|
try:
|
|
# Lancer le navigateur en mode headless pour capturer les erreurs console
|
|
cmd = [
|
|
browser_cmd,
|
|
'--headless',
|
|
'--disable-gpu',
|
|
'--no-sandbox',
|
|
'--disable-dev-shm-usage',
|
|
'--enable-logging',
|
|
'--log-level=0',
|
|
'--dump-dom',
|
|
'http://localhost:3000'
|
|
]
|
|
|
|
print("🚀 Lancement du navigateur...")
|
|
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
|
|
|
|
if result.returncode == 0:
|
|
# Analyser le DOM récupéré
|
|
dom_content = result.stdout
|
|
|
|
# Vérifier la présence d'éléments clés
|
|
checks = {
|
|
'Application chargée': 'Visual Workflow Builder' in dom_content,
|
|
'React chargé': 'react' in dom_content.lower() or 'div id="root"' in dom_content,
|
|
'Palette présente': 'palette' in dom_content.lower(),
|
|
'Canvas présent': 'canvas' in dom_content.lower() or 'workflow' in dom_content.lower(),
|
|
}
|
|
|
|
print("\n📋 Analyse du contenu:")
|
|
for check_name, check_result in checks.items():
|
|
status = "✅" if check_result else "❌"
|
|
print(f" {status} {check_name}")
|
|
|
|
# Vérifier s'il y a des erreurs JavaScript dans stderr
|
|
if result.stderr:
|
|
print(f"\n⚠️ Erreurs/Avertissements du navigateur:")
|
|
print(result.stderr[:500] + "..." if len(result.stderr) > 500 else result.stderr)
|
|
|
|
return all(checks.values())
|
|
else:
|
|
print(f"❌ Erreur du navigateur: {result.stderr}")
|
|
return False
|
|
|
|
except subprocess.TimeoutExpired:
|
|
print("⏰ Timeout lors du chargement de la page")
|
|
return False
|
|
except Exception as e:
|
|
print(f"❌ Erreur lors du test navigateur: {e}")
|
|
return False
|
|
|
|
def check_documentation_files():
|
|
"""Vérifier que les fichiers de documentation existent"""
|
|
|
|
print("📁 Vérification des fichiers de documentation...")
|
|
|
|
files_to_check = [
|
|
'frontend/src/data/toolDocumentation.ts',
|
|
'frontend/src/services/DocumentationService.ts',
|
|
'frontend/src/components/DocumentationTab/index.tsx',
|
|
'frontend/src/components/DocumentationPopup/index.tsx',
|
|
'frontend/src/types/documentation.ts'
|
|
]
|
|
|
|
all_exist = True
|
|
for file_path in files_to_check:
|
|
if os.path.exists(file_path):
|
|
# Vérifier la taille du fichier
|
|
size = os.path.getsize(file_path)
|
|
print(f"✅ {file_path} ({size} bytes)")
|
|
else:
|
|
print(f"❌ {file_path} manquant")
|
|
all_exist = False
|
|
|
|
return all_exist
|
|
|
|
def check_build_status():
|
|
"""Vérifier le statut de build du frontend"""
|
|
|
|
print("🔨 Vérification du build frontend...")
|
|
|
|
# Vérifier si le dossier dist existe
|
|
if os.path.exists('frontend/dist'):
|
|
print("✅ Dossier dist trouvé")
|
|
|
|
# Lister les fichiers principaux
|
|
dist_files = os.listdir('frontend/dist')
|
|
js_files = [f for f in dist_files if f.endswith('.js')]
|
|
css_files = [f for f in dist_files if f.endswith('.css')]
|
|
|
|
print(f" 📄 Fichiers JS: {len(js_files)}")
|
|
print(f" 🎨 Fichiers CSS: {len(css_files)}")
|
|
|
|
# Vérifier la taille du bundle principal
|
|
main_js = None
|
|
for js_file in js_files:
|
|
if 'main' in js_file or 'bundle' in js_file:
|
|
main_js = js_file
|
|
break
|
|
|
|
if main_js:
|
|
size = os.path.getsize(f'frontend/dist/{main_js}')
|
|
print(f" 📦 Bundle principal: {main_js} ({size} bytes)")
|
|
|
|
if size > 100000: # Plus de 100KB
|
|
print(" ✅ Bundle semble correct")
|
|
return True
|
|
else:
|
|
print(" ⚠️ Bundle très petit, peut-être incomplet")
|
|
return False
|
|
else:
|
|
print(" ❌ Aucun bundle principal trouvé")
|
|
return False
|
|
else:
|
|
print("❌ Dossier dist non trouvé")
|
|
return False
|
|
|
|
def main():
|
|
"""Fonction principale"""
|
|
|
|
print("=" * 70)
|
|
print("TEST DE DIAGNOSTIC - DOCUMENTATION VISUAL WORKFLOW BUILDER")
|
|
print("=" * 70)
|
|
|
|
# Changer vers le bon répertoire
|
|
if not os.path.exists('frontend'):
|
|
print("❌ Répertoire frontend non trouvé. Exécutez depuis visual_workflow_builder/")
|
|
return 1
|
|
|
|
# Tests
|
|
tests = [
|
|
("Fichiers de documentation", check_documentation_files),
|
|
("Build frontend", check_build_status),
|
|
("Accès application", test_with_curl),
|
|
("Test navigateur", test_with_browser),
|
|
]
|
|
|
|
results = []
|
|
|
|
for test_name, test_func in tests:
|
|
print(f"\n🧪 {test_name}...")
|
|
try:
|
|
result = test_func()
|
|
results.append((test_name, result))
|
|
status = "✅ RÉUSSI" if result else "❌ ÉCHOUÉ"
|
|
print(f" {status}")
|
|
except Exception as e:
|
|
print(f" ❌ ERREUR: {e}")
|
|
results.append((test_name, False))
|
|
|
|
# Résumé
|
|
print("\n" + "=" * 70)
|
|
print("RÉSUMÉ DES TESTS:")
|
|
print("=" * 70)
|
|
|
|
passed = sum(1 for _, result in results if result)
|
|
total = len(results)
|
|
|
|
for test_name, result in results:
|
|
status = "✅" if result else "❌"
|
|
print(f"{status} {test_name}")
|
|
|
|
print(f"\n📊 Résultat global: {passed}/{total} tests réussis")
|
|
|
|
if passed == total:
|
|
print("\n🎉 Tous les tests sont passés!")
|
|
print("La documentation devrait fonctionner. Si elle ne s'affiche pas:")
|
|
print("1. Ouvrez les outils de développement (F12)")
|
|
print("2. Vérifiez la console pour des erreurs JavaScript")
|
|
print("3. Vérifiez l'onglet Network pour des ressources non chargées")
|
|
else:
|
|
print(f"\n⚠️ {total - passed} test(s) ont échoué")
|
|
print("Vérifiez les erreurs ci-dessus pour diagnostiquer le problème")
|
|
|
|
return 0 if passed == total else 1
|
|
|
|
if __name__ == "__main__":
|
|
exit(main()) |