""" Configuration pytest pour RPA Vision V3 Auteur: Dom, Alice Kiro - 15 décembre 2024 Objectif: Fiche #4 - Assurer que pytest trouve 'core' depuis n'importe où Ce fichier garantit que: - pytest fonctionne depuis la racine du projet - pytest fonctionne depuis un IDE (PyCharm/VSCode) - Les imports 'from core...' marchent partout - Plus de problèmes PYTHONPATH - Le GPU est vérifié avant les tests qui en ont besoin """ import sys import types from pathlib import Path import pytest # S'assurer que la racine du projet est dans sys.path pour que `import core...` fonctionne partout ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) # Vérification que core est accessible try: import core print(f"✅ Core module accessible depuis: {core.__file__}") except ImportError as e: print(f"❌ Erreur import core: {e}") print(f" ROOT path: {ROOT}") print(f" sys.path: {sys.path[:3]}...") # Certains tests HTTP d'agent_chat n'ont pas besoin du transport SocketIO reel. # Le service de production garde Flask-SocketIO comme dependance, mais l'env de # test local peut etre minimal. On fournit alors un shim strictement pytest. try: import flask_socketio # noqa: F401 except ModuleNotFoundError: flask_socketio = types.ModuleType("flask_socketio") class _FakeSocketIO: def __init__(self, app=None, *args, **kwargs): self.app = app self.args = args self.kwargs = kwargs self.handlers = {} self.emitted = [] def on(self, event): def decorator(func): self.handlers[event] = func return func return decorator def emit(self, event, payload=None, **kwargs): self.emitted.append((event, payload, kwargs)) def run(self, *args, **kwargs): return None def _fake_emit(*_args, **_kwargs): return None flask_socketio.SocketIO = _FakeSocketIO flask_socketio.emit = _fake_emit sys.modules["flask_socketio"] = flask_socketio # ============================================================================= # GPU Preflight — vérification avant les tests GPU # ============================================================================= def pytest_configure(config): """Enregistre le marqueur 'gpu' pour les tests nécessitant le GPU.""" config.addinivalue_line( "markers", "gpu: test nécessitant le GPU (skip auto si VRAM insuffisante)", ) @pytest.fixture(autouse=True) def _gpu_preflight_check(request): """Skip automatiquement les tests marqués 'gpu' si la machine n'est pas prête.""" marker = request.node.get_closest_marker("gpu") if marker is None: return from core.gpu.preflight import check_machine_ready # Seuils personnalisables via le marqueur : @pytest.mark.gpu(min_vram=2000) min_vram = marker.kwargs.get("min_vram", 1000) max_util = marker.kwargs.get("max_util", 80) result = check_machine_ready( min_free_vram_mb=min_vram, max_gpu_util_percent=max_util, ) if not result.ready: pytest.skip(f"GPU pas prêt : {result.reason}")