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.
81 lines
2.5 KiB
81 lines
2.5 KiB
import pytest
|
|
from fastapi import APIRouter, FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from .utils import needs_pydanticv2
|
|
|
|
|
|
@needs_pydanticv2
|
|
@pytest.mark.parametrize(
|
|
"include_error_input,include_error_url",
|
|
[(False, False), (False, True), (True, False), (True, True)],
|
|
)
|
|
def test_input_and_url_fields(include_error_input, include_error_url):
|
|
app = FastAPI(
|
|
include_error_input=include_error_input, include_error_url=include_error_url
|
|
)
|
|
|
|
@app.get("/path1/{path_param}")
|
|
def path1(path_param: int):
|
|
return {"path_param": path_param}
|
|
|
|
@app.get("/path2/")
|
|
def path2(query_param: int):
|
|
return query_param
|
|
|
|
router = APIRouter(
|
|
include_error_input=include_error_input, include_error_url=include_error_url
|
|
)
|
|
|
|
@router.get("/path3/{path_param}")
|
|
def path3(path_param: int):
|
|
return {"path_param": path_param}
|
|
|
|
@router.get("/path4/")
|
|
def path4(query_param: int):
|
|
return query_param
|
|
|
|
app.include_router(router)
|
|
client = TestClient(app)
|
|
|
|
with client:
|
|
invalid = "not-an-integer"
|
|
|
|
for path in ["path1", "path3"]:
|
|
response = client.get(f"/{path}/{invalid}")
|
|
assert response.status_code == 422, response.text
|
|
error = response.json()["detail"][0]
|
|
if include_error_input:
|
|
assert error["input"] == invalid
|
|
else:
|
|
assert "input" not in error
|
|
if include_error_url:
|
|
assert "url" in error
|
|
else:
|
|
assert "url" not in error
|
|
|
|
for path in ["path2", "path4"]:
|
|
response = client.get(f"/{path}/")
|
|
assert response.status_code == 422, response.text
|
|
error = response.json()["detail"][0]
|
|
if include_error_input:
|
|
assert error["type"] == "missing"
|
|
assert error["input"] is None
|
|
else:
|
|
assert "input" not in error
|
|
if include_error_url:
|
|
assert "url" in error
|
|
else:
|
|
assert "url" not in error
|
|
|
|
response = client.get(f"/{path}/?query_param={invalid}")
|
|
assert response.status_code == 422, response.text
|
|
error = response.json()["detail"][0]
|
|
if include_error_input:
|
|
assert error["input"] == invalid
|
|
else:
|
|
assert "input" not in error
|
|
if include_error_url:
|
|
assert "url" in error
|
|
else:
|
|
assert "url" not in error
|
|
|