89 lines
2.7 KiB
Python
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
|