- 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>
82 lines
2.5 KiB
Python
82 lines
2.5 KiB
Python
"""
|
|
Utilitaires de Test - Helpers pour les tests VWB
|
|
|
|
Auteur : Dom, Alice, Kiro - 10 janvier 2026
|
|
|
|
Fonctions utilitaires pour faciliter les tests du Visual Workflow Builder
|
|
et des extensions du catalogue d'actions VisionOnly.
|
|
"""
|
|
|
|
import os
|
|
import tempfile
|
|
import shutil
|
|
import requests
|
|
import time
|
|
from typing import Dict, Any, Optional
|
|
|
|
|
|
def create_test_environment(test_name: str) -> str:
|
|
"""Crée un environnement de test temporaire."""
|
|
temp_dir = tempfile.mkdtemp(prefix=f"vwb_test_{test_name}_")
|
|
return temp_dir
|
|
|
|
|
|
def cleanup_test_environment(test_env: str):
|
|
"""Nettoie l'environnement de test."""
|
|
if os.path.exists(test_env):
|
|
shutil.rmtree(test_env, ignore_errors=True)
|
|
|
|
|
|
def assert_file_exists(file_path: str, message: str = ""):
|
|
"""Vérifie qu'un fichier existe."""
|
|
assert os.path.exists(file_path), f"{message}: {file_path}"
|
|
|
|
|
|
def assert_component_structure(content: str, required_elements: list):
|
|
"""Vérifie la structure d'un composant."""
|
|
for element in required_elements:
|
|
assert element in content, f"Élément manquant : {element}"
|
|
|
|
|
|
def measure_performance(func):
|
|
"""Décorateur pour mesurer les performances."""
|
|
def wrapper(*args, **kwargs):
|
|
start_time = time.time()
|
|
result = func(*args, **kwargs)
|
|
end_time = time.time()
|
|
print(f"⏱️ Performance: {func.__name__} - {(end_time - start_time)*1000:.2f}ms")
|
|
return result
|
|
return wrapper
|
|
|
|
|
|
def wait_for_service(url: str, timeout: int = 30) -> bool:
|
|
"""Attend qu'un service soit disponible."""
|
|
start_time = time.time()
|
|
while time.time() - start_time < timeout:
|
|
try:
|
|
response = requests.get(url, timeout=5)
|
|
if response.status_code == 200:
|
|
return True
|
|
except:
|
|
pass
|
|
time.sleep(1)
|
|
return False
|
|
|
|
|
|
def make_api_request(method: str, url: str, **kwargs):
|
|
"""Fait une requête API avec gestion d'erreurs."""
|
|
try:
|
|
if method.upper() == "GET":
|
|
return requests.get(url, timeout=10, **kwargs)
|
|
elif method.upper() == "POST":
|
|
return requests.post(url, timeout=10, **kwargs)
|
|
else:
|
|
raise ValueError(f"Méthode HTTP non supportée : {method}")
|
|
except requests.exceptions.RequestException as e:
|
|
raise Exception(f"Erreur de requête API : {e}")
|
|
|
|
|
|
def assert_api_response(response, expected_status: int, message: str = ""):
|
|
"""Vérifie une réponse API."""
|
|
assert response.status_code == expected_status, \
|
|
f"{message}: Status {response.status_code}, attendu {expected_status}" |