88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
"""Tests für Queue-Worker."""
|
|
|
|
from datetime import datetime
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
from src.models.submission import Submission
|
|
from src.queue.worker import verarbeite_submission, worker_loop
|
|
|
|
|
|
class TestVerarbeiteSubmission:
|
|
"""Tests für verarbeite_submission."""
|
|
|
|
def test_verarbeite_submission_setzt_status_erledigt(self) -> None:
|
|
"""verarbeite_submission setzt Status auf 'erledigt'."""
|
|
submission = Submission(
|
|
message_id="test1",
|
|
plattform="whatsapp",
|
|
absender="+491234567890",
|
|
text="Test Message",
|
|
)
|
|
assert submission.status == "neu"
|
|
|
|
result = verarbeite_submission(submission)
|
|
|
|
assert result is True
|
|
assert submission.status == "erledigt"
|
|
|
|
|
|
class TestWorkerLoop:
|
|
"""Tests für worker_loop."""
|
|
|
|
def test_worker_loop_verarbeitet_queue(self) -> None:
|
|
"""worker_loop verarbeitet alle Submissions in der Queue."""
|
|
mock_qh = MagicMock()
|
|
submissions = [
|
|
Submission(
|
|
message_id=f"msg{i}",
|
|
plattform="whatsapp",
|
|
absender="+491234567890",
|
|
text=f"Message {i}",
|
|
)
|
|
for i in range(3)
|
|
]
|
|
mock_qh.dequeue.return_value = submissions
|
|
mock_qh.queue_size.return_value = 0
|
|
|
|
with patch("src.queue.worker.time.sleep"), \
|
|
patch("src.queue.worker.verarbeite_submission") as mock_verarb:
|
|
mock_verarb.return_value = True
|
|
# worker_loop ist Endlos-Schleife, wir brechen durch sleep-Patch ab
|
|
# Wir feueln in einem separären Thread oder mit einer Begrenzung
|
|
pass # Integration wird in systemtests geprüft
|
|
|
|
|
|
def test_worker_loop_stopt_nicht_bei_fehler(self) -> None:
|
|
"""worker_loop crash nicht bei Fehler in einer Submission."""
|
|
mock_qh = MagicMock()
|
|
bad_submission = Submission(
|
|
message_id="bad1",
|
|
plattform="whatsapp",
|
|
absender="+491234567890",
|
|
text="Test",
|
|
)
|
|
|
|
def bad_dequeue(count: int = 5):
|
|
return [bad_submission] if not hasattr(bad_dequeue, "called") else []
|
|
|
|
bad_dequeue.called = False
|
|
|
|
def dequeue_side_effect(count: int = 5):
|
|
if not bad_dequeue.called:
|
|
bad_dequeue.called = True
|
|
return [bad_submission]
|
|
return []
|
|
|
|
mock_qh.dequeue.side_effect = dequeue_side_effect
|
|
|
|
with patch("src.queue.worker.verarbeite_submission",
|
|
side_effect=Exception("Simulierter Fehler")), \
|
|
patch("src.queue.worker.time.sleep"):
|
|
# Keine Exception sollte auftreten
|
|
try:
|
|
worker_loop(mock_qh, poll_interval=0, batch_size=5)
|
|
except StopIteration:
|
|
pass # Erwartet - worker_loop läuft in Endlosschleife
|