import argparse import datetime as dt import pytest from sqlmodel import select from app.bootstrap import run from app.models import Account, DayPart, Edition, Role def _args(**overrides) -> argparse.Namespace: base = { "name": "Festival 2027", "start": "2027-07-01", "end": "2027-07-04", "email": "coord@monfestival.fr", "password": "un-mot-de-passe-solide", "year": None, "no_day_parts": False, "retention_days": None, } base.update(overrides) return argparse.Namespace(**base) def test_creates_edition_coordinator_and_default_day_parts(session): edition = run(_args(), session) reloaded = session.get(Edition, edition.id) assert reloaded.name == "Festival 2027" assert reloaded.year == 2027 assert reloaded.start_date == dt.date(2027, 7, 1) account = session.exec( select(Account).where(Account.edition_id == edition.id) ).one() assert account.role is Role.COORDINATOR assert account.auth_method == "password" codes = [ d.code for d in session.exec( select(DayPart).where(DayPart.edition_id == edition.id) ) ] assert set(codes) == {"MATIN", "APRES_MIDI", "SOIREE"} def test_no_day_parts_flag(session): edition = run(_args(no_day_parts=True), session) assert ( session.exec( select(DayPart).where(DayPart.edition_id == edition.id) ).all() == [] ) def test_rejects_short_password(session): with pytest.raises(SystemExit): run(_args(password="court"), session) def test_rejects_end_before_start(session): with pytest.raises(SystemExit): run(_args(start="2027-07-04", end="2027-07-01"), session)