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.
206 lines
5.0 KiB
206 lines
5.0 KiB
from fastapi import APIRouter, FastAPI
|
|
from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
class OverrideResponse(JSONResponse):
|
|
media_type = "application/x-override"
|
|
|
|
|
|
app = FastAPI()
|
|
router_a = APIRouter()
|
|
router_a_a = APIRouter()
|
|
router_a_b_override = APIRouter() # Overrides default class
|
|
router_b_override = APIRouter() # Overrides default class
|
|
router_b_a = APIRouter()
|
|
router_b_a_c_override = APIRouter() # Overrides default class again
|
|
|
|
|
|
@app.get("/")
|
|
def get_root():
|
|
return {"msg": "Hello World"}
|
|
|
|
|
|
@app.get("/override", response_class=PlainTextResponse)
|
|
def get_path_override():
|
|
return "Hello World"
|
|
|
|
|
|
@router_a.get("/")
|
|
def get_a():
|
|
return {"msg": "Hello A"}
|
|
|
|
|
|
@router_a.get("/override", response_class=PlainTextResponse)
|
|
def get_a_path_override():
|
|
return "Hello A"
|
|
|
|
|
|
@router_a_a.get("/")
|
|
def get_a_a():
|
|
return {"msg": "Hello A A"}
|
|
|
|
|
|
@router_a_a.get("/override", response_class=PlainTextResponse)
|
|
def get_a_a_path_override():
|
|
return "Hello A A"
|
|
|
|
|
|
@router_a_b_override.get("/")
|
|
def get_a_b():
|
|
return "Hello A B"
|
|
|
|
|
|
@router_a_b_override.get("/override", response_class=HTMLResponse)
|
|
def get_a_b_path_override():
|
|
return "Hello A B"
|
|
|
|
|
|
@router_b_override.get("/")
|
|
def get_b():
|
|
return "Hello B"
|
|
|
|
|
|
@router_b_override.get("/override", response_class=HTMLResponse)
|
|
def get_b_path_override():
|
|
return "Hello B"
|
|
|
|
|
|
@router_b_a.get("/")
|
|
def get_b_a():
|
|
return "Hello B A"
|
|
|
|
|
|
@router_b_a.get("/override", response_class=HTMLResponse)
|
|
def get_b_a_path_override():
|
|
return "Hello B A"
|
|
|
|
|
|
@router_b_a_c_override.get("/")
|
|
def get_b_a_c():
|
|
return "Hello B A C"
|
|
|
|
|
|
@router_b_a_c_override.get("/override", response_class=OverrideResponse)
|
|
def get_b_a_c_path_override():
|
|
return {"msg": "Hello B A C"}
|
|
|
|
|
|
router_b_a.include_router(
|
|
router_b_a_c_override, prefix="/c", default_response_class=HTMLResponse
|
|
)
|
|
router_b_override.include_router(router_b_a, prefix="/a")
|
|
router_a.include_router(router_a_a, prefix="/a")
|
|
router_a.include_router(
|
|
router_a_b_override, prefix="/b", default_response_class=PlainTextResponse
|
|
)
|
|
app.include_router(router_a, prefix="/a")
|
|
app.include_router(
|
|
router_b_override, prefix="/b", default_response_class=PlainTextResponse
|
|
)
|
|
|
|
|
|
client = TestClient(app)
|
|
|
|
json_type = "application/json"
|
|
text_type = "text/plain; charset=utf-8"
|
|
html_type = "text/html; charset=utf-8"
|
|
override_type = "application/x-override"
|
|
|
|
|
|
def test_app():
|
|
with client:
|
|
response = client.get("/")
|
|
assert response.json() == {"msg": "Hello World"}
|
|
assert response.headers["content-type"] == json_type
|
|
|
|
|
|
def test_app_override():
|
|
with client:
|
|
response = client.get("/override")
|
|
assert response.content == b"Hello World"
|
|
assert response.headers["content-type"] == text_type
|
|
|
|
|
|
def test_router_a():
|
|
with client:
|
|
response = client.get("/a")
|
|
assert response.json() == {"msg": "Hello A"}
|
|
assert response.headers["content-type"] == json_type
|
|
|
|
|
|
def test_router_a_override():
|
|
with client:
|
|
response = client.get("/a/override")
|
|
assert response.content == b"Hello A"
|
|
assert response.headers["content-type"] == text_type
|
|
|
|
|
|
def test_router_a_a():
|
|
with client:
|
|
response = client.get("/a/a")
|
|
assert response.json() == {"msg": "Hello A A"}
|
|
assert response.headers["content-type"] == json_type
|
|
|
|
|
|
def test_router_a_a_override():
|
|
with client:
|
|
response = client.get("/a/a/override")
|
|
assert response.content == b"Hello A A"
|
|
assert response.headers["content-type"] == text_type
|
|
|
|
|
|
def test_router_a_b():
|
|
with client:
|
|
response = client.get("/a/b")
|
|
assert response.content == b"Hello A B"
|
|
assert response.headers["content-type"] == text_type
|
|
|
|
|
|
def test_router_a_b_override():
|
|
with client:
|
|
response = client.get("/a/b/override")
|
|
assert response.content == b"Hello A B"
|
|
assert response.headers["content-type"] == html_type
|
|
|
|
|
|
def test_router_b():
|
|
with client:
|
|
response = client.get("/b")
|
|
assert response.content == b"Hello B"
|
|
assert response.headers["content-type"] == text_type
|
|
|
|
|
|
def test_router_b_override():
|
|
with client:
|
|
response = client.get("/b/override")
|
|
assert response.content == b"Hello B"
|
|
assert response.headers["content-type"] == html_type
|
|
|
|
|
|
def test_router_b_a():
|
|
with client:
|
|
response = client.get("/b/a")
|
|
assert response.content == b"Hello B A"
|
|
assert response.headers["content-type"] == text_type
|
|
|
|
|
|
def test_router_b_a_override():
|
|
with client:
|
|
response = client.get("/b/a/override")
|
|
assert response.content == b"Hello B A"
|
|
assert response.headers["content-type"] == html_type
|
|
|
|
|
|
def test_router_b_a_c():
|
|
with client:
|
|
response = client.get("/b/a/c")
|
|
assert response.content == b"Hello B A C"
|
|
assert response.headers["content-type"] == html_type
|
|
|
|
|
|
def test_router_b_a_c_override():
|
|
with client:
|
|
response = client.get("/b/a/c/override")
|
|
assert response.json() == {"msg": "Hello B A C"}
|
|
assert response.headers["content-type"] == override_type
|
|
|