diff --git a/tests/test_request_params/test_body/test_list.py b/tests/test_request_params/test_body/test_list.py index 77ffe503f..b7d66dc1c 100644 --- a/tests/test_request_params/test_body/test_list.py +++ b/tests/test_request_params/test_body/test_list.py @@ -6,6 +6,7 @@ from fastapi import Body, FastAPI from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,7 @@ app = FastAPI() @app.post("/required-list-str", operation_id="required_list_str") -async def read_required_list_str(p: List[str] = Body(..., embed=True)): +async def read_required_list_str(p: Annotated[List[str], Body(embed=True)]): return {"p": p} @@ -103,13 +104,13 @@ def test_required_list_str(path: str): @app.post("/required-list-alias", operation_id="required_list_alias") async def read_required_list_alias( - p: List[str] = Body(..., embed=True, alias="p_alias"), + p: Annotated[List[str], Body(embed=True, alias="p_alias")], ): return {"p": p} class FormModelRequiredListAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias") + p: List[str] = Field(alias="p_alias") @app.post("/model-required-list-alias", operation_id="model_required_list_alias") @@ -236,13 +237,13 @@ def test_required_list_alias_by_alias(path: str): "/required-list-validation-alias", operation_id="required_list_validation_alias" ) def read_required_list_validation_alias( - p: List[str] = Body(..., embed=True, validation_alias="p_val_alias"), + p: Annotated[List[str], Body(embed=True, validation_alias="p_val_alias")], ): return {"p": p} class FormModelRequiredListValidationAlias(BaseModel): - p: List[str] = Field(..., validation_alias="p_val_alias") + p: List[str] = Field(validation_alias="p_val_alias") @app.post( @@ -367,15 +368,15 @@ def test_required_list_validation_alias_by_validation_alias(path: str): operation_id="required_list_alias_and_validation_alias", ) def read_required_list_alias_and_validation_alias( - p: List[str] = Body( - ..., embed=True, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + List[str], Body(embed=True, alias="p_alias", validation_alias="p_val_alias") + ], ): return {"p": p} class FormModelRequiredListAliasAndValidationAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: List[str] = Field(alias="p_alias", validation_alias="p_val_alias") @app.post( diff --git a/tests/test_request_params/test_body/test_optional_list.py b/tests/test_request_params/test_body/test_optional_list.py index b31c49547..8b77dcd69 100644 --- a/tests/test_request_params/test_body/test_optional_list.py +++ b/tests/test_request_params/test_body/test_optional_list.py @@ -6,6 +6,7 @@ from fastapi import Body, FastAPI from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,9 @@ app = FastAPI() @app.post("/optional-list-str", operation_id="optional_list_str") -async def read_optional_list_str(p: Optional[List[str]] = Body(None, embed=True)): +async def read_optional_list_str( + p: Annotated[Optional[List[str]], Body(embed=True)] = None, +): return {"p": p} @@ -129,7 +132,7 @@ def test_optional_list_str(path: str): @app.post("/optional-list-alias", operation_id="optional_list_alias") async def read_optional_list_alias( - p: Optional[List[str]] = Body(None, embed=True, alias="p_alias"), + p: Annotated[Optional[List[str]], Body(embed=True, alias="p_alias")] = None, ): return {"p": p} @@ -269,7 +272,9 @@ def test_optional_list_alias_by_alias(path: str): "/optional-list-validation-alias", operation_id="optional_list_validation_alias" ) def read_optional_list_validation_alias( - p: Optional[List[str]] = Body(None, embed=True, validation_alias="p_val_alias"), + p: Annotated[ + Optional[List[str]], Body(embed=True, validation_alias="p_val_alias") + ] = None, ): return {"p": p} @@ -421,9 +426,10 @@ def test_optional_list_validation_alias_by_validation_alias(path: str): operation_id="optional_list_alias_and_validation_alias", ) def read_optional_list_alias_and_validation_alias( - p: Optional[List[str]] = Body( - None, embed=True, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[List[str]], + Body(embed=True, alias="p_alias", validation_alias="p_val_alias"), + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_body/test_optional_str.py b/tests/test_request_params/test_body/test_optional_str.py index 2efa595f9..5cfe62003 100644 --- a/tests/test_request_params/test_body/test_optional_str.py +++ b/tests/test_request_params/test_body/test_optional_str.py @@ -6,6 +6,7 @@ from fastapi import Body, FastAPI from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,7 @@ app = FastAPI() @app.post("/optional-str", operation_id="optional_str") -async def read_optional_str(p: Optional[str] = Body(None, embed=True)): +async def read_optional_str(p: Annotated[Optional[str], Body(embed=True)] = None): return {"p": p} @@ -126,7 +127,7 @@ def test_optional_str(path: str): @app.post("/optional-alias", operation_id="optional_alias") async def read_optional_alias( - p: Optional[str] = Body(None, embed=True, alias="p_alias"), + p: Annotated[Optional[str], Body(embed=True, alias="p_alias")] = None, ): return {"p": p} @@ -257,7 +258,9 @@ def test_optional_alias_by_alias(path: str): @app.post("/optional-validation-alias", operation_id="optional_validation_alias") def read_optional_validation_alias( - p: Optional[str] = Body(None, embed=True, validation_alias="p_val_alias"), + p: Annotated[ + Optional[str], Body(embed=True, validation_alias="p_val_alias") + ] = None, ): return {"p": p} @@ -402,9 +405,9 @@ def test_optional_validation_alias_by_validation_alias(path: str): operation_id="optional_alias_and_validation_alias", ) def read_optional_alias_and_validation_alias( - p: Optional[str] = Body( - None, embed=True, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[str], Body(embed=True, alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_body/test_required_str.py b/tests/test_request_params/test_body/test_required_str.py index f5faaaabf..12fc54a00 100644 --- a/tests/test_request_params/test_body/test_required_str.py +++ b/tests/test_request_params/test_body/test_required_str.py @@ -6,6 +6,7 @@ from fastapi import Body, FastAPI from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,7 @@ app = FastAPI() @app.post("/required-str", operation_id="required_str") -async def read_required_str(p: str = Body(..., embed=True)): +async def read_required_str(p: Annotated[str, Body(embed=True)]): return {"p": p} @@ -99,12 +100,14 @@ def test_required_str(path: str): @app.post("/required-alias", operation_id="required_alias") -async def read_required_alias(p: str = Body(..., embed=True, alias="p_alias")): +async def read_required_alias( + p: Annotated[str, Body(embed=True, alias="p_alias")], +): return {"p": p} class FormModelRequiredAlias(BaseModel): - p: str = Field(..., alias="p_alias") + p: str = Field(alias="p_alias") @app.post("/model-required-alias", operation_id="model_required_alias") @@ -225,13 +228,13 @@ def test_required_alias_by_alias(path: str): @app.post("/required-validation-alias", operation_id="required_validation_alias") def read_required_validation_alias( - p: str = Body(..., embed=True, validation_alias="p_val_alias"), + p: Annotated[str, Body(embed=True, validation_alias="p_val_alias")], ): return {"p": p} class FormModelRequiredValidationAlias(BaseModel): - p: str = Field(..., validation_alias="p_val_alias") + p: str = Field(validation_alias="p_val_alias") @app.post( @@ -354,13 +357,15 @@ def test_required_validation_alias_by_validation_alias(path: str): operation_id="required_alias_and_validation_alias", ) def read_required_alias_and_validation_alias( - p: str = Body(..., embed=True, alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + str, Body(embed=True, alias="p_alias", validation_alias="p_val_alias") + ], ): return {"p": p} class FormModelRequiredAliasAndValidationAlias(BaseModel): - p: str = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: str = Field(alias="p_alias", validation_alias="p_val_alias") @app.post( diff --git a/tests/test_request_params/test_cookie/test_optional_str.py b/tests/test_request_params/test_cookie/test_optional_str.py index 5dfa0d2a4..ad70bb2da 100644 --- a/tests/test_request_params/test_cookie/test_optional_str.py +++ b/tests/test_request_params/test_cookie/test_optional_str.py @@ -5,6 +5,7 @@ from dirty_equals import IsDict from fastapi import Cookie, FastAPI from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -15,7 +16,7 @@ app = FastAPI() @app.get("/optional-str") -async def read_optional_str(p: Optional[str] = Cookie(None)): +async def read_optional_str(p: Annotated[Optional[str], Cookie()] = None): return {"p": p} @@ -85,7 +86,9 @@ def test_optional_str(path: str): @app.get("/optional-alias") -async def read_optional_alias(p: Optional[str] = Cookie(None, alias="p_alias")): +async def read_optional_alias( + p: Annotated[Optional[str], Cookie(alias="p_alias")] = None, +): return {"p": p} @@ -174,7 +177,7 @@ def test_optional_alias_by_alias(path: str): @app.get("/optional-validation-alias") def read_optional_validation_alias( - p: Optional[str] = Cookie(None, validation_alias="p_val_alias"), + p: Annotated[Optional[str], Cookie(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -266,7 +269,9 @@ def test_optional_validation_alias_by_validation_alias(path: str): @app.get("/optional-alias-and-validation-alias") def read_optional_alias_and_validation_alias( - p: Optional[str] = Cookie(None, alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + Optional[str], Cookie(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_cookie/test_required_str.py b/tests/test_request_params/test_cookie/test_required_str.py index 1a9611a0b..d3fe06555 100644 --- a/tests/test_request_params/test_cookie/test_required_str.py +++ b/tests/test_request_params/test_cookie/test_required_str.py @@ -4,6 +4,7 @@ from fastapi import Cookie, FastAPI from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -14,7 +15,7 @@ app = FastAPI() @app.get("/required-str") -async def read_required_str(p: str = Cookie(...)): +async def read_required_str(p: Annotated[str, Cookie()]): return {"p": p} @@ -92,12 +93,12 @@ def test_required_str(path: str): @app.get("/required-alias") -async def read_required_alias(p: str = Cookie(..., alias="p_alias")): +async def read_required_alias(p: Annotated[str, Cookie(alias="p_alias")]): return {"p": p} class CookieModelRequiredAlias(BaseModel): - p: str = Field(..., alias="p_alias") + p: str = Field(alias="p_alias") @app.get("/model-required-alias") @@ -227,13 +228,13 @@ def test_required_alias_by_alias(path: str): @app.get("/required-validation-alias") def read_required_validation_alias( - p: str = Cookie(..., validation_alias="p_val_alias"), + p: Annotated[str, Cookie(validation_alias="p_val_alias")], ): return {"p": p} class CookieModelRequiredValidationAlias(BaseModel): - p: str = Field(..., validation_alias="p_val_alias") + p: str = Field(validation_alias="p_val_alias") @app.get("/model-required-validation-alias") @@ -349,13 +350,13 @@ def test_required_validation_alias_by_validation_alias(path: str): @app.get("/required-alias-and-validation-alias") def read_required_alias_and_validation_alias( - p: str = Cookie(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[str, Cookie(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class CookieModelRequiredAliasAndValidationAlias(BaseModel): - p: str = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: str = Field(alias="p_alias", validation_alias="p_val_alias") @app.get("/model-required-alias-and-validation-alias") diff --git a/tests/test_request_params/test_file/test_list.py b/tests/test_request_params/test_file/test_list.py index a11a39d80..198c9fdbd 100644 --- a/tests/test_request_params/test_file/test_list.py +++ b/tests/test_request_params/test_file/test_list.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, File, Form, UploadFile from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,17 +19,17 @@ app = FastAPI() @app.post("/list-bytes", operation_id="list_bytes") -async def read_list_bytes(p: List[bytes] = File(...)): +async def read_list_bytes(p: Annotated[List[bytes], File()]): return {"file_size": [len(file) for file in p]} @app.post("/list-uploadfile", operation_id="list_uploadfile") -async def read_list_uploadfile(p: List[UploadFile] = File(...)): +async def read_list_uploadfile(p: Annotated[List[UploadFile], File()]): return {"file_size": [file.size for file in p]} class FormModelListBytes(BaseModel): - p: List[bytes] = File(...) + p: List[bytes] = File() @app.post("/model-list-bytes", operation_id="model_list_bytes") @@ -41,7 +42,7 @@ async def read_model_list_bytes( class FormModelListUploadFile(BaseModel): - p: List[UploadFile] = File(...) + p: List[UploadFile] = File() @app.post("/model-list-uploadfile", operation_id="model_list_uploadfile") @@ -155,17 +156,19 @@ def test_list(path: str): @app.post("/list-bytes-alias", operation_id="list_bytes_alias") -async def read_list_bytes_alias(p: List[bytes] = File(..., alias="p_alias")): +async def read_list_bytes_alias(p: Annotated[List[bytes], File(alias="p_alias")]): return {"file_size": [len(file) for file in p]} @app.post("/list-uploadfile-alias", operation_id="list_uploadfile_alias") -async def read_list_uploadfile_alias(p: List[UploadFile] = File(..., alias="p_alias")): +async def read_list_uploadfile_alias( + p: Annotated[List[UploadFile], File(alias="p_alias")], +): return {"file_size": [file.size for file in p]} class FormModelListBytesAlias(BaseModel): - p: List[bytes] = File(..., alias="p_alias") + p: List[bytes] = File(alias="p_alias") @app.post("/model-list-bytes-alias", operation_id="model_list_bytes_alias") @@ -178,7 +181,7 @@ async def read_model_list_bytes_alias( class FormModelListUploadFileAlias(BaseModel): - p: List[UploadFile] = File(..., alias="p_alias") + p: List[UploadFile] = File(alias="p_alias") @app.post("/model-list-uploadfile-alias", operation_id="model_list_uploadfile_alias") @@ -390,7 +393,7 @@ def test_list_alias_by_alias(path: str): @app.post("/list-bytes-validation-alias", operation_id="list_bytes_validation_alias") def read_list_bytes_validation_alias( - p: List[bytes] = File(..., validation_alias="p_val_alias"), + p: Annotated[List[bytes], File(validation_alias="p_val_alias")], ): return {"file_size": [len(file) for file in p]} @@ -400,13 +403,13 @@ def read_list_bytes_validation_alias( operation_id="list_uploadfile_validation_alias", ) def read_list_uploadfile_validation_alias( - p: List[UploadFile] = File(..., validation_alias="p_val_alias"), + p: Annotated[List[UploadFile], File(validation_alias="p_val_alias")], ): return {"file_size": [file.size for file in p]} class FormModelRequiredBytesValidationAlias(BaseModel): - p: List[bytes] = File(..., validation_alias="p_val_alias") + p: List[bytes] = File(validation_alias="p_val_alias") @app.post( @@ -422,7 +425,7 @@ def read_model_list_bytes_validation_alias( class FormModelRequiredUploadFileValidationAlias(BaseModel): - p: List[UploadFile] = File(..., validation_alias="p_val_alias") + p: List[UploadFile] = File(validation_alias="p_val_alias") @app.post( @@ -586,7 +589,7 @@ def test_list_validation_alias_by_validation_alias(path: str): operation_id="list_bytes_alias_and_validation_alias", ) def read_list_bytes_alias_and_validation_alias( - p: List[bytes] = File(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[List[bytes], File(alias="p_alias", validation_alias="p_val_alias")], ): return {"file_size": [len(file) for file in p]} @@ -596,13 +599,15 @@ def read_list_bytes_alias_and_validation_alias( operation_id="list_uploadfile_alias_and_validation_alias", ) def read_list_uploadfile_alias_and_validation_alias( - p: List[UploadFile] = File(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + List[UploadFile], File(alias="p_alias", validation_alias="p_val_alias") + ], ): return {"file_size": [file.size for file in p]} class FormModelRequiredBytesAliasAndValidationAlias(BaseModel): - p: List[bytes] = File(..., alias="p_alias", validation_alias="p_val_alias") + p: List[bytes] = File(alias="p_alias", validation_alias="p_val_alias") @app.post( @@ -618,7 +623,7 @@ def read_model_list_bytes_alias_and_validation_alias( class FormModelRequiredUploadFileAliasAndValidationAlias(BaseModel): - p: List[UploadFile] = File(..., alias="p_alias", validation_alias="p_val_alias") + p: List[UploadFile] = File(alias="p_alias", validation_alias="p_val_alias") @app.post( diff --git a/tests/test_request_params/test_file/test_optional.py b/tests/test_request_params/test_file/test_optional.py index 7cd4614b1..9045dbb29 100644 --- a/tests/test_request_params/test_file/test_optional.py +++ b/tests/test_request_params/test_file/test_optional.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, File, Form, UploadFile from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,17 +19,17 @@ app = FastAPI() @app.post("/optional-bytes", operation_id="optional_bytes") -async def read_optional_bytes(p: Optional[bytes] = File(None)): +async def read_optional_bytes(p: Annotated[Optional[bytes], File()] = None): return {"file_size": len(p) if p else None} @app.post("/optional-uploadfile", operation_id="optional_uploadfile") -async def read_optional_uploadfile(p: Optional[UploadFile] = File(None)): +async def read_optional_uploadfile(p: Annotated[Optional[UploadFile], File()] = None): return {"file_size": p.size if p else None} class FormModelOptionalBytes(BaseModel): - p: Optional[bytes] = File(None) + p: Optional[bytes] = File(default=None) @app.post("/model-optional-bytes", operation_id="model_optional_bytes") @@ -41,7 +42,7 @@ async def read_model_optional_bytes( class FormModelOptionalUploadFile(BaseModel): - p: Optional[UploadFile] = File(None) + p: Optional[UploadFile] = File(default=None) @app.post("/model-optional-uploadfile", operation_id="model_optional_uploadfile") @@ -126,19 +127,21 @@ def test_optional(path: str): @app.post("/optional-bytes-alias", operation_id="optional_bytes_alias") -async def read_optional_bytes_alias(p: Optional[bytes] = File(None, alias="p_alias")): +async def read_optional_bytes_alias( + p: Annotated[Optional[bytes], File(alias="p_alias")] = None, +): return {"file_size": len(p) if p else None} @app.post("/optional-uploadfile-alias", operation_id="optional_uploadfile_alias") async def read_optional_uploadfile_alias( - p: Optional[UploadFile] = File(None, alias="p_alias"), + p: Annotated[Optional[UploadFile], File(alias="p_alias")] = None, ): return {"file_size": p.size if p else None} class FormModelOptionalBytesAlias(BaseModel): - p: Optional[bytes] = File(None, alias="p_alias") + p: Optional[bytes] = File(default=None, alias="p_alias") @app.post("/model-optional-bytes-alias", operation_id="model_optional_bytes_alias") @@ -151,7 +154,7 @@ async def read_model_optional_bytes_alias( class FormModelOptionalUploadFileAlias(BaseModel): - p: Optional[UploadFile] = File(None, alias="p_alias") + p: Optional[UploadFile] = File(default=None, alias="p_alias") @app.post( @@ -295,7 +298,7 @@ def test_optional_alias_by_alias(path: str): "/optional-bytes-validation-alias", operation_id="optional_bytes_validation_alias" ) def read_optional_bytes_validation_alias( - p: Optional[bytes] = File(None, validation_alias="p_val_alias"), + p: Annotated[Optional[bytes], File(validation_alias="p_val_alias")] = None, ): return {"file_size": len(p) if p else None} @@ -305,13 +308,13 @@ def read_optional_bytes_validation_alias( operation_id="optional_uploadfile_validation_alias", ) def read_optional_uploadfile_validation_alias( - p: Optional[UploadFile] = File(None, validation_alias="p_val_alias"), + p: Annotated[Optional[UploadFile], File(validation_alias="p_val_alias")] = None, ): return {"file_size": p.size if p else None} class FormModelOptionalBytesValidationAlias(BaseModel): - p: Optional[bytes] = File(None, validation_alias="p_val_alias") + p: Optional[bytes] = File(default=None, validation_alias="p_val_alias") @app.post( @@ -327,7 +330,7 @@ def read_model_optional_bytes_validation_alias( class FormModelOptionalUploadFileValidationAlias(BaseModel): - p: Optional[UploadFile] = File(None, validation_alias="p_val_alias") + p: Optional[UploadFile] = File(default=None, validation_alias="p_val_alias") @app.post( @@ -458,7 +461,9 @@ def test_optional_validation_alias_by_validation_alias(path: str): operation_id="optional_bytes_alias_and_validation_alias", ) def read_optional_bytes_alias_and_validation_alias( - p: Optional[bytes] = File(None, alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + Optional[bytes], File(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"file_size": len(p) if p else None} @@ -468,15 +473,17 @@ def read_optional_bytes_alias_and_validation_alias( operation_id="optional_uploadfile_alias_and_validation_alias", ) def read_optional_uploadfile_alias_and_validation_alias( - p: Optional[UploadFile] = File( - None, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[UploadFile], File(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"file_size": p.size if p else None} class FormModelOptionalBytesAliasAndValidationAlias(BaseModel): - p: Optional[bytes] = File(None, alias="p_alias", validation_alias="p_val_alias") + p: Optional[bytes] = File( + default=None, alias="p_alias", validation_alias="p_val_alias" + ) @app.post( @@ -493,7 +500,7 @@ def read_model_optional_bytes_alias_and_validation_alias( class FormModelOptionalUploadFileAliasAndValidationAlias(BaseModel): p: Optional[UploadFile] = File( - None, alias="p_alias", validation_alias="p_val_alias" + default=None, alias="p_alias", validation_alias="p_val_alias" ) diff --git a/tests/test_request_params/test_file/test_optional_list.py b/tests/test_request_params/test_file/test_optional_list.py index 825e25148..6525caaec 100644 --- a/tests/test_request_params/test_file/test_optional_list.py +++ b/tests/test_request_params/test_file/test_optional_list.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, File, Form, UploadFile from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,17 +19,19 @@ app = FastAPI() @app.post("/optional-list-bytes") -async def read_optional_list_bytes(p: Optional[List[bytes]] = File(None)): +async def read_optional_list_bytes(p: Annotated[Optional[List[bytes]], File()] = None): return {"file_size": [len(file) for file in p] if p else None} @app.post("/optional-list-uploadfile") -async def read_optional_list_uploadfile(p: Optional[List[UploadFile]] = File(None)): +async def read_optional_list_uploadfile( + p: Annotated[Optional[List[UploadFile]], File()] = None, +): return {"file_size": [file.size for file in p] if p else None} class FormModelOptionalListBytes(BaseModel): - p: Optional[List[bytes]] = File(None) + p: Optional[List[bytes]] = File(default=None) @app.post("/model-optional-list-bytes") @@ -41,7 +44,7 @@ async def read_model_optional_list_bytes( class FormModelOptionalListUploadFile(BaseModel): - p: Optional[List[UploadFile]] = File(None) + p: Optional[List[UploadFile]] = File(default=None) @app.post("/model-optional-list-uploadfile") @@ -150,20 +153,20 @@ def test_optional_list(path: str): @app.post("/optional-list-bytes-alias") async def read_optional_list_bytes_alias( - p: Optional[List[bytes]] = File(None, alias="p_alias"), + p: Annotated[Optional[List[bytes]], File(alias="p_alias")] = None, ): return {"file_size": [len(file) for file in p] if p else None} @app.post("/optional-list-uploadfile-alias") async def read_optional_list_uploadfile_alias( - p: Optional[List[UploadFile]] = File(None, alias="p_alias"), + p: Annotated[Optional[List[UploadFile]], File(alias="p_alias")] = None, ): return {"file_size": [file.size for file in p] if p else None} class FormModelOptionalListBytesAlias(BaseModel): - p: Optional[List[bytes]] = File(None, alias="p_alias") + p: Optional[List[bytes]] = File(default=None, alias="p_alias") @app.post("/model-optional-list-bytes-alias") @@ -176,7 +179,7 @@ async def read_model_optional_list_bytes_alias( class FormModelOptionalListUploadFileAlias(BaseModel): - p: Optional[List[UploadFile]] = File(None, alias="p_alias") + p: Optional[List[UploadFile]] = File(default=None, alias="p_alias") @app.post("/model-optional-list-uploadfile-alias") @@ -335,20 +338,22 @@ def test_optional_list_alias_by_alias(path: str): @app.post("/optional-list-bytes-validation-alias") def read_optional_list_bytes_validation_alias( - p: Optional[List[bytes]] = File(None, validation_alias="p_val_alias"), + p: Annotated[Optional[List[bytes]], File(validation_alias="p_val_alias")] = None, ): return {"file_size": [len(file) for file in p] if p else None} @app.post("/optional-list-uploadfile-validation-alias") def read_optional_list_uploadfile_validation_alias( - p: Optional[List[UploadFile]] = File(None, validation_alias="p_val_alias"), + p: Annotated[ + Optional[List[UploadFile]], File(validation_alias="p_val_alias") + ] = None, ): return {"file_size": [file.size for file in p] if p else None} class FormModelOptionalListBytesValidationAlias(BaseModel): - p: Optional[List[bytes]] = File(None, validation_alias="p_val_alias") + p: Optional[List[bytes]] = File(default=None, validation_alias="p_val_alias") @app.post("/model-optional-list-bytes-validation-alias") @@ -361,7 +366,7 @@ def read_model_optional_list_bytes_validation_alias( class FormModelOptionalListUploadFileValidationAlias(BaseModel): - p: Optional[List[UploadFile]] = File(None, validation_alias="p_val_alias") + p: Optional[List[UploadFile]] = File(default=None, validation_alias="p_val_alias") @app.post("/model-optional-list-uploadfile-validation-alias") @@ -500,25 +505,26 @@ def test_optional_validation_alias_by_validation_alias(path: str): @app.post("/optional-list-bytes-alias-and-validation-alias") def read_optional_list_bytes_alias_and_validation_alias( - p: Optional[List[bytes]] = File( - None, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[List[bytes]], File(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"file_size": [len(file) for file in p] if p else None} @app.post("/optional-list-uploadfile-alias-and-validation-alias") def read_optional_list_uploadfile_alias_and_validation_alias( - p: Optional[List[UploadFile]] = File( - None, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[List[UploadFile]], + File(alias="p_alias", validation_alias="p_val_alias"), + ] = None, ): return {"file_size": [file.size for file in p] if p else None} class FormModelOptionalListBytesAliasAndValidationAlias(BaseModel): p: Optional[List[bytes]] = File( - None, alias="p_alias", validation_alias="p_val_alias" + default=None, alias="p_alias", validation_alias="p_val_alias" ) @@ -533,7 +539,7 @@ def read_model_optional_list_bytes_alias_and_validation_alias( class FormModelOptionalListUploadFileAliasAndValidationAlias(BaseModel): p: Optional[List[UploadFile]] = File( - None, alias="p_alias", validation_alias="p_val_alias" + default=None, alias="p_alias", validation_alias="p_val_alias" ) diff --git a/tests/test_request_params/test_file/test_required.py b/tests/test_request_params/test_file/test_required.py index 485916707..23bbdd4cf 100644 --- a/tests/test_request_params/test_file/test_required.py +++ b/tests/test_request_params/test_file/test_required.py @@ -4,6 +4,7 @@ from fastapi import FastAPI, File, Form, UploadFile from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -16,17 +17,17 @@ app = FastAPI() @app.post("/required-bytes", operation_id="required_bytes") -async def read_required_bytes(p: bytes = File(...)): +async def read_required_bytes(p: Annotated[bytes, File()]): return {"file_size": len(p)} @app.post("/required-uploadfile", operation_id="required_uploadfile") -async def read_required_uploadfile(p: UploadFile = File(...)): +async def read_required_uploadfile(p: Annotated[UploadFile, File()]): return {"file_size": p.size} class FormModelRequiredBytes(BaseModel): - p: bytes = File(...) + p: bytes = File() @app.post("/model-required-bytes", operation_id="model_required_bytes") @@ -39,7 +40,7 @@ async def read_model_required_bytes( class FormModelRequiredUploadFile(BaseModel): - p: UploadFile = File(...) + p: UploadFile = File() @app.post("/model-required-uploadfile", operation_id="model_required_uploadfile") @@ -133,17 +134,19 @@ def test_required(path: str): @app.post("/required-bytes-alias", operation_id="required_bytes_alias") -async def read_required_bytes_alias(p: bytes = File(..., alias="p_alias")): +async def read_required_bytes_alias(p: Annotated[bytes, File(alias="p_alias")]): return {"file_size": len(p)} @app.post("/required-uploadfile-alias", operation_id="required_uploadfile_alias") -async def read_required_uploadfile_alias(p: UploadFile = File(..., alias="p_alias")): +async def read_required_uploadfile_alias( + p: Annotated[UploadFile, File(alias="p_alias")], +): return {"file_size": p.size} class FormModelRequiredBytesAlias(BaseModel): - p: bytes = File(..., alias="p_alias") + p: bytes = File(alias="p_alias") @app.post("/model-required-bytes-alias", operation_id="model_required_bytes_alias") @@ -156,7 +159,7 @@ async def read_model_required_bytes_alias( class FormModelRequiredUploadFileAlias(BaseModel): - p: UploadFile = File(..., alias="p_alias") + p: UploadFile = File(alias="p_alias") @app.post( @@ -353,7 +356,7 @@ def test_required_alias_by_alias(path: str): "/required-bytes-validation-alias", operation_id="required_bytes_validation_alias" ) def read_required_bytes_validation_alias( - p: bytes = File(..., validation_alias="p_val_alias"), + p: Annotated[bytes, File(validation_alias="p_val_alias")], ): return {"file_size": len(p)} @@ -363,13 +366,13 @@ def read_required_bytes_validation_alias( operation_id="required_uploadfile_validation_alias", ) def read_required_uploadfile_validation_alias( - p: UploadFile = File(..., validation_alias="p_val_alias"), + p: Annotated[UploadFile, File(validation_alias="p_val_alias")], ): return {"file_size": p.size} class FormModelRequiredBytesValidationAlias(BaseModel): - p: bytes = File(..., validation_alias="p_val_alias") + p: bytes = File(validation_alias="p_val_alias") @app.post( @@ -385,7 +388,7 @@ def read_model_required_bytes_validation_alias( class FormModelRequiredUploadFileValidationAlias(BaseModel): - p: UploadFile = File(..., validation_alias="p_val_alias") + p: UploadFile = File(validation_alias="p_val_alias") @app.post( @@ -540,7 +543,7 @@ def test_required_validation_alias_by_validation_alias(path: str): operation_id="required_bytes_alias_and_validation_alias", ) def read_required_bytes_alias_and_validation_alias( - p: bytes = File(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[bytes, File(alias="p_alias", validation_alias="p_val_alias")], ): return {"file_size": len(p)} @@ -550,13 +553,13 @@ def read_required_bytes_alias_and_validation_alias( operation_id="required_uploadfile_alias_and_validation_alias", ) def read_required_uploadfile_alias_and_validation_alias( - p: UploadFile = File(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[UploadFile, File(alias="p_alias", validation_alias="p_val_alias")], ): return {"file_size": p.size} class FormModelRequiredBytesAliasAndValidationAlias(BaseModel): - p: bytes = File(..., alias="p_alias", validation_alias="p_val_alias") + p: bytes = File(alias="p_alias", validation_alias="p_val_alias") @app.post( @@ -572,7 +575,7 @@ def read_model_required_bytes_alias_and_validation_alias( class FormModelRequiredUploadFileAliasAndValidationAlias(BaseModel): - p: UploadFile = File(..., alias="p_alias", validation_alias="p_val_alias") + p: UploadFile = File(alias="p_alias", validation_alias="p_val_alias") @app.post( diff --git a/tests/test_request_params/test_form/test_list.py b/tests/test_request_params/test_form/test_list.py index 14a494913..16c2a14ad 100644 --- a/tests/test_request_params/test_form/test_list.py +++ b/tests/test_request_params/test_form/test_list.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, Form from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,7 @@ app = FastAPI() @app.post("/required-list-str", operation_id="required_list_str") -async def read_required_list_str(p: List[str] = Form(...)): +async def read_required_list_str(p: Annotated[List[str], Form()]): return {"p": p} @@ -101,12 +102,12 @@ def test_required_list_str(path: str): @app.post("/required-list-alias", operation_id="required_list_alias") -async def read_required_list_alias(p: List[str] = Form(..., alias="p_alias")): +async def read_required_list_alias(p: Annotated[List[str], Form(alias="p_alias")]): return {"p": p} class FormModelRequiredListAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias") + p: List[str] = Field(alias="p_alias") @app.post("/model-required-list-alias", operation_id="model_required_list_alias") @@ -245,13 +246,13 @@ def test_required_list_alias_by_alias(path: str): "/required-list-validation-alias", operation_id="required_list_validation_alias" ) def read_required_list_validation_alias( - p: List[str] = Form(..., validation_alias="p_val_alias"), + p: Annotated[List[str], Form(validation_alias="p_val_alias")], ): return {"p": p} class FormModelRequiredListValidationAlias(BaseModel): - p: List[str] = Field(..., validation_alias="p_val_alias") + p: List[str] = Field(validation_alias="p_val_alias") @app.post( @@ -370,13 +371,13 @@ def test_required_list_validation_alias_by_validation_alias(path: str): operation_id="required_list_alias_and_validation_alias", ) def read_required_list_alias_and_validation_alias( - p: List[str] = Form(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[List[str], Form(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class FormModelRequiredListAliasAndValidationAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: List[str] = Field(alias="p_alias", validation_alias="p_val_alias") @app.post( diff --git a/tests/test_request_params/test_form/test_optional_list.py b/tests/test_request_params/test_form/test_optional_list.py index 5a7e844a7..fd09fe4fd 100644 --- a/tests/test_request_params/test_form/test_optional_list.py +++ b/tests/test_request_params/test_form/test_optional_list.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, Form from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,9 @@ app = FastAPI() @app.post("/optional-list-str", operation_id="optional_list_str") -async def read_optional_list_str(p: Optional[List[str]] = Form(None)): +async def read_optional_list_str( + p: Annotated[Optional[List[str]], Form()] = None, +): return {"p": p} @@ -93,7 +96,7 @@ def test_optional_list_str(path: str): @app.post("/optional-list-alias", operation_id="optional_list_alias") async def read_optional_list_alias( - p: Optional[List[str]] = Form(None, alias="p_alias"), + p: Annotated[Optional[List[str]], Form(alias="p_alias")] = None, ): return {"p": p} @@ -197,7 +200,7 @@ def test_optional_list_alias_by_alias(path: str): "/optional-list-validation-alias", operation_id="optional_list_validation_alias" ) def read_optional_list_validation_alias( - p: Optional[List[str]] = Form(None, validation_alias="p_val_alias"), + p: Annotated[Optional[List[str]], Form(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -311,9 +314,9 @@ def test_optional_list_validation_alias_by_validation_alias(path: str): operation_id="optional_list_alias_and_validation_alias", ) def read_optional_list_alias_and_validation_alias( - p: Optional[List[str]] = Form( - None, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[List[str]], Form(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_form/test_optional_str.py b/tests/test_request_params/test_form/test_optional_str.py index 2d2d01282..16dd8983d 100644 --- a/tests/test_request_params/test_form/test_optional_str.py +++ b/tests/test_request_params/test_form/test_optional_str.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, Form from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -18,7 +19,7 @@ app = FastAPI() @app.post("/optional-str", operation_id="optional_str") -async def read_optional_str(p: Optional[str] = Form(None)): +async def read_optional_str(p: Annotated[Optional[str], Form()] = None): return {"p": p} @@ -89,7 +90,9 @@ def test_optional_str(path: str): @app.post("/optional-alias", operation_id="optional_alias") -async def read_optional_alias(p: Optional[str] = Form(None, alias="p_alias")): +async def read_optional_alias( + p: Annotated[Optional[str], Form(alias="p_alias")] = None, +): return {"p": p} @@ -183,7 +186,7 @@ def test_optional_alias_by_alias(path: str): @app.post("/optional-validation-alias", operation_id="optional_validation_alias") def read_optional_validation_alias( - p: Optional[str] = Form(None, validation_alias="p_val_alias"), + p: Annotated[Optional[str], Form(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -290,7 +293,9 @@ def test_optional_validation_alias_by_validation_alias(path: str): operation_id="optional_alias_and_validation_alias", ) def read_optional_alias_and_validation_alias( - p: Optional[str] = Form(None, alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + Optional[str], Form(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_form/test_required_str.py b/tests/test_request_params/test_form/test_required_str.py index cff8a9bfd..973243ae1 100644 --- a/tests/test_request_params/test_form/test_required_str.py +++ b/tests/test_request_params/test_form/test_required_str.py @@ -4,6 +4,7 @@ from fastapi import FastAPI, Form from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -16,7 +17,7 @@ app = FastAPI() @app.post("/required-str", operation_id="required_str") -async def read_required_str(p: str = Form(...)): +async def read_required_str(p: Annotated[str, Form()]): return {"p": p} @@ -96,12 +97,12 @@ def test_required_str(path: str): @app.post("/required-alias", operation_id="required_alias") -async def read_required_alias(p: str = Form(..., alias="p_alias")): +async def read_required_alias(p: Annotated[str, Form(alias="p_alias")]): return {"p": p} class FormModelRequiredAlias(BaseModel): - p: str = Field(..., alias="p_alias") + p: str = Field(alias="p_alias") @app.post("/model-required-alias", operation_id="model_required_alias") @@ -221,13 +222,13 @@ def test_required_alias_by_alias(path: str): @app.post("/required-validation-alias", operation_id="required_validation_alias") def read_required_validation_alias( - p: str = Form(..., validation_alias="p_val_alias"), + p: Annotated[str, Form(validation_alias="p_val_alias")], ): return {"p": p} class FormModelRequiredValidationAlias(BaseModel): - p: str = Field(..., validation_alias="p_val_alias") + p: str = Field(validation_alias="p_val_alias") @app.post( @@ -348,13 +349,13 @@ def test_required_validation_alias_by_validation_alias(path: str): operation_id="required_alias_and_validation_alias", ) def read_required_alias_and_validation_alias( - p: str = Form(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[str, Form(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class FormModelRequiredAliasAndValidationAlias(BaseModel): - p: str = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: str = Field(alias="p_alias", validation_alias="p_val_alias") @app.post( diff --git a/tests/test_request_params/test_header/test_list.py b/tests/test_request_params/test_header/test_list.py index 82944f1ce..b05783641 100644 --- a/tests/test_request_params/test_header/test_list.py +++ b/tests/test_request_params/test_header/test_list.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, Header from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -16,7 +17,7 @@ app = FastAPI() @app.get("/required-list-str") -async def read_required_list_str(p: List[str] = Header(...)): +async def read_required_list_str(p: Annotated[List[str], Header()]): return {"p": p} @@ -96,12 +97,12 @@ def test_required_list_str(path: str): @app.get("/required-list-alias") -async def read_required_list_alias(p: List[str] = Header(..., alias="p_alias")): +async def read_required_list_alias(p: Annotated[List[str], Header(alias="p_alias")]): return {"p": p} class HeaderModelRequiredListAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias") + p: List[str] = Field(alias="p_alias") @app.get("/model-required-list-alias") @@ -232,13 +233,13 @@ def test_required_list_alias_by_alias(path: str): @app.get("/required-list-validation-alias") def read_required_list_validation_alias( - p: List[str] = Header(..., validation_alias="p_val_alias"), + p: Annotated[List[str], Header(validation_alias="p_val_alias")], ): return {"p": p} class HeaderModelRequiredListValidationAlias(BaseModel): - p: List[str] = Field(..., validation_alias="p_val_alias") + p: List[str] = Field(validation_alias="p_val_alias") @app.get("/model-required-list-validation-alias") @@ -349,13 +350,13 @@ def test_required_list_validation_alias_by_validation_alias(path: str): @app.get("/required-list-alias-and-validation-alias") def read_required_list_alias_and_validation_alias( - p: List[str] = Header(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[List[str], Header(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class HeaderModelRequiredListAliasAndValidationAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: List[str] = Field(alias="p_alias", validation_alias="p_val_alias") @app.get("/model-required-list-alias-and-validation-alias") diff --git a/tests/test_request_params/test_header/test_optional_list.py b/tests/test_request_params/test_header/test_optional_list.py index 67c71c2c0..1c4c2e508 100644 --- a/tests/test_request_params/test_header/test_optional_list.py +++ b/tests/test_request_params/test_header/test_optional_list.py @@ -5,6 +5,7 @@ from dirty_equals import IsDict from fastapi import FastAPI, Header from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -15,7 +16,9 @@ app = FastAPI() @app.get("/optional-list-str") -async def read_optional_list_str(p: Optional[List[str]] = Header(None)): +async def read_optional_list_str( + p: Annotated[Optional[List[str]], Header()] = None, +): return {"p": p} @@ -88,7 +91,7 @@ def test_optional_list_str(path: str): @app.get("/optional-list-alias") async def read_optional_list_alias( - p: Optional[List[str]] = Header(None, alias="p_alias"), + p: Annotated[Optional[List[str]], Header(alias="p_alias")] = None, ): return {"p": p} @@ -185,7 +188,7 @@ def test_optional_list_alias_by_alias(path: str): @app.get("/optional-list-validation-alias") def read_optional_list_validation_alias( - p: Optional[List[str]] = Header(None, validation_alias="p_val_alias"), + p: Annotated[Optional[List[str]], Header(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -279,9 +282,9 @@ def test_optional_list_validation_alias_by_validation_alias(path: str): @app.get("/optional-list-alias-and-validation-alias") def read_optional_list_alias_and_validation_alias( - p: Optional[List[str]] = Header( - None, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[List[str]], Header(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_header/test_optional_str.py b/tests/test_request_params/test_header/test_optional_str.py index cd8daf55f..2fb5b1316 100644 --- a/tests/test_request_params/test_header/test_optional_str.py +++ b/tests/test_request_params/test_header/test_optional_str.py @@ -5,6 +5,7 @@ from dirty_equals import IsDict from fastapi import FastAPI, Header from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -15,7 +16,7 @@ app = FastAPI() @app.get("/optional-str") -async def read_optional_str(p: Optional[str] = Header(None)): +async def read_optional_str(p: Annotated[Optional[str], Header()] = None): return {"p": p} @@ -84,7 +85,9 @@ def test_optional_str(path: str): @app.get("/optional-alias") -async def read_optional_alias(p: Optional[str] = Header(None, alias="p_alias")): +async def read_optional_alias( + p: Annotated[Optional[str], Header(alias="p_alias")] = None, +): return {"p": p} @@ -171,7 +174,7 @@ def test_optional_alias_by_alias(path: str): @app.get("/optional-validation-alias") def read_optional_validation_alias( - p: Optional[str] = Header(None, validation_alias="p_val_alias"), + p: Annotated[Optional[str], Header(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -261,7 +264,9 @@ def test_optional_validation_alias_by_validation_alias(path: str): @app.get("/optional-alias-and-validation-alias") def read_optional_alias_and_validation_alias( - p: Optional[str] = Header(None, alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + Optional[str], Header(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_header/test_required_str.py b/tests/test_request_params/test_header/test_required_str.py index 3f348b19b..5e37c2aec 100644 --- a/tests/test_request_params/test_header/test_required_str.py +++ b/tests/test_request_params/test_header/test_required_str.py @@ -4,6 +4,7 @@ from fastapi import FastAPI, Header from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -14,7 +15,7 @@ app = FastAPI() @app.get("/required-str") -async def read_required_str(p: str = Header(...)): +async def read_required_str(p: Annotated[str, Header()]): return {"p": p} @@ -91,12 +92,12 @@ def test_required_str(path: str): @app.get("/required-alias") -async def read_required_alias(p: str = Header(..., alias="p_alias")): +async def read_required_alias(p: Annotated[str, Header(alias="p_alias")]): return {"p": p} class HeaderModelRequiredAlias(BaseModel): - p: str = Field(..., alias="p_alias") + p: str = Field(alias="p_alias") @app.get("/model-required-alias") @@ -221,13 +222,13 @@ def test_required_alias_by_alias(path: str): @app.get("/required-validation-alias") def read_required_validation_alias( - p: str = Header(..., validation_alias="p_val_alias"), + p: Annotated[str, Header(validation_alias="p_val_alias")], ): return {"p": p} class HeaderModelRequiredValidationAlias(BaseModel): - p: str = Field(..., validation_alias="p_val_alias") + p: str = Field(validation_alias="p_val_alias") @app.get("/model-required-validation-alias") @@ -341,13 +342,13 @@ def test_required_validation_alias_by_validation_alias(path: str): @app.get("/required-alias-and-validation-alias") def read_required_alias_and_validation_alias( - p: str = Header(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[str, Header(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class HeaderModelRequiredAliasAndValidationAlias(BaseModel): - p: str = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: str = Field(alias="p_alias", validation_alias="p_val_alias") @app.get("/model-required-alias-and-validation-alias") diff --git a/tests/test_request_params/test_path/test_required_str.py b/tests/test_request_params/test_path/test_required_str.py index 54a74aea6..8e2e60004 100644 --- a/tests/test_request_params/test_path/test_required_str.py +++ b/tests/test_request_params/test_path/test_required_str.py @@ -1,6 +1,7 @@ import pytest from fastapi import FastAPI, Path from fastapi.testclient import TestClient +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -8,25 +9,25 @@ app = FastAPI() @app.get("/required-str/{p}") -async def read_required_str(p: str = Path(...)): +async def read_required_str(p: Annotated[str, Path()]): return {"p": p} @app.get("/required-alias/{p_alias}") -async def read_required_alias(p: str = Path(..., 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: str = Path(..., validation_alias="p_val_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: str = Path(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[str, Path(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} # pragma: no cover diff --git a/tests/test_request_params/test_query/test_list.py b/tests/test_request_params/test_query/test_list.py index 840c1a5dc..dca78d64c 100644 --- a/tests/test_request_params/test_query/test_list.py +++ b/tests/test_request_params/test_query/test_list.py @@ -6,6 +6,7 @@ from fastapi import FastAPI, Query from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -16,7 +17,7 @@ app = FastAPI() @app.get("/required-list-str") -async def read_required_list_str(p: List[str] = Query(...)): +async def read_required_list_str(p: Annotated[List[str], Query()]): return {"p": p} @@ -96,12 +97,12 @@ def test_required_list_str(path: str): @app.get("/required-list-alias") -async def read_required_list_alias(p: List[str] = Query(..., alias="p_alias")): +async def read_required_list_alias(p: Annotated[List[str], Query(alias="p_alias")]): return {"p": p} class QueryModelRequiredListAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias") + p: List[str] = Field(alias="p_alias") @app.get("/model-required-list-alias") @@ -232,13 +233,13 @@ def test_required_list_alias_by_alias(path: str): @app.get("/required-list-validation-alias") def read_required_list_validation_alias( - p: List[str] = Query(..., validation_alias="p_val_alias"), + p: Annotated[List[str], Query(validation_alias="p_val_alias")], ): return {"p": p} class QueryModelRequiredListValidationAlias(BaseModel): - p: List[str] = Field(..., validation_alias="p_val_alias") + p: List[str] = Field(validation_alias="p_val_alias") @app.get("/model-required-list-validation-alias") @@ -347,13 +348,13 @@ def test_required_list_validation_alias_by_validation_alias(path: str): @app.get("/required-list-alias-and-validation-alias") def read_required_list_alias_and_validation_alias( - p: List[str] = Query(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[List[str], Query(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class QueryModelRequiredListAliasAndValidationAlias(BaseModel): - p: List[str] = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: List[str] = Field(alias="p_alias", validation_alias="p_val_alias") @app.get("/model-required-list-alias-and-validation-alias") diff --git a/tests/test_request_params/test_query/test_optional_list.py b/tests/test_request_params/test_query/test_optional_list.py index f1350827f..0e8613349 100644 --- a/tests/test_request_params/test_query/test_optional_list.py +++ b/tests/test_request_params/test_query/test_optional_list.py @@ -5,6 +5,7 @@ from dirty_equals import IsDict from fastapi import FastAPI, Query from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -15,7 +16,9 @@ app = FastAPI() @app.get("/optional-list-str") -async def read_optional_list_str(p: Optional[List[str]] = Query(None)): +async def read_optional_list_str( + p: Annotated[Optional[List[str]], Query()] = None, +): return {"p": p} @@ -88,7 +91,7 @@ def test_optional_list_str(path: str): @app.get("/optional-list-alias") async def read_optional_list_alias( - p: Optional[List[str]] = Query(None, alias="p_alias"), + p: Annotated[Optional[List[str]], Query(alias="p_alias")] = None, ): return {"p": p} @@ -185,7 +188,7 @@ def test_optional_list_alias_by_alias(path: str): @app.get("/optional-list-validation-alias") def read_optional_list_validation_alias( - p: Optional[List[str]] = Query(None, validation_alias="p_val_alias"), + p: Annotated[Optional[List[str]], Query(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -277,9 +280,9 @@ def test_optional_list_validation_alias_by_validation_alias(path: str): @app.get("/optional-list-alias-and-validation-alias") def read_optional_list_alias_and_validation_alias( - p: Optional[List[str]] = Query( - None, alias="p_alias", validation_alias="p_val_alias" - ), + p: Annotated[ + Optional[List[str]], Query(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_query/test_optional_str.py b/tests/test_request_params/test_query/test_optional_str.py index 71c424c6f..af47117a8 100644 --- a/tests/test_request_params/test_query/test_optional_str.py +++ b/tests/test_request_params/test_query/test_optional_str.py @@ -5,6 +5,7 @@ from dirty_equals import IsDict from fastapi import FastAPI, Query from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -84,7 +85,9 @@ def test_optional_str(path: str): @app.get("/optional-alias") -async def read_optional_alias(p: Optional[str] = Query(None, alias="p_alias")): +async def read_optional_alias( + p: Annotated[Optional[str], Query(alias="p_alias")] = None, +): return {"p": p} @@ -171,7 +174,7 @@ def test_optional_alias_by_alias(path: str): @app.get("/optional-validation-alias") def read_optional_validation_alias( - p: Optional[str] = Query(None, validation_alias="p_val_alias"), + p: Annotated[Optional[str], Query(validation_alias="p_val_alias")] = None, ): return {"p": p} @@ -261,7 +264,9 @@ def test_optional_validation_alias_by_validation_alias(path: str): @app.get("/optional-alias-and-validation-alias") def read_optional_alias_and_validation_alias( - p: Optional[str] = Query(None, alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[ + Optional[str], Query(alias="p_alias", validation_alias="p_val_alias") + ] = None, ): return {"p": p} diff --git a/tests/test_request_params/test_query/test_required_str.py b/tests/test_request_params/test_query/test_required_str.py index d55bb950d..35fbd4324 100644 --- a/tests/test_request_params/test_query/test_required_str.py +++ b/tests/test_request_params/test_query/test_required_str.py @@ -4,6 +4,7 @@ from fastapi import FastAPI, Query from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient from pydantic import BaseModel, Field +from typing_extensions import Annotated from tests.utils import needs_pydanticv2 @@ -91,12 +92,12 @@ def test_required_str(path: str): @app.get("/required-alias") -async def read_required_alias(p: str = Query(..., alias="p_alias")): +async def read_required_alias(p: Annotated[str, Query(alias="p_alias")]): return {"p": p} class QueryModelRequiredAlias(BaseModel): - p: str = Field(..., alias="p_alias") + p: str = Field(alias="p_alias") @app.get("/model-required-alias") @@ -224,13 +225,13 @@ def test_required_alias_by_alias(path: str): @app.get("/required-validation-alias") def read_required_validation_alias( - p: str = Query(..., validation_alias="p_val_alias"), + p: Annotated[str, Query(validation_alias="p_val_alias")], ): return {"p": p} class QueryModelRequiredValidationAlias(BaseModel): - p: str = Field(..., validation_alias="p_val_alias") + p: str = Field(validation_alias="p_val_alias") @app.get("/model-required-validation-alias") @@ -344,13 +345,13 @@ def test_required_validation_alias_by_validation_alias(path: str): @app.get("/required-alias-and-validation-alias") def read_required_alias_and_validation_alias( - p: str = Query(..., alias="p_alias", validation_alias="p_val_alias"), + p: Annotated[str, Query(alias="p_alias", validation_alias="p_val_alias")], ): return {"p": p} class QueryModelRequiredAliasAndValidationAlias(BaseModel): - p: str = Field(..., alias="p_alias", validation_alias="p_val_alias") + p: str = Field(alias="p_alias", validation_alias="p_val_alias") @app.get("/model-required-alias-and-validation-alias")