"""Tests für QueueHandler mit fakeredis.""" from __future__ import annotations from collections.abc import Generator from datetime import datetime import fakeredis import pytest from src.models.submission import Submission from src.queue.handler import QueueHandler @pytest.fixture def handler() -> Generator[QueueHandler]: """QueueHandler mit fakeredis-Backend.""" fake_redis = fakeredis.FakeRedis(decode_responses=True) qh = QueueHandler.__new__(QueueHandler) qh.redis = fake_redis qh.stream_key = "bsn:submissions" qh.processed_set = "bsn:processed" qh.stream_ids_hash = "bsn:stream_ids" qh.group_name = "bsn-workers" qh._ensure_consumer_group() yield qh fake_redis.flushall() def _make_submission(message_id: str = "msg-001") -> Submission: """Erzeugt eine Test-Submission.""" return Submission( message_id=message_id, plattform="whatsapp", absender="+491234567890", text="Testnachricht für QueueHandler.", zeitstempel=datetime(2025, 1, 1, 12, 0, 0), ) def test_enqueue_neue_submission_gibt_stream_id(handler: QueueHandler) -> None: """Eine neue Submission wird eingereiht und liefert eine stream_id zurück.""" sub = _make_submission("msg-001") stream_id = handler.enqueue(sub) assert stream_id is not None assert isinstance(stream_id, str) assert len(stream_id) > 0 def test_enqueue_duplikat_gibt_none(handler: QueueHandler) -> None: """Eine doppelt eingereihte Submission ergibt None.""" sub = _make_submission("msg-dup") first = handler.enqueue(sub) assert first is not None second = handler.enqueue(sub) assert second is None def test_dequeue_holt_eingereihte_submission(handler: QueueHandler) -> None: """dequeue liefert zuvor enqueuete Submissions zurück.""" sub = _make_submission("msg-003") handler.enqueue(sub) results = handler.dequeue(count=10) assert len(results) == 1 assert results[0].message_id == "msg-003" assert results[0].plattform == "whatsapp" assert results[0].text == "Testnachricht für QueueHandler." def test_mark_done_entfernt_aus_queue(handler: QueueHandler) -> None: """Nach mark_done wird die Submission aus dem Stream-Pending entfernt.""" sub = _make_submission("msg-004") handler.enqueue(sub) # Aus der Queue holen (Pending-Eintrag) results = handler.dequeue(count=10) assert len(results) == 1 # Als erledigt markieren handler.mark_done(sub) # Nach XACK kein erneutes Dequeue (keine pending messages mehr) results2 = handler.dequeue(count=10) assert len(results2) == 0 def test_queue_size_gibt_korrekte_anzahl(handler: QueueHandler) -> None: """queue_size gibt die Anzahl der Nachrichten im Stream korrekt zurück.""" assert handler.queue_size() == 0 for i in range(5): handler.enqueue(_make_submission(f"msg-size-{i}")) assert handler.queue_size() == 5 # Weitere 3 for i in range(5, 8): handler.enqueue(_make_submission(f"msg-size-{i}")) assert handler.queue_size() == 8