committed by
Sebastián Ramírez
7 changed files with 469 additions and 39 deletions
@ -0,0 +1,216 @@ |
|||||
|
from typing import Any |
||||
|
|
||||
|
import orjson |
||||
|
from fastapi import APIRouter, FastAPI |
||||
|
from starlette.responses import HTMLResponse, JSONResponse, PlainTextResponse |
||||
|
from starlette.testclient import TestClient |
||||
|
|
||||
|
|
||||
|
class ORJSONResponse(JSONResponse): |
||||
|
media_type = "application/x-orjson" |
||||
|
|
||||
|
def render(self, content: Any) -> bytes: |
||||
|
return orjson.dumps(content) |
||||
|
|
||||
|
|
||||
|
class OverrideResponse(JSONResponse): |
||||
|
media_type = "application/x-override" |
||||
|
|
||||
|
|
||||
|
app = FastAPI(default_response_class=ORJSONResponse) |
||||
|
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) |
||||
|
|
||||
|
orjson_type = "application/x-orjson" |
||||
|
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"] == orjson_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"] == orjson_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"] == orjson_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 |
@ -0,0 +1,206 @@ |
|||||
|
from fastapi import APIRouter, FastAPI |
||||
|
from starlette.responses import HTMLResponse, JSONResponse, PlainTextResponse |
||||
|
from starlette.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 |
Loading…
Reference in new issue