Files
gesthub/web/tests/conftest.py
2026-08-21 09:12:02 +02:00

89 lines
2.7 KiB
Python

"""
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