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:
171
tests/unit/test_dashboard_routes.py
Normal file
171
tests/unit/test_dashboard_routes.py
Normal 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
|
||||
Reference in New Issue
Block a user