3 changed files with 196 additions and 0 deletions
@ -0,0 +1,44 @@ |
|||||
|
from fastapi import FastAPI |
||||
|
from fastapi.testclient import TestClient |
||||
|
|
||||
|
app_default = FastAPI() |
||||
|
|
||||
|
|
||||
|
@app_default.post("/items/") |
||||
|
async def app_default_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
app_lax = FastAPI(strict_content_type=False) |
||||
|
|
||||
|
|
||||
|
@app_lax.post("/items/") |
||||
|
async def app_lax_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
client_default = TestClient(app_default) |
||||
|
client_lax = TestClient(app_lax) |
||||
|
|
||||
|
|
||||
|
def test_default_strict_rejects_no_content_type(): |
||||
|
response = client_default.post("/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 422 |
||||
|
|
||||
|
|
||||
|
def test_default_strict_accepts_json_content_type(): |
||||
|
response = client_default.post("/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
assert response.json() == {"key": "value"} |
||||
|
|
||||
|
|
||||
|
def test_lax_accepts_no_content_type(): |
||||
|
response = client_lax.post("/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 200 |
||||
|
assert response.json() == {"key": "value"} |
||||
|
|
||||
|
|
||||
|
def test_lax_accepts_json_content_type(): |
||||
|
response = client_lax.post("/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
assert response.json() == {"key": "value"} |
||||
@ -0,0 +1,91 @@ |
|||||
|
from fastapi import APIRouter, FastAPI |
||||
|
from fastapi.testclient import TestClient |
||||
|
|
||||
|
# Lax app with nested routers, inner overrides to strict |
||||
|
|
||||
|
app_nested = FastAPI(strict_content_type=False) # lax app |
||||
|
outer_router = APIRouter(prefix="/outer") # inherits lax from app |
||||
|
inner_strict = APIRouter(prefix="/strict", strict_content_type=True) |
||||
|
inner_default = APIRouter(prefix="/default") |
||||
|
|
||||
|
|
||||
|
@inner_strict.post("/items/") |
||||
|
async def inner_strict_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
@inner_default.post("/items/") |
||||
|
async def inner_default_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
outer_router.include_router(inner_strict) |
||||
|
outer_router.include_router(inner_default) |
||||
|
app_nested.include_router(outer_router) |
||||
|
|
||||
|
client_nested = TestClient(app_nested) |
||||
|
|
||||
|
|
||||
|
def test_strict_inner_on_lax_app_rejects_no_content_type(): |
||||
|
response = client_nested.post("/outer/strict/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 422 |
||||
|
|
||||
|
|
||||
|
def test_default_inner_inherits_lax_from_app(): |
||||
|
response = client_nested.post("/outer/default/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 200 |
||||
|
assert response.json() == {"key": "value"} |
||||
|
|
||||
|
|
||||
|
def test_strict_inner_accepts_json_content_type(): |
||||
|
response = client_nested.post("/outer/strict/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
|
||||
|
|
||||
|
def test_default_inner_accepts_json_content_type(): |
||||
|
response = client_nested.post("/outer/default/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
|
||||
|
|
||||
|
# Strict app -> lax outer router -> strict inner router |
||||
|
|
||||
|
app_mixed = FastAPI(strict_content_type=True) |
||||
|
mixed_outer = APIRouter(prefix="/outer", strict_content_type=False) |
||||
|
mixed_inner = APIRouter(prefix="/inner", strict_content_type=True) |
||||
|
|
||||
|
|
||||
|
@mixed_outer.post("/items/") |
||||
|
async def mixed_outer_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
@mixed_inner.post("/items/") |
||||
|
async def mixed_inner_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
mixed_outer.include_router(mixed_inner) |
||||
|
app_mixed.include_router(mixed_outer) |
||||
|
|
||||
|
client_mixed = TestClient(app_mixed) |
||||
|
|
||||
|
|
||||
|
def test_lax_outer_on_strict_app_accepts_no_content_type(): |
||||
|
response = client_mixed.post("/outer/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 200 |
||||
|
assert response.json() == {"key": "value"} |
||||
|
|
||||
|
|
||||
|
def test_strict_inner_on_lax_outer_rejects_no_content_type(): |
||||
|
response = client_mixed.post("/outer/inner/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 422 |
||||
|
|
||||
|
|
||||
|
def test_lax_outer_accepts_json_content_type(): |
||||
|
response = client_mixed.post("/outer/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
|
||||
|
|
||||
|
def test_strict_inner_on_lax_outer_accepts_json_content_type(): |
||||
|
response = client_mixed.post("/outer/inner/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
@ -0,0 +1,61 @@ |
|||||
|
from fastapi import APIRouter, FastAPI |
||||
|
from fastapi.testclient import TestClient |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
router_lax = APIRouter(prefix="/lax", strict_content_type=False) |
||||
|
router_strict = APIRouter(prefix="/strict", strict_content_type=True) |
||||
|
router_default = APIRouter(prefix="/default") |
||||
|
|
||||
|
|
||||
|
@router_lax.post("/items/") |
||||
|
async def router_lax_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
@router_strict.post("/items/") |
||||
|
async def router_strict_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
@router_default.post("/items/") |
||||
|
async def router_default_post(data: dict): |
||||
|
return data |
||||
|
|
||||
|
|
||||
|
app.include_router(router_lax) |
||||
|
app.include_router(router_strict) |
||||
|
app.include_router(router_default) |
||||
|
|
||||
|
client = TestClient(app) |
||||
|
|
||||
|
|
||||
|
def test_lax_router_on_strict_app_accepts_no_content_type(): |
||||
|
response = client.post("/lax/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 200 |
||||
|
assert response.json() == {"key": "value"} |
||||
|
|
||||
|
|
||||
|
def test_strict_router_on_strict_app_rejects_no_content_type(): |
||||
|
response = client.post("/strict/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 422 |
||||
|
|
||||
|
|
||||
|
def test_default_router_inherits_strict_from_app(): |
||||
|
response = client.post("/default/items/", content='{"key": "value"}') |
||||
|
assert response.status_code == 422 |
||||
|
|
||||
|
|
||||
|
def test_lax_router_accepts_json_content_type(): |
||||
|
response = client.post("/lax/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
|
||||
|
|
||||
|
def test_strict_router_accepts_json_content_type(): |
||||
|
response = client.post("/strict/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
|
|
||||
|
|
||||
|
def test_default_router_accepts_json_content_type(): |
||||
|
response = client.post("/default/items/", json={"key": "value"}) |
||||
|
assert response.status_code == 200 |
||||
Loading…
Reference in new issue