Skip to content

Commit b78c596

Browse files
committed
fix: OAS 3.1 multi type (cast/deserialize)
1 parent 3b8a0c0 commit b78c596

4 files changed

Lines changed: 50 additions & 2 deletions

File tree

openapi_core/casting/schemas/casters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def cast(self, value: Any) -> Any:
235235
):
236236
return value
237237

238-
schema_type = (self.schema / "type").read_str(None)
238+
schema_type = (self.schema / "type").read_str_or_list(None)
239239
type_caster = self.get_type_caster(schema_type)
240240

241241
if value is None:

openapi_core/deserializing/styles/factories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def create(
2828
) -> StyleDeserializer:
2929
deserialize_callable = self.style_deserializers.get(style)
3030
caster = self.schema_casters_factory.create(spec, schema)
31-
schema_type = (schema / "type").read_str("")
31+
schema_type = (schema / "type").read_str_or_list("")
3232
return StyleDeserializer(
3333
style, explode, name, schema_type, caster, deserialize_callable
3434
)

tests/unit/casting/test_schema_casters.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,26 @@ def test_array_invalid_value(self, value, caster_factory):
6767
):
6868
caster_factory(schema).cast(value)
6969

70+
@pytest.mark.parametrize(
71+
"schema_types,value",
72+
[
73+
(["string", "number", "boolean"], "12567"),
74+
(["integer", "string"], "42"),
75+
(["number", "string"], "3.14"),
76+
(["boolean", "string"], "true"),
77+
],
78+
)
79+
def test_oas31_multi_type(self, caster_factory, schema_types, value):
80+
"""Test OAS 3.1 list-style `type`."""
81+
spec = {
82+
"type": schema_types,
83+
}
84+
schema = SchemaPath.from_dict(spec)
85+
86+
result = caster_factory(schema).cast(value)
87+
88+
assert result == value
89+
7090
@pytest.mark.parametrize(
7191
"composite_type,schema_type,value,expected",
7292
[

tests/unit/deserializing/test_styles_deserializers.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,34 @@ def test_pipe_delimited_valid(
444444

445445
assert result == expected
446446

447+
@pytest.mark.parametrize(
448+
"schema_types,value,expected",
449+
[
450+
(["string", "number", "boolean"], "12567", "12567"),
451+
(["integer", "string"], "42", "42"),
452+
],
453+
)
454+
def test_oas31_multi_type_form(
455+
self, deserializer_factory, schema_types, value, expected
456+
):
457+
"""Test OAS 3.1 multi-type support for form style parameters."""
458+
name = "param"
459+
spec = {
460+
"name": name,
461+
"in": "query",
462+
"explode": True,
463+
"schema": {
464+
"type": schema_types,
465+
},
466+
}
467+
param = SchemaPath.from_dict(spec)
468+
deserializer = deserializer_factory(param)
469+
location = {name: value}
470+
471+
result = deserializer.deserialize(location)
472+
473+
assert result == expected
474+
447475
def test_deep_object_valid(self, deserializer_factory):
448476
name = "param"
449477
spec = {

0 commit comments

Comments
 (0)