fix(dashboard): corriger les routes mortes, parsing API et liens cassés

Audit et corrections du Web Dashboard (port 5001) :

- Désactiver le bouton "Restaurer" (rollback) car la route /api/version/rollback
  n'est pas implémentée côté serveur
- Corriger le parsing de /api/version : les données sont dans version.version (dict),
  pas directement dans version (string)
- Corriger le parsing de /api/version/system-info : données imbriquées dans
  system_info.system, pas directement à la racine
- Corriger le parsing de /api/backup/stats : utiliser stats.*.file_count au lieu
  de categories.*.count qui n'existe pas
- Corriger le fallback correction packs pour utiliser le bon format de stats
- Corriger le parsing de faiss.total_vectors dans l'onglet Apprentissage
- Remplacer les données simulées dans loadActionTypeStats() par un placeholder honnête
- Corriger le HTML invalide (double attribut style sur configTestResults)
- Rendre switchTab() plus robuste avec event.target.closest('.tab')
- Réduire le polling services de 5s à 15s pour limiter la charge
- Mettre à jour SERVICES_CONFIG (ports corrects, .venv/ au lieu de venv_v3/)
- Ajouter le proxy streaming et 4 services manquants dans la config
- Ajouter 19 tests unitaires pour les routes du dashboard

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-14 22:05:11 +01:00
parent 8f31ba95d3
commit 463f1dd95e
3 changed files with 643 additions and 207 deletions

View File

@@ -0,0 +1,171 @@
"""
Tests pour le dashboard web RPA Vision V3.
Vérifie que les routes principales répondent correctement
et que le template se rend sans erreur.
"""
import sys
from pathlib import Path
import pytest
# Ajouter le répertoire racine au path
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
from web_dashboard.app import app
@pytest.fixture
def client():
"""Client de test Flask."""
app.config['TESTING'] = True
with app.test_client() as c:
yield c
class TestDashboardRoutes:
"""Tests des routes du dashboard."""
def test_index_renders(self, client):
"""La page d'accueil se rend correctement."""
resp = client.get('/')
assert resp.status_code == 200
assert b'RPA Vision V3' in resp.data
def test_healthz(self, client):
"""Le healthcheck retourne OK."""
resp = client.get('/healthz')
assert resp.status_code == 200
data = resp.get_json()
assert data['status'] == 'ok'
def test_system_status(self, client):
"""L'API system/status retourne les compteurs."""
resp = client.get('/api/system/status')
assert resp.status_code == 200
data = resp.get_json()
assert 'sessions_count' in data
assert 'workflows_count' in data
assert 'tests' in data
def test_system_performance(self, client):
"""L'API system/performance retourne les metriques."""
resp = client.get('/api/system/performance')
assert resp.status_code == 200
data = resp.get_json()
assert 'faiss' in data
assert 'metrics' in data
def test_version(self, client):
"""L'API version retourne la version actuelle."""
resp = client.get('/api/version')
assert resp.status_code == 200
data = resp.get_json()
assert 'version' in data
# version est un dict avec la clé 'version' (string)
assert 'version' in data['version']
def test_version_system_info(self, client):
"""L'API version/system-info retourne les infos systeme."""
resp = client.get('/api/version/system-info')
assert resp.status_code == 200
data = resp.get_json()
assert 'system_info' in data
si = data['system_info']
assert 'system' in si
assert 'python_version' in si['system']
def test_version_backups(self, client):
"""L'API version/backups retourne la liste."""
resp = client.get('/api/version/backups')
assert resp.status_code == 200
data = resp.get_json()
assert 'backups' in data
assert isinstance(data['backups'], list)
def test_services_list(self, client):
"""L'API services retourne la liste des services."""
resp = client.get('/api/services')
assert resp.status_code == 200
data = resp.get_json()
assert 'services' in data
services = data['services']
assert len(services) >= 5 # Au moins 5 services configurés
# Vérifier que le dashboard est dans la liste
ids = [s['service_id'] for s in services]
assert 'web_dashboard' in ids
def test_config_get(self, client):
"""L'API config retourne la configuration."""
resp = client.get('/api/config')
assert resp.status_code == 200
data = resp.get_json()
assert data['success'] is True
assert 'config' in data
def test_backup_stats(self, client):
"""L'API backup/stats retourne les statistiques."""
resp = client.get('/api/backup/stats')
assert resp.status_code == 200
data = resp.get_json()
assert 'stats' in data
stats = data['stats']
assert 'workflows' in stats
def test_workflows_list(self, client):
"""L'API workflows retourne la liste."""
resp = client.get('/api/workflows')
assert resp.status_code == 200
data = resp.get_json()
assert 'workflows' in data
def test_sessions_list(self, client):
"""L'API sessions retourne la liste."""
resp = client.get('/api/agent/sessions')
assert resp.status_code == 200
data = resp.get_json()
assert 'sessions' in data
def test_tests_list(self, client):
"""L'API tests retourne la liste des tests."""
resp = client.get('/api/tests')
assert resp.status_code == 200
data = resp.get_json()
assert 'tests' in data
assert 'total' in data
def test_logs(self, client):
"""L'API logs retourne les logs."""
resp = client.get('/api/logs')
assert resp.status_code == 200
data = resp.get_json()
assert 'logs' in data
def test_chains(self, client):
"""L'API chains retourne la liste."""
resp = client.get('/api/chains')
assert resp.status_code == 200
data = resp.get_json()
assert 'chains' in data
def test_triggers(self, client):
"""L'API triggers retourne la liste."""
resp = client.get('/api/triggers')
assert resp.status_code == 200
data = resp.get_json()
assert 'triggers' in data
def test_automation_status(self, client):
"""L'API automation/status retourne le statut."""
resp = client.get('/api/automation/status')
assert resp.status_code == 200
def test_metrics_endpoint(self, client):
"""L'endpoint Prometheus /metrics fonctionne."""
resp = client.get('/metrics')
assert resp.status_code == 200
def test_no_rollback_route(self, client):
"""La route /api/version/rollback n'existe pas (non implementee)."""
resp = client.post('/api/version/rollback/test-id')
assert resp.status_code == 404 or resp.status_code == 405