87 lines
2.8 KiB
Python
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
|