""" conftest.py — Fixtures pytest partagées. La suite de tests s'exécute contre une VRAIE base MariaDB de test (gesthub_test), jamais contre des mocks de couche SQL : cela permet de détecter de vraies erreurs de requête (typos de colonnes, contraintes violées...) que des mocks ne détecteraient pas. Chaque test nettoie les tables qu'il utilise pour rester indépendant des autres (pas d'ordre imposé). """ import os import sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import pytest from config import TestConfig from db import init_db @pytest.fixture(scope="session") def db(): database = init_db(TestConfig) # Sanity check : la base de test doit être joignable avant de lancer la suite. database.fetch_one("SELECT 1 AS ok") return database @pytest.fixture(autouse=True) def clean_tables(db): """Vide les tables avant CHAQUE test pour garantir l'isolation.""" with db.cursor(commit=True) as cur: for table in ("audit_log", "fichiers", "evenements", "annonces", "blocks"): cur.execute(f"DELETE FROM {table}") yield @pytest.fixture(scope="session") def app(): # Portée "session" : Flask interdit de redécorer un blueprint déjà # enregistré (voir routes/auth.py), donc create_app() n'est appelé # qu'une seule fois pour toute la suite. L'isolation entre tests est # assurée par clean_tables (autouse) et par un nouveau test_client() # (voir fixture client ci-dessous) à chaque test. from app import create_app flask_app = create_app(TestConfig) flask_app.config["DB"] = init_db(TestConfig) flask_app.config["TESTING"] = True return flask_app @pytest.fixture def client(app): return app.test_client() @pytest.fixture def admin_session(app): """Simule une session utilisateur authentifiée avec le groupe /admin. Utilise SON PROPRE test_client() (indépendant de la fixture `client` et de `user_session`) : deux clients Flask ont chacun leur propre cookie jar, donc leurs sessions ne s'écrasent pas quand un test dépend des deux en même temps (cf. test_it07). """ test_client = app.test_client() with test_client.session_transaction() as sess: sess["user"] = { "sub": "admin-sub-0001", "preferred_username": "admin", "groups": ["/admin"], } return test_client @pytest.fixture def user_session(app): """Simule une session utilisateur authentifiée SANS le groupe /admin.""" test_client = app.test_client() with test_client.session_transaction() as sess: sess["user"] = { "sub": "user-sub-0002", "preferred_username": "membre", "groups": [], } return test_client