diff --git a/tests/test_aliases/test_file_model_aliases.py b/tests/test_aliases/test_file_model_aliases.py index 7890c86d9..f002cb4a4 100644 --- a/tests/test_aliases/test_file_model_aliases.py +++ b/tests/test_aliases/test_file_model_aliases.py @@ -376,7 +376,7 @@ def test_list_field_validation_alias_model_by_alias(): assert resp.status_code == 200, resp.text # Fails with: # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} + # {"detail":[{"type":"bytes_type","loc":["body","files_val_alias",0],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}},{"type":"bytes_type","loc":["body","files_val_alias",1],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} # Uncomment when the assertion above passes: # assert resp.json() == {"file_sizes": [8, 8]} @@ -434,7 +434,7 @@ def test_optional_list_field_validation_alias_model_by_alias(): assert resp.status_code == 200, resp.text # Fails with: # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} + # {"detail":[{"type":"bytes_type","loc":["body","files_val_alias",0],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}},{"type":"bytes_type","loc":["body","files_val_alias",1],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} # Uncomment when the assertion above passes: # assert resp.json() == {"file_sizes": [8, 8]} @@ -653,7 +653,7 @@ def test_list_field_alias_and_validation_alias_model_by_validation_alias(): assert resp.status_code == 200, resp.text # Fails with: # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} + # {"detail":[{"type":"bytes_type","loc":["body","files_val_alias",0],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}},{"type":"bytes_type","loc":["body","files_val_alias",1],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} # Uncomment when the assertion above passes: # assert resp.json() == {"file_sizes": [8, 8]} @@ -725,7 +725,7 @@ def test_optional_list_field_alias_and_validation_alias_model_by_validation_alia assert resp.status_code == 200, resp.text # Fails with: # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} + # {"detail":[{"type":"bytes_type","loc":["body","files_val_alias",0],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}},{"type":"bytes_type","loc":["body","files_val_alias",1],"msg":"Input should be a valid bytes","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} # Uncomment when the assertion above passes: # assert resp.json() == {"file_sizes": [8, 8]} diff --git a/tests/test_aliases/test_form_model_aliases.py b/tests/test_aliases/test_form_model_aliases.py index 5da78f309..3a5f48593 100644 --- a/tests/test_aliases/test_form_model_aliases.py +++ b/tests/test_aliases/test_form_model_aliases.py @@ -1,6 +1,5 @@ from typing import List, Optional -import pytest from fastapi import FastAPI, Form from fastapi.testclient import TestClient from pydantic import BaseModel, Field @@ -177,8 +176,8 @@ def test_optional_list_field_alias_model_schema(): # ===================================================================================== # Field(validation_alias=...) -# Current situation: works except lists - +# Current situation: Works (with fix #14303), but there is still an issue with `validation_alias` +# (values are extracted as extra parameters, not as declared parameters) # ------------------------------ # required field @@ -284,7 +283,7 @@ class ListFieldValidationAliasModel(BaseModel): async def list_field_validation_alias_model( data: ListFieldValidationAliasModel = Form(...), ): - return {"param": data.param} # pragma: no cover (remove `no cover` when bug fixed) + return {"param": data.param} def test_list_field_validation_alias_model_by_name(): @@ -298,19 +297,15 @@ def test_list_field_validation_alias_model_by_name(): assert "param_val_alias" in detail[0]["loc"] -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_list_field_validation_alias_model_by_alias(): client = TestClient(app) resp = client.post( "/list-field-validation-alias-model", data={"param_val_alias": ["123", "456"]} ) assert resp.status_code == 200, resp.text - # Currently fails due to some issue: - # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","param_val_alias"],"msg":"Input should be a valid list","input":"456"}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"param": ["123", "456"]} + assert resp.json() == {"param": ["123", "456"]} def test_list_field_validation_alias_model_schema(): @@ -352,7 +347,8 @@ def test_optional_list_field_validation_alias_model_by_name(): assert resp.json() == {"param": None} -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_optional_list_field_validation_alias_model_by_alias(): client = TestClient(app) resp = client.post( @@ -360,12 +356,7 @@ def test_optional_list_field_validation_alias_model_by_alias(): data={"param_val_alias": ["123", "456"]}, ) assert resp.status_code == 200, resp.text - # Currently fails due to some issue: - # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","param_val_alias"],"msg":"Input should be a valid list","input":"456"}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"param": ["123", "456"]} + assert resp.json() == {"param": ["123", "456"]} def test_optional_list_field_validation_alias_model_schema(): @@ -383,7 +374,8 @@ def test_optional_list_field_validation_alias_model_schema(): # ===================================================================================== # Field(alias=..., validation_alias=...) -# Current situation: works except lists +# Current situation: Works (with fix #14303), but there is still an issue with `validation_alias` +# (values are extracted as extra parameters, not as declared parameters) # ------------------------------ # required field @@ -521,7 +513,7 @@ class ListFieldAliasAndValidationAliasModel(BaseModel): async def list_field_alias_and_validation_alias_model( data: ListFieldAliasAndValidationAliasModel = Form(...), ): - return {"param": data.param} # pragma: no cover (remove `no cover` when bug fixed) + return {"param": data.param} def test_list_field_alias_and_validation_alias_model_by_name(): @@ -547,7 +539,8 @@ def test_list_field_alias_and_validation_alias_model_by_alias(): assert "param_val_alias" in detail[0]["loc"] -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_list_field_alias_and_validation_alias_model_by_validation_alias(): client = TestClient(app) resp = client.post( @@ -555,12 +548,7 @@ def test_list_field_alias_and_validation_alias_model_by_validation_alias(): data={"param_val_alias": ["123", "456"]}, ) assert resp.status_code == 200, resp.text - # Currently fails due to some issue: - # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","param_val_alias"],"msg":"Input should be a valid list","input":"456"}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"param": ["123", "456"]} + assert resp.json() == {"param": ["123", "456"]} def test_list_field_alias_and_validation_alias_model_schema(): @@ -617,7 +605,8 @@ def test_optional_list_field_alias_and_validation_alias_model_by_alias(): assert resp.json() == {"param": None} -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_optional_list_field_alias_and_validation_alias_model_by_validation_alias(): client = TestClient(app) resp = client.post( @@ -625,12 +614,7 @@ def test_optional_list_field_alias_and_validation_alias_model_by_validation_alia data={"param_val_alias": ["123", "456"]}, ) assert resp.status_code == 200, resp.text - # Currently fails due to some issue: - # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","param_val_alias"],"msg":"Input should be a valid list","input":"456"}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"param": ["123", "456"]} + assert resp.json() == {"param": ["123", "456"]} def test_optional_list_field_alias_and_validation_alias_model_schema(): diff --git a/tests/test_aliases/test_uploadfile_model_aliases.py b/tests/test_aliases/test_uploadfile_model_aliases.py index c57b76f55..d13c1e54c 100644 --- a/tests/test_aliases/test_uploadfile_model_aliases.py +++ b/tests/test_aliases/test_uploadfile_model_aliases.py @@ -1,6 +1,5 @@ from typing import List, Optional -import pytest from fastapi import FastAPI, File, UploadFile from fastapi.testclient import TestClient from pydantic import BaseModel, Field @@ -190,8 +189,8 @@ def test_optional_list_field_alias_model_schema(): # ===================================================================================== # Field(validation_alias=...) -# Current situation: Works except lists (validation error - expected list, got str) - +# Current situation: Works (with fix #14303), but there is still an issue with `validation_alias` +# (values are extracted as extra parameters, not as declared parameters) # ------------------------------ # required field @@ -304,7 +303,7 @@ class ListFieldValidationAliasModel(BaseModel): "/list-field-validation-alias-model", operation_id="list_field_validation_alias_model", ) -async def list_field_validation_alias_model( # pragma: no cover (remove `no cover` when bug fixed) +async def list_field_validation_alias_model( data: ListFieldValidationAliasModel = File(...), ): return {"file_sizes": [file.size for file in data.files]} @@ -322,7 +321,8 @@ def test_list_field_validation_alias_model_by_name(): assert "files_val_alias" in detail[0]["loc"] -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_list_field_validation_alias_model_by_alias(): client = TestClient(app) resp = client.post( @@ -330,12 +330,7 @@ def test_list_field_validation_alias_model_by_alias(): files=[("files_val_alias", b"content1"), ("files_val_alias", b"content2")], ) assert resp.status_code == 200, resp.text - # Fails with: - # AssertionError: assert 422 == 200 - # {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"file_sizes": [8, 8]} + assert resp.json() == {"file_sizes": [8, 8]} def test_list_field_validation_alias_model_schema(): @@ -380,7 +375,8 @@ def test_optional_list_field_validation_alias_model_by_name(): assert resp.json() == {"file_sizes": None} -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_optional_list_field_validation_alias_model_by_alias(): client = TestClient(app) resp = client.post( @@ -388,12 +384,7 @@ def test_optional_list_field_validation_alias_model_by_alias(): files=[("files_val_alias", b"content1"), ("files_val_alias", b"content2")], ) assert resp.status_code == 200, resp.text - # Fails with: - # AssertionError: assert 422 == 200 - # AssertionError: {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"file_sizes": [8, 8]} + assert resp.json() == {"file_sizes": [8, 8]} def test_optional_list_field_validation_alias_model_schema(): @@ -414,7 +405,9 @@ def test_optional_list_field_validation_alias_model_schema(): # ===================================================================================== # Field(alias=..., validation_alias=...) -# Current situation: Works except lists (validation error - expected list, got str) +# Current situation: Works (with fix #14303), but there is still an issue with `validation_alias` +# (values are extracted as extra parameters, not as declared parameters) + # ------------------------------ # required field @@ -559,7 +552,7 @@ class ListFieldAliasAndValidationAliasModel(BaseModel): "/list-field-alias-and-validation-alias-model", operation_id="list_field_alias_and_validation_alias_model", ) -async def list_field_alias_and_validation_alias_model( # pragma: no cover (remove `no cover` when bug fixed) +async def list_field_alias_and_validation_alias_model( data: ListFieldAliasAndValidationAliasModel = File(...), ): return {"file_sizes": [file.size for file in data.files]} @@ -589,7 +582,8 @@ def test_list_field_alias_and_validation_alias_model_by_alias(): assert "files_val_alias" in detail[0]["loc"] -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_list_field_alias_and_validation_alias_model_by_validation_alias(): client = TestClient(app) resp = client.post( @@ -597,12 +591,7 @@ def test_list_field_alias_and_validation_alias_model_by_validation_alias(): files=[("files_val_alias", b"content1"), ("files_val_alias", b"content2")], ) assert resp.status_code == 200, resp.text - # Fails with: - # AssertionError: assert 422 == 200 - # AssertionError: {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"file_sizes": [8, 8]} + assert resp.json() == {"file_sizes": [8, 8]} def test_list_field_alias_and_validation_alias_model_schema(): @@ -633,7 +622,7 @@ class OptionalListFieldAliasAndValidationAliasModel(BaseModel): "/optional-list-field-alias-and-validation-alias-model", operation_id="optional_list_field_alias_and_validation_alias_model", ) -async def optional_list_field_alias_and_validation_alias_model( # pragma: no cover (remove `no cover` when bug fixed) +async def optional_list_field_alias_and_validation_alias_model( data: OptionalListFieldAliasAndValidationAliasModel = File(...), ): if data.files is None: @@ -661,7 +650,8 @@ def test_optional_list_field_alias_and_validation_alias_model_by_alias(): assert resp.json() == {"file_sizes": None} -@pytest.mark.xfail(raises=AssertionError, strict=False) +# This currently passes (with fix #14303), but it works incorrectly internally +# (values are extracted as extra parameters, not as declared parameters) def test_optional_list_field_alias_and_validation_alias_model_by_validation_alias(): client = TestClient(app) resp = client.post( @@ -669,12 +659,7 @@ def test_optional_list_field_alias_and_validation_alias_model_by_validation_alia files=[("files_val_alias", b"content1"), ("files_val_alias", b"content2")], ) assert resp.status_code == 200, resp.text - # Fails with: - # AssertionError: assert 422 == 200 - # AssertionError: {"detail":[{"type":"list_type","loc":["body","files_val_alias"],"msg":"Input should be a valid list","input":{"filename":"upload","file":{"_file":{},"_max_size":1048576,"_rolled":false,"_TemporaryFileArgs":{"mode":"w+b","buffering":-1,"suffix":null,"prefix":null,"encoding":null,"newline":null,"dir":null,"errors":null}},"size":8,"headers":{"content-disposition":"form-data; name=\"files_val_alias\"; filename=\"upload\"","content-type":"application/octet-stream"},"_max_mem_size":1048576}}]} - - # Uncomment when the assertion above passes: - # assert resp.json() == {"file_sizes": [8, 8]} + assert resp.json() == {"file_sizes": [8, 8]} def test_optional_list_field_alias_and_validation_alias_model_schema():