v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- 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>
This commit is contained in:
82
tests/utils/test_helpers.py
Normal file
82
tests/utils/test_helpers.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""
|
||||
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}"
|
||||
Reference in New Issue
Block a user