pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.5 KiB
89 lines
2.5 KiB
"""Test using Response type hint as dependency annotation."""
|
|
|
|
from typing import Annotated
|
|
|
|
from fastapi import Depends, FastAPI, Response
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
def test_response_with_depends_annotated():
|
|
"""Response type hint should work with Annotated[Response, Depends(...)]."""
|
|
app = FastAPI()
|
|
|
|
def modify_response(response: Response) -> Response:
|
|
response.headers["X-Custom"] = "modified"
|
|
return response
|
|
|
|
@app.get("/")
|
|
def endpoint(response: Annotated[Response, Depends(modify_response)]):
|
|
return {"status": "ok"}
|
|
|
|
client = TestClient(app)
|
|
resp = client.get("/")
|
|
|
|
assert resp.status_code == 200
|
|
assert resp.json() == {"status": "ok"}
|
|
assert resp.headers.get("X-Custom") == "modified"
|
|
|
|
|
|
def test_response_with_depends_default():
|
|
"""Response type hint should work with Response = Depends(...)."""
|
|
app = FastAPI()
|
|
|
|
def modify_response(response: Response) -> Response:
|
|
response.headers["X-Custom"] = "modified"
|
|
return response
|
|
|
|
@app.get("/")
|
|
def endpoint(response: Response = Depends(modify_response)):
|
|
return {"status": "ok"}
|
|
|
|
client = TestClient(app)
|
|
resp = client.get("/")
|
|
|
|
assert resp.status_code == 200
|
|
assert resp.json() == {"status": "ok"}
|
|
assert resp.headers.get("X-Custom") == "modified"
|
|
|
|
|
|
def test_response_without_depends():
|
|
"""Regular Response injection should still work."""
|
|
app = FastAPI()
|
|
|
|
@app.get("/")
|
|
def endpoint(response: Response):
|
|
response.headers["X-Direct"] = "set"
|
|
return {"status": "ok"}
|
|
|
|
client = TestClient(app)
|
|
resp = client.get("/")
|
|
|
|
assert resp.status_code == 200
|
|
assert resp.json() == {"status": "ok"}
|
|
assert resp.headers.get("X-Direct") == "set"
|
|
|
|
|
|
def test_response_dependency_chain():
|
|
"""Response dependency should work in a chain of dependencies."""
|
|
app = FastAPI()
|
|
|
|
def first_modifier(response: Response) -> Response:
|
|
response.headers["X-First"] = "1"
|
|
return response
|
|
|
|
def second_modifier(
|
|
response: Annotated[Response, Depends(first_modifier)],
|
|
) -> Response:
|
|
response.headers["X-Second"] = "2"
|
|
return response
|
|
|
|
@app.get("/")
|
|
def endpoint(response: Annotated[Response, Depends(second_modifier)]):
|
|
return {"status": "ok"}
|
|
|
|
client = TestClient(app)
|
|
resp = client.get("/")
|
|
|
|
assert resp.status_code == 200
|
|
assert resp.headers.get("X-First") == "1"
|
|
assert resp.headers.get("X-Second") == "2"
|
|
|