103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
"""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
|