# ============================================ # Projet : API-KA # Fichier : tests/conftest.py # Node : m3u96b # Author : Simon-Pierre Boucher # Contact : contact@spboucher.ai # Date : 2026-08-16 # ============================================ """Fixtures pytest : environnement de test (SQLite temporaire) et base initialisée. L'environnement est configuré au chargement du module, AVANT tout import de ``src.*`` par les modules de test, afin que ``get_settings()`` lise les bonnes valeurs dès le premier appel. """ from __future__ import annotations import dataclasses import os import tempfile from pathlib import Path _TMP_DIR = tempfile.mkdtemp(prefix="apika-tests-") os.environ["APP_ENV"] = "test" os.environ["DATABASE_URL"] = f"sqlite:///{_TMP_DIR}/apika_test.db" for _svc in ("LOUKA", "IMMOKA", "FOODKA", "AUTOKA", "FABRIKA", "JOBKA"): os.environ[f"{_svc}_SOURCE_URL"] = f"https://example.test/{_svc.lower()}" import pytest # noqa: E402 from src.config import get_settings # noqa: E402 get_settings.cache_clear() from src.database import db as db_module # noqa: E402 db_module.reset_engine() db_module.init_db() @pytest.fixture() def db_session(): """Session SQLAlchemy transactionnelle sur la base de test.""" with db_module.session_scope() as session: yield session @pytest.fixture(autouse=True) def no_backup(monkeypatch: pytest.MonkeyPatch): """Neutralise les backups disque pendant les tests de collecteurs.""" monkeypatch.setattr( "src.collectors.base_collector.backup_service", lambda *args, **kwargs: None ) @pytest.fixture(scope="session", autouse=True) def isolated_logs_dir(): """Redirige les logs (alerts.log, apika.log) vers le tmp de test. ``logs_dir`` est codé en dur sur ``BASE_DIR/logs`` dans ``get_settings()`` : sans cette fixture, les collectes échouées simulées par les tests (ex. ``test_run_failure_after_retries``) écriraient de fausses alertes dans le vrai ``logs/alerts.log`` de production du node. """ test_logs = Path(_TMP_DIR) / "logs" test_logs.mkdir(parents=True, exist_ok=True) test_settings = dataclasses.replace(get_settings(), logs_dir=test_logs) mp = pytest.MonkeyPatch() # alert() et get_logger() résolvent get_settings via src.utils.logger. mp.setattr("src.utils.logger.get_settings", lambda: test_settings) yield test_logs mp.undo()