From 1f631f2fcc500ff6245540affef35194d1d27283 Mon Sep 17 00:00:00 2001 From: hermes Date: Mon, 22 Jun 2026 09:43:29 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Admin-Route=20f=C3=BCr=20Queue-Status-M?= =?UTF-8?q?onitoring=20(closes=20#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/admin.py | 21 ++++++++++++++++++++ tests/test_admin.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/routes/admin.py create mode 100644 tests/test_admin.py diff --git a/src/routes/admin.py b/src/routes/admin.py new file mode 100644 index 0000000..a07b012 --- /dev/null +++ b/src/routes/admin.py @@ -0,0 +1,21 @@ +"""Flask-Blueprint für Admin-Route.""" + +from flask import Blueprint, current_app, jsonify + +admin_bp = Blueprint("admin", __name__) + + +@admin_bp.route("/admin/queue", methods=["GET"]) +def queue_status() -> tuple: + """Gibt Queue-Status zurück.""" + qh = current_app.queue_handler # type: ignore[attr-defined] + return jsonify({"queue_size": qh.queue_size(), "status": "ok"}), 200 + + +@admin_bp.route("/admin/stats", methods=["GET"]) +def stats() -> tuple: + """Gibt System-Statistiken zurück.""" + qh = current_app.queue_handler # type: ignore[attr-defined] + return jsonify( + {"queue_size": qh.queue_size(), "uptime": "placeholder", "version": "0.1.0"} + ), 200 diff --git a/tests/test_admin.py b/tests/test_admin.py new file mode 100644 index 0000000..135b17b --- /dev/null +++ b/tests/test_admin.py @@ -0,0 +1,48 @@ +"""Tests für Admin-Route.""" + +from unittest.mock import MagicMock + +from flask import Flask + +from src.routes.admin import admin_bp + + +class TestAdminRoute: + """Tests für Admin-Route.""" + + def setup_method(self) -> None: + """Erstellt Flask-App mit mocktem QueueHandler.""" + self.app = Flask(__name__) + self.app.queue_handler = MagicMock() + self.app.queue_handler.queue_size.return_value = 42 + self.app.register_blueprint(admin_bp, url_prefix="/") + self.client = self.app.test_client() + + def test_get_admin_queue_ergibt_200(self) -> None: + """GET /admin/queue → 200 + JSON mit queue_size.""" + response = self.client.get("/admin/queue") + assert response.status_code == 200 + data = response.get_json() + assert "queue_size" in data + assert data["status"] == "ok" + + def test_get_admin_queue_queue_size_ist_integer(self) -> None: + """GET /admin/queue → queue_size ist Integer.""" + response = self.client.get("/admin/queue") + data = response.get_json() + assert isinstance(data["queue_size"], int) + + def test_get_admin_stats_ergibt_200(self) -> None: + """GET /admin/stats → 200 + version '0.1.0'.""" + response = self.client.get("/admin/stats") + assert response.status_code == 200 + data = response.get_json() + assert data["version"] == "0.1.0" + + def test_get_admin_stats_json_enhaelt_alle_keys(self) -> None: + """GET /admin/stats → JSON enthält alle Keys.""" + response = self.client.get("/admin/stats") + data = response.get_json() + assert "queue_size" in data + assert "uptime" in data + assert "version" in data