Skip to content

Commit 97c5245

Browse files
authored
Merge pull request #802 from sergiy-kozak/fix-incorrect-usage-of-super-requestunmarshaller
- invalid usage of super() when having multi-baseclass inheritance: …
2 parents 707b1e1 + 0a0565d commit 97c5245

File tree

3 files changed

+141
-2
lines changed

3 files changed

+141
-2
lines changed

openapi_core/unmarshalling/unmarshallers.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ def __init__(
6060
schema_validators_factory = (
6161
schema_unmarshallers_factory.schema_validators_factory
6262
)
63-
super().__init__(
63+
BaseValidator.__init__(
64+
self,
6465
spec,
6566
base_url=base_url,
6667
style_deserializers_factory=style_deserializers_factory,

openapi_core/validation/request/validators.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ def __init__(
8484
] = None,
8585
security_provider_factory: SecurityProviderFactory = security_provider_factory,
8686
):
87-
super().__init__(
87+
88+
BaseValidator.__init__(
89+
self,
8890
spec,
8991
base_url=base_url,
9092
style_deserializers_factory=style_deserializers_factory,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import enum
2+
3+
import pytest
4+
from jsonschema_path import SchemaPath
5+
6+
from openapi_core import V30RequestUnmarshaller
7+
from openapi_core import V31RequestUnmarshaller
8+
from openapi_core.datatypes import Parameters
9+
from openapi_core.testing import MockRequest
10+
11+
12+
class Colors(enum.Enum):
13+
14+
YELLOW = "yellow"
15+
BLUE = "blue"
16+
RED = "red"
17+
18+
@classmethod
19+
def of(cls, v: str):
20+
for it in cls:
21+
if it.value == v:
22+
return it
23+
raise ValueError(f"Invalid value: {v}")
24+
25+
26+
class TestRequestUnmarshaller:
27+
28+
@pytest.fixture(scope="session")
29+
def spec_dict(self):
30+
return {
31+
"openapi": "3.1.0",
32+
"info": {
33+
"title": "Test request body unmarshaller",
34+
"version": "0.1",
35+
},
36+
"paths": {
37+
"/resources": {
38+
"post": {
39+
"description": "POST resources test request",
40+
"requestBody": {
41+
"description": "",
42+
"content": {
43+
"application/json": {
44+
"schema": {
45+
"$ref": "#/components/schemas/createResource"
46+
}
47+
}
48+
},
49+
},
50+
"responses": {
51+
"201": {"description": "Resource was created."}
52+
},
53+
},
54+
"get": {
55+
"description": "POST resources test request",
56+
"parameters": [
57+
{
58+
"name": "color",
59+
"in": "query",
60+
"required": False,
61+
"schema": {
62+
"$ref": "#/components/schemas/colors"
63+
},
64+
},
65+
],
66+
"responses": {
67+
"default": {
68+
"description": "Returned resources matching request."
69+
}
70+
},
71+
},
72+
}
73+
},
74+
"components": {
75+
"schemas": {
76+
"colors": {
77+
"type": "string",
78+
"enum": ["yellow", "blue", "red"],
79+
"format": "enum_Colors",
80+
},
81+
"createResource": {
82+
"type": "object",
83+
"properties": {
84+
"resId": {"type": "integer"},
85+
"color": {"$ref": "#/components/schemas/colors"},
86+
},
87+
"required": ["resId", "color"],
88+
},
89+
}
90+
},
91+
}
92+
93+
@pytest.fixture(scope="session")
94+
def spec(self, spec_dict):
95+
return SchemaPath.from_dict(spec_dict)
96+
97+
@pytest.mark.parametrize(
98+
"req_unmarshaller_cls",
99+
[V30RequestUnmarshaller, V31RequestUnmarshaller],
100+
)
101+
def test_request_body_extra_unmarshaller(self, spec, req_unmarshaller_cls):
102+
ru = req_unmarshaller_cls(
103+
spec=spec, extra_format_unmarshallers={"enum_Colors": Colors.of}
104+
)
105+
request = MockRequest(
106+
host_url="http://example.com",
107+
method="post",
108+
path="/resources",
109+
data=b'{"resId": 23498572, "color": "blue"}',
110+
)
111+
result = ru.unmarshal(request)
112+
113+
assert not result.errors
114+
assert result.body == {"resId": 23498572, "color": Colors.BLUE}
115+
assert result.parameters == Parameters()
116+
117+
@pytest.mark.parametrize(
118+
"req_unmarshaller_cls",
119+
[V30RequestUnmarshaller, V31RequestUnmarshaller],
120+
)
121+
def test_request_param_extra_unmarshaller(
122+
self, spec, req_unmarshaller_cls
123+
):
124+
ru = req_unmarshaller_cls(
125+
spec=spec, extra_format_unmarshallers={"enum_Colors": Colors.of}
126+
)
127+
request = MockRequest(
128+
host_url="http://example.com",
129+
method="get",
130+
path="/resources",
131+
args={"color": "blue"},
132+
)
133+
result = ru.unmarshal(request)
134+
135+
assert not result.errors
136+
assert result.parameters == Parameters(query=dict(color=Colors.BLUE))

0 commit comments

Comments
 (0)