ci: scoped 100% coverage gates + policy doc
This commit is contained in:
@@ -4,7 +4,9 @@ from fastapi import FastAPI, HTTPException
|
||||
from fastapi.testclient import TestClient
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from app.core.error_handling import REQUEST_ID_HEADER, install_error_handling
|
||||
from starlette.requests import Request
|
||||
|
||||
from app.core.error_handling import REQUEST_ID_HEADER, _error_payload, _get_request_id, install_error_handling
|
||||
|
||||
|
||||
def test_request_validation_error_includes_request_id():
|
||||
@@ -80,3 +82,38 @@ def test_response_validation_error_returns_500_with_request_id():
|
||||
assert body["detail"] == "Internal Server Error"
|
||||
assert isinstance(body.get("request_id"), str) and body["request_id"]
|
||||
assert resp.headers.get(REQUEST_ID_HEADER) == body["request_id"]
|
||||
|
||||
|
||||
def test_client_provided_request_id_is_preserved():
|
||||
app = FastAPI()
|
||||
install_error_handling(app)
|
||||
|
||||
@app.get("/needs-int")
|
||||
def needs_int(limit: int) -> dict[str, int]:
|
||||
return {"limit": limit}
|
||||
|
||||
client = TestClient(app)
|
||||
resp = client.get("/needs-int?limit=abc", headers={REQUEST_ID_HEADER: " req-123 "})
|
||||
|
||||
assert resp.status_code == 422
|
||||
body = resp.json()
|
||||
assert body["request_id"] == "req-123"
|
||||
assert resp.headers.get(REQUEST_ID_HEADER) == "req-123"
|
||||
|
||||
|
||||
def test_get_request_id_returns_none_for_missing_or_invalid_state() -> None:
|
||||
# Empty state
|
||||
req = Request({"type": "http", "headers": [], "state": {}})
|
||||
assert _get_request_id(req) is None
|
||||
|
||||
# Non-string request_id
|
||||
req = Request({"type": "http", "headers": [], "state": {"request_id": 123}})
|
||||
assert _get_request_id(req) is None
|
||||
|
||||
# Empty string request_id
|
||||
req = Request({"type": "http", "headers": [], "state": {"request_id": ""}})
|
||||
assert _get_request_id(req) is None
|
||||
|
||||
|
||||
def test_error_payload_omits_request_id_when_none() -> None:
|
||||
assert _error_payload(detail="x", request_id=None) == {"detail": "x"}
|
||||
|
||||
Reference in New Issue
Block a user