feat: Input-Validatoren für Telefon, Spielname, Spieleranzahl
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 14m57s

This commit is contained in:
Alicia (BSN)
2026-06-21 23:20:43 +00:00
parent e43909b0cd
commit bf16015d5c
3 changed files with 151 additions and 0 deletions
View File
+90
View File
@@ -0,0 +1,90 @@
"""Validierungs-Helfer für Benutzereingaben."""
import re
MIN_TELEFON_ZIFFERN: int = 10
MIN_SPIELNAME_LAENGE: int = 2
MAX_SPIELNAME_LAENGE: int = 200
MIN_SPIELERANZAHL: int = 1
MAX_SPIELERANZAHL: int = 20
def validiere_telefonnummer(telefon: str) -> str:
"""Validiert und normalisiert eine Telefonnummer.
Args:
telefon: Telefonnummer im beliebigen Format, z.B. '+491****7890',
'+49 123 4567890', '00491234567890'.
'*' wird als Maskierungs-Platzhalter behandelt (>=1 Ziffer).
Returns:
Bereinigte Telefonnummer, die mit '+' beginnt, '*' als Platzhalter.
Raises:
ValueError: Wenn weniger als 10 Ziffern oder kein '+' nach Bereinigung.
"""
# Ziffern zählen (* als Platzhalter für >=1 Ziffer)
ziffern_count = len(re.findall(r"\d|\*", telefon))
# Alles außer +, * und Ziffern entfernen
bereinigt = re.sub(r"[^\d*+]", "", telefon)
# "00" am Anfang zu "+" konvertieren
if bereinigt.startswith("00"):
bereinigt = "+" + bereinigt[2:]
# Muss mit + beginnen (nach Bereinigung)
if not bereinigt.startswith("+"):
raise ValueError(f"Telefonnummer muss mit + beginnen: {telefon}")
# Mindestens 10 Ziffern (* zählt als eine)
if ziffern_count < MIN_TELEFON_ZIFFERN:
raise ValueError(f"Telefonnummer muss mindestens 10 Ziffern haben: {telefon}")
return bereinigt
def validiere_spiel_name(name: str) -> str:
"""Validiert einen Spielnamen.
Args:
name: Spielname mit 2-200 Zeichen.
Returns:
Bereinigter Spielname ohne HTML-Tags, mit gestrippten Rändern.
Raises:
ValueError: Wenn weniger als 2 oder mehr als 200 Zeichen.
"""
# HTML-Tags entfernen
without_tags = re.sub(r"<[^>]*>", "", name)
stripped = without_tags.strip()
if len(stripped) < MIN_SPIELNAME_LAENGE:
raise ValueError(f"Spielname muss mindestens 2 Zeichen haben: {name}")
if len(stripped) > MAX_SPIELNAME_LAENGE:
raise ValueError(f"Spielname darf maximal 200 Zeichen haben: {name}")
return stripped
def validiere_spieleranzahl(anzahl: int) -> int:
"""Validiert eine Spieleranzahl.
Args:
anzahl: Anzahl der Spieler (1-20).
Returns:
Die unveränderte Spieleranzahl.
Raises:
ValueError: Wenn < 1, > 20 oder kein Integer.
"""
if not isinstance(anzahl, int) or isinstance(anzahl, bool):
raise ValueError(f"Spieleranzahl muss eine Ganzzahl sein: {anzahl}")
if anzahl < MIN_SPIELERANZAHL:
raise ValueError(f"Spieleranzahl muss mindestens 1 sein: {anzahl}")
if anzahl > MAX_SPIELERANZAHL:
raise ValueError(f"Spieleranzahl darf maximal 20 sein: {anzahl}")
return anzahl