Files
DashBoard/tests/test_degraded_responses.py
2026-02-08 08:30:48 +08:00

87 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
"""Degraded response contract tests."""
from __future__ import annotations
from unittest.mock import patch
import mes_dashboard.core.database as db
from mes_dashboard.app import create_app
from mes_dashboard.core.database import (
DatabasePoolExhaustedError,
DatabaseCircuitOpenError,
)
def _client():
db._ENGINE = None
app = create_app("testing")
app.config["TESTING"] = True
@app.route("/api/__test__/pool")
def _pool_error():
raise DatabasePoolExhaustedError("pool exhausted", retry_after_seconds=7)
@app.route("/api/__test__/circuit")
def _circuit_error():
raise DatabaseCircuitOpenError("circuit open", retry_after_seconds=11)
return app.test_client()
def test_pool_exhausted_error_handler_contract():
response = _client().get("/api/__test__/pool")
assert response.status_code == 503
assert response.headers.get("Retry-After") == "7"
payload = response.get_json()
assert payload["success"] is False
assert payload["error"]["code"] == "DB_POOL_EXHAUSTED"
assert payload["meta"]["retry_after_seconds"] == 7
def test_circuit_open_error_handler_contract():
response = _client().get("/api/__test__/circuit")
assert response.status_code == 503
assert response.headers.get("Retry-After") == "11"
payload = response.get_json()
assert payload["success"] is False
assert payload["error"]["code"] == "CIRCUIT_BREAKER_OPEN"
assert payload["meta"]["retry_after_seconds"] == 11
@patch(
"mes_dashboard.routes.wip_routes.get_wip_summary",
side_effect=DatabasePoolExhaustedError("pool exhausted", retry_after_seconds=5),
)
def test_wip_route_propagates_degraded_contract(_mock_summary):
response = _client().get("/api/wip/overview/summary")
assert response.status_code == 503
payload = response.get_json()
assert payload["error"]["code"] == "DB_POOL_EXHAUSTED"
@patch(
"mes_dashboard.routes.resource_routes.get_resource_status_summary",
side_effect=DatabasePoolExhaustedError("pool exhausted", retry_after_seconds=9),
)
def test_resource_route_propagates_degraded_contract(_mock_summary):
response = _client().get("/api/resource/status/summary")
assert response.status_code == 503
payload = response.get_json()
assert payload["error"]["code"] == "DB_POOL_EXHAUSTED"
assert payload["meta"]["retry_after_seconds"] == 9
@patch(
"mes_dashboard.routes.dashboard_routes.query_dashboard_kpi",
side_effect=DatabaseCircuitOpenError("circuit open", retry_after_seconds=13),
)
def test_dashboard_route_propagates_degraded_contract(_mock_kpi):
response = _client().post("/api/dashboard/kpi", json={})
assert response.status_code == 503
payload = response.get_json()
assert payload["error"]["code"] == "CIRCUIT_BREAKER_OPEN"
assert payload["meta"]["retry_after_seconds"] == 13