From e43909b0cdbc6b5e83feb4f979e2f0a71c34c07c Mon Sep 17 00:00:00 2001 From: "Alicia (BSN)" Date: Sun, 21 Jun 2026 23:05:21 +0000 Subject: [PATCH] feat: Submission-Pydantic-Modell mit Validierung --- src/models/__init__.py | 0 src/models/submission.py | 25 +++++++++++++++++ tests/test_submission.py | 60 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 src/models/__init__.py create mode 100644 src/models/submission.py create mode 100644 tests/test_submission.py diff --git a/src/models/__init__.py b/src/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/models/submission.py b/src/models/submission.py new file mode 100644 index 0000000..2b9a236 --- /dev/null +++ b/src/models/submission.py @@ -0,0 +1,25 @@ +"""Submission-Datenmodell für Community-Einreichungen.""" + +from datetime import datetime + +from pydantic import BaseModel, Field + + +class Submission(BaseModel): + """Eine Community-Einreichung (WhatsApp/Telegram). + + Attributes: + message_id: Eindeutige Nachrichten-ID. + plattform: whatsapp oder telegram. + absender: Absender-ID oder Telefonnummer. + text: Nachrichtentext. + zeitstempel: Eingangszeitpunkt. + status: neu, in_bearbeitung, erledigt, fehler. + """ + + message_id: str = Field(..., description="Eindeutige Nachrichten-ID") + plattform: str = Field(..., description="whatsapp oder telegram") + absender: str = Field(..., description="Absender-ID oder Telefonnummer") + text: str = Field(..., min_length=1, max_length=5000, description="Nachrichtentext") + zeitstempel: datetime = Field(default_factory=datetime.now, description="Eingangszeitpunkt") + status: str = Field(default="neu", description="neu, in_bearbeitung, erledigt, fehler") diff --git a/tests/test_submission.py b/tests/test_submission.py new file mode 100644 index 0000000..0803f94 --- /dev/null +++ b/tests/test_submission.py @@ -0,0 +1,60 @@ +"""Tests für das Submission-Pydantic-Modell.""" + +from datetime import datetime + +import pytest +from pydantic import ValidationError + +from src.models.submission import Submission + + +def test_gueltige_submission_alle_felder_korrekt() -> None: + """Gültige Submission erstellen — alle Felder korrekt.""" + sub = Submission( + message_id="msg_001", + plattform="whatsapp", + absender="+491234567890", + text="Hallo, kennt jemand ein gutes Kartenspiele?", + ) + assert sub.message_id == "msg_001" + assert sub.plattform == "whatsapp" + assert sub.absender == "+491234567890" + assert sub.text == "Hallo, kennt jemand ein gutes Kartenspiele?" + assert sub.status == "neu" + assert isinstance(sub.zeitstempel, datetime) + + +def test_leerer_text_wirft_validation_error() -> None: + """Leerer Text wirft ValidationError.""" + with pytest.raises(ValidationError): + Submission( + message_id="msg_002", + plattform="telegram", + absender="chat_12345", + text="", + ) + + +def test_text_ueber_5000_zeichen_wirft_validation_error() -> None: + """Text > 5000 Zeichen wirft ValidationError.""" + with pytest.raises(ValidationError): + Submission( + message_id="msg_003", + plattform="telegram", + absender="chat_12345", + text="a" * 5001, + ) + + +def test_zeitstempel_wird_auto_gesetzt() -> None: + """zeitstempel wird automatisch gesetzt (nicht None).""" + before = datetime.now() + sub = Submission( + message_id="msg_004", + plattform="whatsapp", + absender="+4999999999", + text="Test", + ) + after = datetime.now() + assert sub.zeitstempel is not None + assert before <= sub.zeitstempel <= after