transfer from private server/git server
This commit is contained in:
88
web/tests/conftest.py
Normal file
88
web/tests/conftest.py
Normal file
@@ -0,0 +1,88 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user