"""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