mirror of https://github.com/tiangolo/fastapi.git
103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
import pytest
|
|
from fastapi import FastAPI, Path
|
|
from fastapi.testclient import TestClient
|
|
from typing_extensions import Annotated
|
|
|
|
from tests.utils import needs_pydanticv2
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
@app.get("/required-str/{p}")
|
|
async def read_required_str(p: Annotated[str, Path()]):
|
|
return {"p": p}
|
|
|
|
|
|
@app.get("/required-alias/{p_alias}")
|
|
async def read_required_alias(p: Annotated[str, Path(alias="p_alias")]):
|
|
return {"p": p}
|
|
|
|
|
|
@app.get("/required-validation-alias/{p_val_alias}")
|
|
def read_required_validation_alias(
|
|
p: Annotated[str, Path(validation_alias="p_val_alias")],
|
|
):
|
|
return {"p": p} # pragma: no cover
|
|
|
|
|
|
@app.get("/required-alias-and-validation-alias/{p_val_alias}")
|
|
def read_required_alias_and_validation_alias(
|
|
p: Annotated[str, Path(alias="p_alias", validation_alias="p_val_alias")],
|
|
):
|
|
return {"p": p} # pragma: no cover
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("path", "expected_name", "expected_title"),
|
|
[
|
|
pytest.param("/required-str/{p}", "p", "P", id="required-str"),
|
|
pytest.param(
|
|
"/required-alias/{p_alias}", "p_alias", "P Alias", id="required-alias"
|
|
),
|
|
pytest.param(
|
|
"/required-validation-alias/{p_val_alias}",
|
|
"p_val_alias",
|
|
"P Val Alias",
|
|
id="required-validation-alias",
|
|
marks=(
|
|
needs_pydanticv2,
|
|
pytest.mark.xfail(raises=AssertionError, strict=False),
|
|
),
|
|
),
|
|
pytest.param(
|
|
"/required-alias-and-validation-alias/{p_val_alias}",
|
|
"p_val_alias",
|
|
"P Val Alias",
|
|
id="required-alias-and-validation-alias",
|
|
marks=(
|
|
needs_pydanticv2,
|
|
pytest.mark.xfail(raises=AssertionError, strict=False),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
def test_schema(path: str, expected_name: str, expected_title: str):
|
|
assert app.openapi()["paths"][path]["get"]["parameters"] == [
|
|
{
|
|
"required": True,
|
|
"schema": {"title": expected_title, "type": "string"},
|
|
"name": expected_name,
|
|
"in": "path",
|
|
}
|
|
]
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"path",
|
|
[
|
|
pytest.param("/required-str", id="required-str"),
|
|
pytest.param("/required-alias", id="required-alias"),
|
|
pytest.param(
|
|
"/required-validation-alias",
|
|
id="required-validation-alias",
|
|
marks=(
|
|
needs_pydanticv2,
|
|
pytest.mark.xfail(raises=AssertionError, strict=False),
|
|
),
|
|
),
|
|
pytest.param(
|
|
"/required-alias-and-validation-alias",
|
|
id="required-alias-and-validation-alias",
|
|
marks=(
|
|
needs_pydanticv2,
|
|
pytest.mark.xfail(raises=AssertionError, strict=False),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
def test_success(path: str):
|
|
client = TestClient(app)
|
|
response = client.get(f"{path}/hello")
|
|
assert response.status_code == 200, response.text
|
|
assert response.json() == {"p": "hello"}
|