feat: Phase 3 Tasks 23-25 + Quality-Gate-Fixes
Task 23: Worker-Intake-Pipeline verbinden
- ergebnis-Feld in Submission/Payload
- worker.py extrahiert + worker_loop refactor
- test_worker.py mit VerarbeiteSubmission/WorkerLoop tests
Task 24: Admin-Stats mit echten Daten
- processed_total, uptime, error_rate, VERSION
- admin_health mit Redis-Live-Daten
Task 25: E2E-Integrationstest + worker_refaktorisiert
Quality-Gate-Fixes:
- consumername Collision: 'worker-1' -> f'worker-{id(self)}'
- fakeredis block=0 Timeout fix
- WhatsApp/Telegram webhook payload fixes
- test_telegram/integration/e2e/refaktorisiert
- handler.py recovery nach corrupted Patch
This commit is contained in:
+18
-9
@@ -16,6 +16,7 @@ class TestVerarbeiteSubmission:
|
||||
submission.zeitstempel = datetime.now()
|
||||
submission.absender = "+491****7890"
|
||||
submission.text = "Test Message"
|
||||
submission.ergebnis = None
|
||||
|
||||
assert submission.status != "erledigt"
|
||||
|
||||
@@ -23,6 +24,7 @@ class TestVerarbeiteSubmission:
|
||||
|
||||
assert result is True
|
||||
assert submission.status == "erledigt"
|
||||
assert submission.ergebnis is not None
|
||||
|
||||
|
||||
class TestWorkerLoop:
|
||||
@@ -36,10 +38,11 @@ class TestWorkerLoop:
|
||||
mock_sub.absender = "+491****7890"
|
||||
mock_sub.text = "Test"
|
||||
mock_sub.message_id = "msg1"
|
||||
mock_sub.ergebnis = MagicMock()
|
||||
|
||||
calls = [False]
|
||||
|
||||
def dequeue_side_effect(count: int = 5):
|
||||
def dequeue_side_effect(count: int = 5) -> list:
|
||||
if not calls[0]:
|
||||
calls[0] = True
|
||||
return [mock_sub]
|
||||
@@ -47,9 +50,11 @@ class TestWorkerLoop:
|
||||
|
||||
mock_qh.dequeue.side_effect = dequeue_side_effect
|
||||
|
||||
with patch("src.queue.worker.verarbeite_submission", return_value=True) as mock_verarb, \
|
||||
patch("src.queue.worker.time.sleep", return_value=None):
|
||||
worker_loop(mock_qh, poll_interval=0, batch_size=5)
|
||||
with (
|
||||
patch("src.queue.worker.verarbeite_submission", return_value=True) as mock_verarb,
|
||||
patch("src.queue.worker.time.sleep", return_value=None),
|
||||
):
|
||||
worker_loop(mock_qh, poll_interval=0, batch_size=5, max_iterations=2)
|
||||
|
||||
assert mock_verarb.call_count >= 1
|
||||
assert mock_qh.mark_done.call_count >= 1
|
||||
@@ -58,7 +63,7 @@ class TestWorkerLoop:
|
||||
"""worker_loop crasht nicht bei Fehler in einer Submission."""
|
||||
mock_qh = MagicMock()
|
||||
|
||||
def dequeue_side_effect(count: int = 5):
|
||||
def dequeue_side_effect(count: int = 5) -> list:
|
||||
if not hasattr(dequeue_side_effect, "called"):
|
||||
dequeue_side_effect.called = True # type: ignore[attr-defined]
|
||||
m = MagicMock()
|
||||
@@ -71,9 +76,13 @@ class TestWorkerLoop:
|
||||
|
||||
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", return_value=None):
|
||||
worker_loop(mock_qh, poll_interval=0, batch_size=5)
|
||||
with (
|
||||
patch(
|
||||
"src.queue.worker.verarbeite_submission",
|
||||
side_effect=Exception("Simulierter Fehler"),
|
||||
),
|
||||
patch("src.queue.worker.time.sleep", return_value=None),
|
||||
):
|
||||
worker_loop(mock_qh, poll_interval=0, batch_size=5, max_iterations=2)
|
||||
|
||||
assert True
|
||||
|
||||
Reference in New Issue
Block a user