|
|
|
@ -1,9 +1,8 @@ |
|
|
|
import pytest |
|
|
|
from dirty_equals import IsDict, IsOneOf, IsPartialDict |
|
|
|
from fastapi import FastAPI, File, Form, UploadFile |
|
|
|
from dirty_equals import IsDict |
|
|
|
from fastapi import FastAPI, File, 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 |
|
|
|
@ -26,45 +25,11 @@ async def read_required_uploadfile(p: Annotated[UploadFile, File()]): |
|
|
|
return {"file_size": p.size} |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredBytes(BaseModel): |
|
|
|
p: bytes = File() |
|
|
|
|
|
|
|
|
|
|
|
@app.post("/model-required-bytes", operation_id="model_required_bytes") |
|
|
|
async def read_model_required_bytes( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredBytes, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": len(p.p)} |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredUploadFile(BaseModel): |
|
|
|
p: UploadFile = File() |
|
|
|
|
|
|
|
|
|
|
|
@app.post("/model-required-uploadfile", operation_id="model_required_uploadfile") |
|
|
|
async def read_model_required_uploadfile( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredUploadFile, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": p.p.size} |
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize( |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes", |
|
|
|
"/model-required-bytes", |
|
|
|
"/required-uploadfile", |
|
|
|
"/model-required-uploadfile", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_schema(path: str): |
|
|
|
@ -85,9 +50,7 @@ def test_required_schema(path: str): |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes", |
|
|
|
"/model-required-bytes", |
|
|
|
"/required-uploadfile", |
|
|
|
"/model-required-uploadfile", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_missing(path: str): |
|
|
|
@ -101,7 +64,7 @@ def test_required_missing(path: str): |
|
|
|
"type": "missing", |
|
|
|
"loc": ["body", "p"], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf(None, {}), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -123,9 +86,7 @@ def test_required_missing(path: str): |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes", |
|
|
|
"/model-required-bytes", |
|
|
|
"/required-uploadfile", |
|
|
|
"/model-required-uploadfile", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required(path: str): |
|
|
|
@ -151,40 +112,6 @@ async def read_required_uploadfile_alias( |
|
|
|
return {"file_size": p.size} |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredBytesAlias(BaseModel): |
|
|
|
p: bytes = File(alias="p_alias") |
|
|
|
|
|
|
|
|
|
|
|
@app.post("/model-required-bytes-alias", operation_id="model_required_bytes_alias") |
|
|
|
async def read_model_required_bytes_alias( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredBytesAlias, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": len(p.p)} |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredUploadFileAlias(BaseModel): |
|
|
|
p: UploadFile = File(alias="p_alias") |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
|
|
"/model-required-uploadfile-alias", operation_id="model_required_uploadfile_alias" |
|
|
|
) |
|
|
|
async def read_model_required_uploadfile_alias( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredUploadFileAlias, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": p.p.size} |
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
@ -195,9 +122,7 @@ async def read_model_required_uploadfile_alias( |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes-alias", |
|
|
|
"/model-required-bytes-alias", |
|
|
|
"/required-uploadfile-alias", |
|
|
|
"/model-required-uploadfile-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_schema(path: str): |
|
|
|
@ -218,25 +143,7 @@ def test_required_alias_schema(path: str): |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes-alias", |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-alias", |
|
|
|
marks=pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
strict=False, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
reason="Fails only with PDv2 model", |
|
|
|
), |
|
|
|
), |
|
|
|
"/required-uploadfile-alias", |
|
|
|
pytest.param( |
|
|
|
"/model-required-uploadfile-alias", |
|
|
|
marks=pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
strict=False, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
reason="Fails only with PDv2 model", |
|
|
|
), |
|
|
|
), |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_missing(path: str): |
|
|
|
@ -248,9 +155,9 @@ def test_required_alias_missing(path: str): |
|
|
|
"detail": [ |
|
|
|
{ |
|
|
|
"type": "missing", |
|
|
|
"loc": ["body", "p_alias"], # model-required-*-alias fail here |
|
|
|
"loc": ["body", "p_alias"], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf(None, {}), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -272,31 +179,13 @@ def test_required_alias_missing(path: str): |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes-alias", |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-alias", |
|
|
|
marks=pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
reason="Fails only with PDv2 model", |
|
|
|
strict=False, |
|
|
|
), |
|
|
|
), |
|
|
|
"/required-uploadfile-alias", |
|
|
|
pytest.param( |
|
|
|
"/model-required-uploadfile-alias", |
|
|
|
marks=pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
reason="Fails only with PDv2 model", |
|
|
|
strict=False, |
|
|
|
), |
|
|
|
), |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_by_name(path: str): |
|
|
|
client = TestClient(app) |
|
|
|
response = client.post(path, files=[("p", b"hello")]) |
|
|
|
assert response.status_code == 422 # model-required-upload-alias fail here |
|
|
|
assert response.status_code == 422 |
|
|
|
assert response.json() == IsDict( |
|
|
|
{ |
|
|
|
"detail": [ |
|
|
|
@ -304,11 +193,7 @@ def test_required_alias_by_name(path: str): |
|
|
|
"type": "missing", |
|
|
|
"loc": ["body", "p_alias"], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf( # model-required-bytes-alias fail here |
|
|
|
None, |
|
|
|
{"p": IsPartialDict({"size": 5})}, |
|
|
|
{"p": b"hello"}, # ToDo: check this |
|
|
|
), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -330,33 +215,13 @@ def test_required_alias_by_name(path: str): |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes-alias", |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-alias", |
|
|
|
marks=pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
strict=False, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
reason="Fails only with PDv2 model", |
|
|
|
), |
|
|
|
), |
|
|
|
"/required-uploadfile-alias", |
|
|
|
pytest.param( |
|
|
|
"/model-required-uploadfile-alias", |
|
|
|
marks=pytest.mark.xfail( |
|
|
|
raises=AssertionError, |
|
|
|
strict=False, |
|
|
|
condition=PYDANTIC_V2, |
|
|
|
reason="Fails only with PDv2 model", |
|
|
|
), |
|
|
|
), |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_by_alias(path: str): |
|
|
|
client = TestClient(app) |
|
|
|
response = client.post(path, files=[("p_alias", b"hello")]) |
|
|
|
assert response.status_code == 200, ( # model-required-*-alias fail here |
|
|
|
response.text |
|
|
|
) |
|
|
|
assert response.status_code == 200, response.text |
|
|
|
assert response.json() == {"file_size": 5} |
|
|
|
|
|
|
|
|
|
|
|
@ -383,52 +248,12 @@ def read_required_uploadfile_validation_alias( |
|
|
|
return {"file_size": p.size} |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredBytesValidationAlias(BaseModel): |
|
|
|
p: bytes = File(validation_alias="p_val_alias") |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
|
|
"/model-required-bytes-validation-alias", |
|
|
|
operation_id="model_required_bytes_validation_alias", |
|
|
|
) |
|
|
|
def read_model_required_bytes_validation_alias( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredBytesValidationAlias, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": len(p.p)} # pragma: no cover |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredUploadFileValidationAlias(BaseModel): |
|
|
|
p: UploadFile = File(validation_alias="p_val_alias") |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
|
|
"/model-required-uploadfile-validation-alias", |
|
|
|
operation_id="model_required_uploadfile_validation_alias", |
|
|
|
) |
|
|
|
def read_model_required_uploadfile_validation_alias( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredUploadFileValidationAlias, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": p.p.size} |
|
|
|
|
|
|
|
|
|
|
|
@needs_pydanticv2 |
|
|
|
@pytest.mark.parametrize( |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes-validation-alias", |
|
|
|
"/model-required-uploadfile-validation-alias", |
|
|
|
"/required-uploadfile-validation-alias", |
|
|
|
"/model-required-bytes-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_validation_alias_schema(path: str): |
|
|
|
@ -457,12 +282,10 @@ def test_required_validation_alias_schema(path: str): |
|
|
|
"/required-bytes-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-bytes-validation-alias", |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_validation_alias_missing(path: str): |
|
|
|
@ -478,7 +301,7 @@ def test_required_validation_alias_missing(path: str): |
|
|
|
"p_val_alias", |
|
|
|
], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf(None, {}), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -492,15 +315,10 @@ def test_required_validation_alias_missing(path: str): |
|
|
|
"/required-bytes-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_validation_alias_by_name(path: str): |
|
|
|
@ -510,15 +328,13 @@ def test_required_validation_alias_by_name(path: str): |
|
|
|
response.text |
|
|
|
) |
|
|
|
|
|
|
|
assert response.json() == { |
|
|
|
assert response.json() == { # pragma: no cover |
|
|
|
"detail": [ |
|
|
|
{ |
|
|
|
"type": "missing", |
|
|
|
"loc": ["body", "p_val_alias"], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf( # /model-required-bytes-validation-alias fails here |
|
|
|
None, {"p": IsPartialDict({"size": 5})} |
|
|
|
), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -532,24 +348,19 @@ def test_required_validation_alias_by_name(path: str): |
|
|
|
"/required-bytes-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_validation_alias_by_validation_alias(path: str): |
|
|
|
client = TestClient(app) |
|
|
|
response = client.post(path, files=[("p_val_alias", b"hello")]) |
|
|
|
assert response.status_code == 200, ( # all 3 fail here |
|
|
|
assert response.status_code == 200, ( # all 2 fail here |
|
|
|
response.text |
|
|
|
) |
|
|
|
assert response.json() == {"file_size": 5} |
|
|
|
assert response.json() == {"file_size": 5} # pragma: no cover |
|
|
|
|
|
|
|
|
|
|
|
# ===================================================================================== |
|
|
|
@ -576,52 +387,12 @@ def read_required_uploadfile_alias_and_validation_alias( |
|
|
|
return {"file_size": p.size} |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredBytesAliasAndValidationAlias(BaseModel): |
|
|
|
p: bytes = File(alias="p_alias", validation_alias="p_val_alias") |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
|
|
"/model-required-bytes-alias-and-validation-alias", |
|
|
|
operation_id="model_required_bytes_alias_and_validation_alias", |
|
|
|
) |
|
|
|
def read_model_required_bytes_alias_and_validation_alias( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredBytesAliasAndValidationAlias, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": len(p.p)} # pragma: no cover |
|
|
|
|
|
|
|
|
|
|
|
class FormModelRequiredUploadFileAliasAndValidationAlias(BaseModel): |
|
|
|
p: UploadFile = File(alias="p_alias", validation_alias="p_val_alias") |
|
|
|
|
|
|
|
|
|
|
|
@app.post( |
|
|
|
"/model-required-uploadfile-alias-and-validation-alias", |
|
|
|
operation_id="model_required_uploadfile_alias_and_validation_alias", |
|
|
|
) |
|
|
|
def read_model_required_uploadfile_alias_and_validation_alias( |
|
|
|
p: Annotated[ |
|
|
|
FormModelRequiredUploadFileAliasAndValidationAlias, |
|
|
|
Form( |
|
|
|
media_type="multipart/form-data" # Remove media_type when https://github.com/fastapi/fastapi/pull/14343 is fixed |
|
|
|
), |
|
|
|
], |
|
|
|
): |
|
|
|
return {"file_size": p.p.size} |
|
|
|
|
|
|
|
|
|
|
|
@needs_pydanticv2 |
|
|
|
@pytest.mark.parametrize( |
|
|
|
"path", |
|
|
|
[ |
|
|
|
"/required-bytes-alias-and-validation-alias", |
|
|
|
"/model-required-bytes-alias-and-validation-alias", |
|
|
|
"/required-uploadfile-alias-and-validation-alias", |
|
|
|
"/model-required-uploadfile-alias-and-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_and_validation_alias_schema(path: str): |
|
|
|
@ -650,12 +421,10 @@ def test_required_alias_and_validation_alias_schema(path: str): |
|
|
|
"/required-bytes-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-bytes-alias-and-validation-alias", |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-alias-and-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_and_validation_alias_missing(path: str): |
|
|
|
@ -671,7 +440,7 @@ def test_required_alias_and_validation_alias_missing(path: str): |
|
|
|
"p_val_alias", # /required-*-alias-and-validation-alias fail here |
|
|
|
], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf(None, {}), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -685,12 +454,10 @@ def test_required_alias_and_validation_alias_missing(path: str): |
|
|
|
"/required-bytes-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-bytes-alias-and-validation-alias", |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-alias-and-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_and_validation_alias_by_name(path: str): |
|
|
|
@ -707,7 +474,7 @@ def test_required_alias_and_validation_alias_by_name(path: str): |
|
|
|
"p_val_alias", # /required-*-alias-and-validation-alias fail here |
|
|
|
], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf(None, {"p": IsPartialDict({"size": 5})}), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -721,15 +488,10 @@ def test_required_alias_and_validation_alias_by_name(path: str): |
|
|
|
"/required-bytes-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-alias-and-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_and_validation_alias_by_alias(path: str): |
|
|
|
@ -739,17 +501,13 @@ def test_required_alias_and_validation_alias_by_alias(path: str): |
|
|
|
response.text # /required-*-alias-and-validation-alias fails here |
|
|
|
) |
|
|
|
|
|
|
|
assert response.json() == { |
|
|
|
assert response.json() == { # pragma: no cover |
|
|
|
"detail": [ |
|
|
|
{ |
|
|
|
"type": "missing", |
|
|
|
"loc": ["body", "p_val_alias"], |
|
|
|
"msg": "Field required", |
|
|
|
"input": IsOneOf( |
|
|
|
None, |
|
|
|
# /model-required-uploadfile-alias-and-validation-alias fails here |
|
|
|
{"p_alias": IsPartialDict({"size": 5})}, |
|
|
|
), |
|
|
|
"input": None, |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
@ -763,21 +521,16 @@ def test_required_alias_and_validation_alias_by_alias(path: str): |
|
|
|
"/required-bytes-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/model-required-bytes-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
pytest.param( |
|
|
|
"/required-uploadfile-alias-and-validation-alias", |
|
|
|
marks=pytest.mark.xfail(raises=AssertionError, strict=False), |
|
|
|
), |
|
|
|
"/model-required-uploadfile-alias-and-validation-alias", |
|
|
|
], |
|
|
|
) |
|
|
|
def test_required_alias_and_validation_alias_by_validation_alias(path: str): |
|
|
|
client = TestClient(app) |
|
|
|
response = client.post(path, files=[("p_val_alias", b"hello")]) |
|
|
|
assert response.status_code == 200, ( # all 3 fail here |
|
|
|
assert response.status_code == 200, ( # all 2 fail here |
|
|
|
response.text |
|
|
|
) |
|
|
|
assert response.json() == {"file_size": 5} |
|
|
|
assert response.json() == {"file_size": 5} # pragma: no cover |
|
|
|
|