diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 97c1f7eaf..3d969ed10 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -251,11 +251,11 @@ def is_scalar_sequence_field(field: ModelField) -> bool: def is_scalar_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( - field.type_, BaseModel + if ( + (field.shape in mapping_shapes) + and not lenient_issubclass(field.type_, BaseModel) + and field.sub_fields is not None ): - if field.sub_fields is None: - return False for sub_field in field.sub_fields: if not is_scalar_field(sub_field): return False @@ -264,11 +264,11 @@ def is_scalar_mapping_field(field: ModelField) -> bool: def is_scalar_sequence_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( - field.type_, BaseModel + if ( + (field.shape in mapping_shapes) + and not lenient_issubclass(field.type_, BaseModel) + and field.sub_fields is not None ): - if field.sub_fields is None: - return False for sub_field in field.sub_fields: if not is_scalar_sequence_field(sub_field): return False diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py new file mode 100644 index 000000000..ef49a3218 --- /dev/null +++ b/tests/test_invalid_mapping_param.py @@ -0,0 +1,15 @@ +from typing import Mapping, List + +import pytest +from fastapi import FastAPI, Query +from pydantic import BaseModel + + +def test_invalid_sequence(): + with pytest.raises(AssertionError): + app = FastAPI() + + + @app.get("/items/") + def read_items(q: Mapping[str, List[List[str]]] = Query(default=None)): + pass # pragma: no cover