Erstumsetzung: OAMC Turnierauswertung (AP 0–7, 9)
* Datenmodell + Alembic-Initialmigration (Plan §4), Seed Saison 2026 * Wertungs-Engine (Plan §3.3), regelbasiert je Kategorie/Saison - Abnahmetest gegen die Ergebnisliste 2026-05-31 * Meisterschaftsberechnung mit Streichresultaten + Tie-Break (PLATZHALTER-Punktetabelle, O-1 offen) * Ingest-API (idempotent, dry_run) inkl. Excel-Leser und Fahrer-Matching/Merge * Zeitmessungs-Endpoint (Batch, idempotent, unzugeordnet/unplausibel) + SSE-Anzeige - Mess-Pi-Client bewusst NICHT enthalten (docs/zeitmessung-endpoint.md) * Frontend: öffentliche Seiten + internes Backend (Jinja2/HTMX, kein Build) * Auslieferung: Docker (multi-arch) + docker-compose sowie Debian-Paket/APT-Repo * 57 Tests grün gegen echte PostgreSQL-Testdatenbank Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
"""Constraint-Tests (Plan AP 1): Mehrfachstart erlaubt, Startnummer eindeutig je
|
||||
Turnier, hoechstens ein aktives Turnier."""
|
||||
|
||||
import pytest
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
from tests import factories as f
|
||||
|
||||
|
||||
def test_startnummer_eindeutig_je_turnier(seed_2026):
|
||||
db = seed_2026
|
||||
t = f.turnier(db)
|
||||
k = f.klasse(db, "S 6")
|
||||
a, b = f.fahrer(db, "A", "A"), f.fahrer(db, "B", "B")
|
||||
f.start(db, t, a, k, startnummer=10)
|
||||
f.start(db, t, b, k, startnummer=10, flush=False)
|
||||
with pytest.raises(IntegrityError):
|
||||
db.flush()
|
||||
|
||||
|
||||
def test_mehrfachstart_desselben_fahrers_erlaubt(seed_2026):
|
||||
db = seed_2026
|
||||
t = f.turnier(db)
|
||||
fahrer = f.fahrer(db, "Schmunk", "Christian", 1990)
|
||||
f.start(db, t, fahrer, f.klasse(db, "S 9"), startnummer=1)
|
||||
f.start(db, t, fahrer, f.klasse(db, "S 3"), startnummer=2)
|
||||
db.flush() # kein Fehler
|
||||
assert len(fahrer.starts) == 2
|
||||
|
||||
|
||||
def test_hoechstens_ein_aktives_turnier(seed_2026):
|
||||
db = seed_2026
|
||||
v = f.veranstaltung(db)
|
||||
f.turnier(db, v, name="A", aktiv=True)
|
||||
f.turnier(db, v, name="B", aktiv=True, flush=False)
|
||||
with pytest.raises(IntegrityError):
|
||||
db.flush()
|
||||
|
||||
|
||||
def test_doppelturnier_zwei_turniere_pro_veranstaltung(seed_2026):
|
||||
db = seed_2026
|
||||
v = f.veranstaltung(db, titel="Doppelturnier MSC Hainstadt / OAMC Reinheim")
|
||||
v.ist_doppelturnier = True
|
||||
f.turnier(db, v, name="Reinheim")
|
||||
f.turnier(db, v, name="Hainstadt")
|
||||
db.flush()
|
||||
assert {t.name for t in v.turniere} == {"Reinheim", "Hainstadt"}
|
||||
Reference in New Issue
Block a user