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:
hermes
2026-06-23 21:38:50 +00:00
parent c56497d88a
commit 31b1a62cb2
19 changed files with 670 additions and 163 deletions
+6 -7
View File
@@ -14,11 +14,11 @@ class TestTelegramWebhook:
"""Erstellt Flask-App mit mocktem QueueHandler."""
self.app = Flask(__name__)
self.app.queue_handler = MagicMock()
self.app.register_blueprint(telegram_bp, url_prefix="/webhook")
self.app.register_blueprint(telegram_bp)
self.client = self.app.test_client()
def test_post_mit_gueltigem_payload(self) -> None:
"""POST mit gültigem Payload 200."""
"""POST mit gültigem Payload -> 200."""
payload = {
"message": {
"message_id": "msg123",
@@ -28,22 +28,21 @@ class TestTelegramWebhook:
}
response = self.client.post(
"/webhook/telegram",
data=payload,
content_type="application/json",
json=payload,
)
assert response.status_code == 200
data = response.get_json()
assert data["status"] == "accepted"
def test_post_ohne_json(self) -> None:
"""POST ohne JSON 400."""
"""POST ohne JSON -> 400."""
response = self.client.post("/webhook/telegram", data="nicht JSON")
assert response.status_code == 400
data = response.get_json()
assert "error" in data
def test_post_ohne_message_id(self) -> None:
"""POST ohne message_id 400."""
"""POST ohne message_id -> 400."""
payload = {
"message": {
"chat": {"id": "123"},
@@ -60,7 +59,7 @@ class TestTelegramWebhook:
assert "error" in data
def test_post_mit_leerem_text(self) -> None:
"""POST mit leerem text 400."""
"""POST mit leerem text -> 400."""
payload = {
"message": {
"message_id": "msg456",