2
from fastapi import FastAPI, HTTPException
3
from fastapi.exceptions import RequestValidationError
4
from fastapi.testclient import TestClient
5
from starlette.responses import JSONResponse
8
def http_exception_handler(request, exception):
9
return JSONResponse({"exception": "http-exception"})
12
def request_validation_exception_handler(request, exception):
13
return JSONResponse({"exception": "request-validation"})
16
def server_error_exception_handler(request, exception):
17
return JSONResponse(status_code=500, content={"exception": "server-error"})
22
HTTPException: http_exception_handler,
23
RequestValidationError: request_validation_exception_handler,
24
Exception: server_error_exception_handler,
28
client = TestClient(app)
31
@app.get("/http-exception")
32
def route_with_http_exception():
33
raise HTTPException(status_code=400)
36
@app.get("/request-validation/{param}/")
37
def route_with_request_validation_exception(param: int):
38
pass # pragma: no cover
41
@app.get("/server-error")
42
def route_with_server_error():
43
raise RuntimeError("Oops!")
46
def test_override_http_exception():
47
response = client.get("/http-exception")
48
assert response.status_code == 200
49
assert response.json() == {"exception": "http-exception"}
52
def test_override_request_validation_exception():
53
response = client.get("/request-validation/invalid")
54
assert response.status_code == 200
55
assert response.json() == {"exception": "request-validation"}
58
def test_override_server_error_exception_raises():
59
with pytest.raises(RuntimeError):
60
client.get("/server-error")
63
def test_override_server_error_exception_response():
64
client = TestClient(app, raise_server_exceptions=False)
65
response = client.get("/server-error")
66
assert response.status_code == 500
67
assert response.json() == {"exception": "server-error"}