"""Tests für den Telegram-Webhook Blueprint.""" from __future__ import annotations import fakeredis from flask import Flask from flask.testing import FlaskClient from src.app import create_app from src.queue.handler import QueueHandler from src.routes.telegram import telegram def _setup_app_with_fakeredis() -> Flask: """Erstellt eine Flask-App mit fakeredis-QueueHandler und registriert den Telegram-Blueprint.""" app = create_app() 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() app.queue_handler = qh # type: ignore[attr-defined] app.register_blueprint(telegram) return app def test_valid_telegram_payload_returns_200() -> None: """POST /webhook/telegram mit gültigem Payload → 200.""" app = _setup_app_with_fakeredis() client: FlaskClient = app.test_client() payload = { "update_id": 123456789, "message": { "message_id": 100, "from": { "id": 987654321, "first_name": "TestUser", }, "chat": { "id": 987654321, "first_name": "TestUser", "type": "private", }, "date": 1719000000, "text": "Hallo BSN-Bot!", }, } response = client.post("/webhook/telegram", json=payload) assert response.status_code == 200 data = response.get_json() assert data is not None assert data["status"] == "ok" def test_missing_json_returns_400() -> None: """POST /webhook/telegram ohne JSON-Body → 400.""" app = _setup_app_with_fakeredis() client: FlaskClient = app.test_client() response = client.post("/webhook/telegram", data="not json", content_type="text/plain") assert response.status_code == 400 data = response.get_json() assert data is not None assert "error" in data def test_missing_message_id_returns_400() -> None: """POST /webhook/telegram ohne message_id → 400.""" app = _setup_app_with_fakeredis() client: FlaskClient = app.test_client() payload = { "message": { "chat": {"id": 123}, "text": "Hallo", } } response = client.post("/webhook/telegram", json=payload) assert response.status_code == 400 data = response.get_json() assert data is not None assert "message_id" in data["error"] def test_empty_text_returns_400() -> None: """POST /webhook/telegram mit leerem text → 400 (min_length=1 ValidationError).""" app = _setup_app_with_fakeredis() client: FlaskClient = app.test_client() payload = { "message": { "message_id": 200, "chat": {"id": 456}, "text": "", } } response = client.post("/webhook/telegram", json=payload) assert response.status_code == 400 data = response.get_json() assert data is not None assert "error" in data