chore: sauvegarde complète avant factorisation executor
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 12s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 13s
tests / Tests unitaires (sans GPU) (push) Failing after 14s
tests / Tests sécurité (critique) (push) Has been skipped
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 12s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 13s
tests / Tests unitaires (sans GPU) (push) Failing after 14s
tests / Tests sécurité (critique) (push) Has been skipped
Point de sauvegarde incluant les fichiers non committés des sessions précédentes (systemd, docs, agents, GPU manager). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -46,7 +46,6 @@ class TestDashboardRoutes:
|
||||
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."""
|
||||
@@ -54,7 +53,6 @@ class TestDashboardRoutes:
|
||||
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."""
|
||||
@@ -126,13 +124,10 @@ class TestDashboardRoutes:
|
||||
data = resp.get_json()
|
||||
assert 'sessions' in data
|
||||
|
||||
def test_tests_list(self, client):
|
||||
"""L'API tests retourne la liste des tests."""
|
||||
def test_tests_list_removed(self, client):
|
||||
"""L'API /api/tests a été retirée (RCE via subprocess)."""
|
||||
resp = client.get('/api/tests')
|
||||
assert resp.status_code == 200
|
||||
data = resp.get_json()
|
||||
assert 'tests' in data
|
||||
assert 'total' in data
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_logs(self, client):
|
||||
"""L'API logs retourne les logs."""
|
||||
@@ -155,10 +150,10 @@ class TestDashboardRoutes:
|
||||
data = resp.get_json()
|
||||
assert 'triggers' in data
|
||||
|
||||
def test_automation_status(self, client):
|
||||
"""L'API automation/status retourne le statut."""
|
||||
def test_automation_status_removed(self, client):
|
||||
"""L'API /api/automation/status a été retirée."""
|
||||
resp = client.get('/api/automation/status')
|
||||
assert resp.status_code == 200
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_metrics_endpoint(self, client):
|
||||
"""L'endpoint Prometheus /metrics fonctionne."""
|
||||
@@ -171,151 +166,47 @@ class TestDashboardRoutes:
|
||||
assert resp.status_code == 404 or resp.status_code == 405
|
||||
|
||||
|
||||
class TestGesturesRoutes:
|
||||
"""Tests des routes du catalogue de gestes."""
|
||||
class TestRemovedRoutes:
|
||||
"""Vérifie que les routes supprimées retournent 404."""
|
||||
|
||||
def test_gestures_page_renders(self, client):
|
||||
"""La page /gestures se rend correctement."""
|
||||
def test_gestures_page_removed(self, client):
|
||||
"""La page /gestures a été retirée."""
|
||||
resp = client.get('/gestures')
|
||||
assert resp.status_code == 200
|
||||
assert b'Gestes Primitifs' in resp.data
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_gestures_page_has_categories(self, client):
|
||||
"""La page /gestures affiche les catégories de gestes."""
|
||||
resp = client.get('/gestures')
|
||||
assert resp.status_code == 200
|
||||
# Vérifier qu'au moins une catégorie est présente
|
||||
assert b'windows' in resp.data or b'chrome' in resp.data
|
||||
|
||||
def test_gestures_page_has_shortcuts(self, client):
|
||||
"""La page /gestures affiche les raccourcis clavier."""
|
||||
resp = client.get('/gestures')
|
||||
assert resp.status_code == 200
|
||||
assert b'Ctrl' in resp.data or b'Alt' in resp.data
|
||||
|
||||
def test_api_gestures(self, client):
|
||||
"""L'API /api/gestures retourne les gestes en JSON."""
|
||||
def test_api_gestures_removed(self, client):
|
||||
"""L'API /api/gestures a été retirée."""
|
||||
resp = client.get('/api/gestures')
|
||||
assert resp.status_code == 200
|
||||
data = resp.get_json()
|
||||
assert 'gestures' in data
|
||||
assert 'total' in data
|
||||
assert 'categories' in data
|
||||
assert data['total'] > 0
|
||||
assert isinstance(data['gestures'], list)
|
||||
assert len(data['gestures']) == data['total']
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_api_gestures_structure(self, client):
|
||||
"""Chaque geste a les champs requis."""
|
||||
resp = client.get('/api/gestures')
|
||||
data = resp.get_json()
|
||||
for gesture in data['gestures']:
|
||||
assert 'name' in gesture
|
||||
assert 'category' in gesture
|
||||
assert 'description' in gesture
|
||||
|
||||
def test_api_gestures_categories(self, client):
|
||||
"""Les catégories sont bien structurées."""
|
||||
resp = client.get('/api/gestures')
|
||||
data = resp.get_json()
|
||||
categories = data['categories']
|
||||
assert len(categories) >= 4 # windows, chrome, edition, system au minimum
|
||||
for cat in categories:
|
||||
assert 'id' in cat
|
||||
assert 'name' in cat
|
||||
assert 'count' in cat
|
||||
assert cat['count'] > 0
|
||||
|
||||
|
||||
class TestStreamingRoutes:
|
||||
"""Tests des routes streaming."""
|
||||
|
||||
def test_streaming_page_renders(self, client):
|
||||
"""La page /streaming se rend correctement."""
|
||||
def test_streaming_page_removed(self, client):
|
||||
"""La page /streaming a été retirée."""
|
||||
resp = client.get('/streaming')
|
||||
assert resp.status_code == 200
|
||||
assert b'Streaming' in resp.data
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_streaming_page_has_stats_section(self, client):
|
||||
"""La page /streaming contient les sections de stats."""
|
||||
resp = client.get('/streaming')
|
||||
assert resp.status_code == 200
|
||||
assert b'Sessions actives' in resp.data
|
||||
assert b'Serveur streaming' in resp.data
|
||||
def test_extractions_page_removed(self, client):
|
||||
"""La page /extractions a été retirée."""
|
||||
resp = client.get('/extractions')
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_api_streaming_status(self, client):
|
||||
"""L'API /api/streaming/status retourne un résultat (même si serveur offline)."""
|
||||
resp = client.get('/api/streaming/status')
|
||||
# Le serveur streaming peut ne pas être lancé (502) ou répondre (200)
|
||||
assert resp.status_code in (200, 502)
|
||||
def test_api_extractions_removed(self, client):
|
||||
"""L'API /api/extractions a été retirée."""
|
||||
resp = client.get('/api/extractions')
|
||||
assert resp.status_code == 404
|
||||
|
||||
def test_chat_page_removed(self, client):
|
||||
"""La page /chat a été retirée."""
|
||||
resp = client.get('/chat')
|
||||
assert resp.status_code == 404
|
||||
|
||||
|
||||
class TestFleetProxy:
|
||||
"""Tests du proxy fleet (requiert serveur streaming, donc 502 attendu)."""
|
||||
|
||||
def test_fleet_list_proxy(self, client):
|
||||
"""Le proxy /api/fleet/fleet retourne 200, 401 ou 502 (serveur offline/auth)."""
|
||||
resp = client.get('/api/fleet/fleet')
|
||||
# 200 = ok, 401 = streaming server rejette le token, 502 = serveur offline
|
||||
assert resp.status_code in (200, 401, 502)
|
||||
data = resp.get_json()
|
||||
assert isinstance(data, dict)
|
||||
|
||||
|
||||
class TestExtractionsRoutes:
|
||||
"""Tests des routes extractions."""
|
||||
|
||||
def test_extractions_page_renders(self, client):
|
||||
"""La page /extractions se rend correctement."""
|
||||
resp = client.get('/extractions')
|
||||
assert resp.status_code == 200
|
||||
assert b'Extractions' in resp.data
|
||||
|
||||
def test_extractions_page_module_unavailable(self, client):
|
||||
"""La page /extractions affiche un message si le module n'est pas disponible."""
|
||||
resp = client.get('/extractions')
|
||||
assert resp.status_code == 200
|
||||
# Le module core.extraction n'existe pas, on doit voir le message
|
||||
assert b'non disponible' in resp.data or b'Module' in resp.data
|
||||
|
||||
def test_api_extractions(self, client):
|
||||
"""L'API /api/extractions retourne un résultat valide."""
|
||||
resp = client.get('/api/extractions')
|
||||
assert resp.status_code == 200
|
||||
data = resp.get_json()
|
||||
assert 'available' in data
|
||||
assert 'extractions' in data
|
||||
assert isinstance(data['extractions'], list)
|
||||
|
||||
def test_api_extractions_module_status(self, client):
|
||||
"""L'API /api/extractions indique si le module est disponible."""
|
||||
resp = client.get('/api/extractions')
|
||||
data = resp.get_json()
|
||||
# Le module n'existe pas dans ce contexte
|
||||
assert data['available'] is False
|
||||
assert 'message' in data
|
||||
|
||||
def test_api_extraction_export_no_module(self, client):
|
||||
"""L'export CSV retourne 501 si le module n'est pas disponible."""
|
||||
resp = client.get('/api/extractions/test-id/export?format=csv')
|
||||
assert resp.status_code == 501
|
||||
data = resp.get_json()
|
||||
assert 'error' in data
|
||||
|
||||
|
||||
class TestNavigationLinks:
|
||||
"""Tests de la navigation entre pages."""
|
||||
|
||||
def test_index_has_gestures_link(self, client):
|
||||
"""La page d'accueil contient un lien vers /gestures."""
|
||||
resp = client.get('/')
|
||||
assert resp.status_code == 200
|
||||
assert b'/gestures' in resp.data
|
||||
|
||||
def test_index_has_streaming_link(self, client):
|
||||
"""La page d'accueil contient un lien vers /streaming."""
|
||||
resp = client.get('/')
|
||||
assert resp.status_code == 200
|
||||
assert b'/streaming' in resp.data
|
||||
|
||||
def test_index_has_extractions_link(self, client):
|
||||
"""La page d'accueil contient un lien vers /extractions."""
|
||||
resp = client.get('/')
|
||||
assert resp.status_code == 200
|
||||
assert b'/extractions' in resp.data
|
||||
|
||||
def test_gestures_has_back_link(self, client):
|
||||
"""La page gestures contient un lien retour vers le dashboard."""
|
||||
resp = client.get('/gestures')
|
||||
assert resp.status_code == 200
|
||||
assert b'href="/"' in resp.data or b"href='/'" in resp.data
|
||||
|
||||
Reference in New Issue
Block a user