feat: Merge Konflikt lösen - pyproject.toml mit Dependencies und Konfigurationen

This commit is contained in:
hermes
2026-06-22 06:33:03 +00:00
parent 0e34b9b0cb
commit c9fb7e8df2
13 changed files with 538 additions and 7 deletions
View File
+124
View File
@@ -0,0 +1,124 @@
"""Tests für den Queue-Handler."""
from unittest.mock import patch
import pytest
from src.models.submission import Submission
@pytest.fixture
def queue_handler():
"""Erstellt einen Queue-Handler mit gemocktem Redis."""
import fakeredis
fake_redis = fakeredis.FakeRedis(decode_responses=True)
with patch("src.queue.handler.redis.Redis", return_value=fake_redis):
from src.queue.handler import QueueHandler
handler = QueueHandler()
# Override stream keys für Tests
handler.stream_key = "test:submissions"
handler.processed_key = "test:processed"
handler.consumer_group = "test-workers"
# Consumer-Group initialisieren
try:
handler.redis.xgroup_create(handler.stream_key, handler.consumer_group, id="0")
except:
pass
handler._fake_redis = fake_redis # Für queue_size Referenz
return handler
def test_enqueue_neue_submission_gibt_stream_id(queue_handler):
"""Testet dass enqueue einer neuen Submission eine stream_id zurückgibt."""
submission = Submission(
message_id="msg_001",
plattform="whatsapp",
absender="+491****7890",
text="Testnachricht",
)
stream_id = queue_handler.enqueue(submission)
assert stream_id is not None
assert isinstance(stream_id, str)
def test_enqueue_duplikat_gibt_none(queue_handler):
"""Testet dass enqueue eines Duplikats None zurückgibt."""
submission = Submission(
message_id="msg_002",
plattform="telegram",
absender="@user123",
text="Duplikat-Test",
)
# Erstmal enqueueen
queue_handler.enqueue(submission)
# Zweites Mal mit gleicher message_id → sollte None zurückgeben
stream_id = queue_handler.enqueue(submission)
assert stream_id is None
def test_dequeue_holt_submission_zurueck(queue_handler):
"""Testet dass dequeue eingereihte Submissions zurückgibt."""
submission = Submission(
message_id="msg_003",
plattform="whatsapp",
absender="+499****3210",
text="Dequeue-Test",
)
queue_handler.enqueue(submission)
submissions = queue_handler.dequeue(count=5)
assert len(submissions) == 1
assert submissions[0].message_id == "msg_003"
assert submissions[0].text == "Dequeue-Test"
def test_mark_done_entfernt_aus_queue(queue_handler):
"""Testet dass mark_done die Nachricht ackt."""
submission = Submission(
message_id="msg_004",
plattform="telegram",
absender="@user456",
text="Mark-done-Test",
)
queue_handler.enqueue(submission)
queue_handler.dequeue(count=1) # Nachricht holen
queue_handler.mark_done(submission) # Als erledigt marken
# XAck sollte erfolgreich gewesen sein - keine Exception
# Wir prüfen indem wir erneut dequeue versuchen
submissions = queue_handler.dequeue(count=5)
assert len(submissions) == 0 # Sollte leer sein
def test_queue_size_gibt_korrekte_anzahl(queue_handler):
"""Testet dass queue_size die korrekte Anzahl zurückgibt."""
# Queue sollte anfangs leer sein
assert queue_handler.queue_size() == 0
# 3 Submissions enqueueen
for i in range(3):
submission = Submission(
message_id=f"msg_size_{i}",
plattform="whatsapp",
absender=f"+491****{i:04d}",
text=f"Nachricht {i}",
)
queue_handler.enqueue(submission)
size = queue_handler.queue_size()
assert size == 3
+61
View File
@@ -0,0 +1,61 @@
"""Tests für das Submission-Modell."""
from datetime import datetime
import pytest
from pydantic import ValidationError
from src.models.submission import Submission
def test_gueltige_submission_erstellen():
"""Testet das Erstellen einer gültigen Submission mit allen Feldern."""
submission = Submission(
message_id="msg_123",
plattform="whatsapp",
absender="+491234567890",
text="Hallo Welt",
)
assert submission.message_id == "msg_123"
assert submission.plattform == "whatsapp"
assert submission.absender == "+491234567890"
assert submission.text == "Hallo Welt"
assert submission.status == "neu"
assert submission.zeitstempel is not None
def test_leerer_text_wirft_error():
"""Testet dass ein leeres Textfeld eine ValidationError wirft."""
with pytest.raises(ValidationError):
Submission(
message_id="msg_123",
plattform="whatsapp",
absender="+491234567890",
text="",
)
def test_text_ueber_5000_zeichen_wirft_error():
"""Testet dass Text > 5000 Zeichen eine ValidationError wirft."""
with pytest.raises(ValidationError):
Submission(
message_id="msg_123",
plattform="telegram",
absender="@user123",
text="x" * 5001,
)
def test_zeitstempel_wird_automatisch_gesetzt():
"""Testet dass zeitstempel automatisch gesetzt wird und nicht None ist."""
vor_erstellung = datetime.now()
submission = Submission(
message_id="msg_456",
plattform="whatsapp",
absender="+499876543210",
text="Testnachricht",
)
nach_erstellung = datetime.now()
assert submission.zeitstempel is not None
assert vor_erstellung <= submission.zeitstempel <= nach_erstellung
+53
View File
@@ -0,0 +1,53 @@
"""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):
"""Testet dass eine gültige Telefonnummer bereinigt zurückgegeben wird."""
ergebnis = validiere_telefonnummer("+49 123 4567890")
assert ergebnis == "+491234567890"
def test_ungueltige_telefonnummer_wirft_error(self):
"""Testet dass eine ungültige Telefonnummer ValueError wirft."""
with pytest.raises(ValueError):
validiere_telefonnummer("12345") # Zu wenige Ziffern
class TestValidiereSpielName:
"""Tests für validiere_spiel_name."""
def test_gueltiger_spielname_bereinigt(self):
"""Testet dass ein gültiger Spielname bereinigt zurückgegeben wird."""
ergebnis = validiere_spiel_name(" Monopoly ")
assert ergebnis == "Monopoly"
def test_html_tags_im_spielnamen_entfernt(self):
"""Testet dass HTML-Tags aus dem Spielnamen entfernt werden."""
ergebnis = validiere_spiel_name("<b>Catan</b>")
assert ergebnis == "Catan"
assert "<b>" not in ergebnis
assert "</b>" not in ergebnis
class TestValidiereSpieleranzahl:
"""Tests für validiere_spieleranzahl."""
def test_gueltige_spieleranzahl_unveraendert(self):
"""Testet dass eine gültige Spieleranzahl unverändert zurückgegeben wird."""
ergebnis = validiere_spieleranzahl(5)
assert ergebnis == 5
def test_ungueltige_spieleranzahl_wirft_error(self):
"""Testet dass eine ungültige Spieleranzahl ValueError wirft."""
with pytest.raises(ValueError):
validiere_spieleranzahl(25) # Zu viele Spieler