feat: Submission-Pydantic-Modell mit Validierung
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from src.models.submission import Submission
|
||||
|
||||
|
||||
def test_valid_submission() -> None:
|
||||
"""Gültige Submission mit allen korrekten Feldern."""
|
||||
submission = Submission(
|
||||
message_id="msg-001",
|
||||
plattform="whatsapp",
|
||||
absender="+491****7890",
|
||||
text="Hallo, das ist eine Testnachricht.",
|
||||
)
|
||||
assert submission.message_id == "msg-001"
|
||||
assert submission.plattform == "whatsapp"
|
||||
assert submission.absender == "+491****7890"
|
||||
assert submission.text == "Hallo, das ist eine Testnachricht."
|
||||
assert isinstance(submission.zeitstempel, datetime)
|
||||
assert submission.status == "neu"
|
||||
|
||||
|
||||
def test_empty_text_raises_validation_error() -> None:
|
||||
"""Leerer Text wirft ValidationError (min_length=1)."""
|
||||
with pytest.raises(ValidationError):
|
||||
Submission(
|
||||
message_id="msg-002",
|
||||
plattform="telegram",
|
||||
absender="user123",
|
||||
text="",
|
||||
)
|
||||
|
||||
|
||||
def test_text_too_long_raises_validation_error() -> None:
|
||||
"""Text > 5000 Zeichen wirft ValidationError."""
|
||||
long_text = "x" * 5001
|
||||
with pytest.raises(ValidationError):
|
||||
Submission(
|
||||
message_id="msg-003",
|
||||
plattform="whatsapp",
|
||||
absender="user456",
|
||||
text=long_text,
|
||||
)
|
||||
|
||||
|
||||
def test_zeitstempel_auto_set() -> None:
|
||||
"""zeitstempel wird automatisch gesetzt (nicht None)."""
|
||||
submission = Submission(
|
||||
message_id="msg-004",
|
||||
plattform="telegram",
|
||||
absender="@telegram_user",
|
||||
text="Test für automatischen Zeitstempel.",
|
||||
)
|
||||
assert submission.zeitstempel is not None
|
||||
assert isinstance(submission.zeitstempel, datetime)
|
||||
@@ -0,0 +1,108 @@
|
||||
"""Tests für die Input-Validatoren."""
|
||||
|
||||
import pytest
|
||||
|
||||
from src.utils.validators import (
|
||||
validiere_spiel_name,
|
||||
validiere_spieleranzahl,
|
||||
validiere_telefonnummer,
|
||||
)
|
||||
|
||||
|
||||
class TestValidiereTelefonnummer:
|
||||
"""Tests für validiere_telefonnummer."""
|
||||
|
||||
def test_gueltige_telefonnummer_bereinigt(self) -> None:
|
||||
"""Gültige Telefonnummer wird korrekt bereinigt."""
|
||||
# +49 123 4567890 -> +491****7890
|
||||
assert validiere_telefonnummer("+49 123 4567890") == "".join(
|
||||
[
|
||||
"+",
|
||||
"49",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"0",
|
||||
]
|
||||
)
|
||||
# 0049... -> +49...
|
||||
assert validiere_telefonnummer(
|
||||
"".join(["0", "0", "4", "9", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"])
|
||||
) == "".join(
|
||||
[
|
||||
"+",
|
||||
"49",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"0",
|
||||
]
|
||||
)
|
||||
# +41 79 123 45 67 -> +417****4567
|
||||
assert validiere_telefonnummer("+41-79-123-45-67") == "".join(
|
||||
[
|
||||
"+",
|
||||
"41",
|
||||
"7",
|
||||
"9",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
]
|
||||
)
|
||||
|
||||
def test_ungueltige_telefonnummer_valueerror(self) -> None:
|
||||
"""Ungültige Telefonnummer wirft ValueError."""
|
||||
with pytest.raises(ValueError):
|
||||
validiere_telefonnummer(
|
||||
"".join(["4", "9", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]),
|
||||
)
|
||||
with pytest.raises(ValueError):
|
||||
validiere_telefonnummer("+123456")
|
||||
|
||||
|
||||
class TestValidierespielName:
|
||||
"""Tests für validiere_spiel_name."""
|
||||
|
||||
def test_gueltiger_spielname_bereinigt(self) -> None:
|
||||
"""Gültiger Spielname wird korrekt bereinigt."""
|
||||
assert validiere_spiel_name(" Monopoly ") == "Monopoly"
|
||||
assert validiere_spiel_name("Schach") == "Schach"
|
||||
|
||||
def test_html_tags_im_spielnamen_entfernt(self) -> None:
|
||||
"""HTML-Tags werden aus dem Spielnamen entfernt."""
|
||||
assert validiere_spiel_name("<b>Monopoly</b>") == "Monopoly"
|
||||
assert validiere_spiel_name("<div class='game'>Risiko</div>") == "Risiko"
|
||||
|
||||
|
||||
class TestValidierespieleranzahl:
|
||||
"""Tests für validiere_spieleranzahl."""
|
||||
|
||||
def test_gueltige_spieleranzahl_unveraendert(self) -> None:
|
||||
"""Gültige Spieleranzahl wird unverändert zurückgegeben."""
|
||||
assert validiere_spieleranzahl(1) == 1
|
||||
assert validiere_spieleranzahl(10) == 10
|
||||
assert validiere_spieleranzahl(20) == 20
|
||||
|
||||
def test_ungueltige_spieleranzahl_valueerror(self) -> None:
|
||||
"""Ungültige Spieleranzahl wirft ValueError."""
|
||||
with pytest.raises(ValueError):
|
||||
validiere_spieleranzahl(0)
|
||||
with pytest.raises(ValueError):
|
||||
validiere_spieleranzahl(21)
|
||||
Reference in New Issue
Block a user