Étape 2 : modèle de données complet et migration initiale
- Tables SQLModel : Edition, DayPart, Volunteer, Skill, Position, Shift, Availability, Assignment, Account, MagicLinkToken + tables d'association - Multi-édition (edition_id partout), énumérations en VARCHAR + CHECK, suppressions ON DELETE CASCADE (droit à l'effacement) - Dates/heures naïves en heure locale Europe/Paris (tzdata + TZ conteneur) - Migration Alembic 0001 écrite à la main, vérifiée par `alembic check` (aucun écart avec les modèles) et par un aller-retour downgrade/upgrade - Tests : graphe complet, unicité email par édition, N-N compétences, aller-retour d'énumération, cascade de suppression d'un bénévole Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
09d7d70076
commit
cb2e84adf0
@@ -12,6 +12,7 @@ from app.main import app
|
||||
def engine():
|
||||
"""Vraie base PostgreSQL de test (voir docker/postgres-init)."""
|
||||
eng = create_engine(get_settings().test_database_url, pool_pre_ping=True)
|
||||
SQLModel.metadata.drop_all(eng)
|
||||
SQLModel.metadata.create_all(eng)
|
||||
yield eng
|
||||
SQLModel.metadata.drop_all(eng)
|
||||
@@ -19,13 +20,17 @@ def engine():
|
||||
|
||||
@pytest.fixture
|
||||
def session(engine):
|
||||
"""Session isolée : tout est annulé à la fin du test."""
|
||||
"""Session isolée : chaque test s'exécute dans une transaction annulée
|
||||
à la fin, y compris ses `commit()` (savepoints)."""
|
||||
connection = engine.connect()
|
||||
transaction = connection.begin()
|
||||
with Session(bind=connection) as s:
|
||||
s = Session(bind=connection, join_transaction_mode="create_savepoint")
|
||||
try:
|
||||
yield s
|
||||
transaction.rollback()
|
||||
connection.close()
|
||||
finally:
|
||||
s.close()
|
||||
transaction.rollback()
|
||||
connection.close()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
Reference in New Issue
Block a user