Skip to content

Commit 4df501a

Browse files
committed
Shortcuts backward compatible
1 parent 82fce49 commit 4df501a

File tree

3 files changed

+119
-69
lines changed

3 files changed

+119
-69
lines changed

openapi_core/validation/shortcuts.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,19 @@ def validate_request(
8383
cls: Optional[AnyRequestValidatorType] = None,
8484
**validator_kwargs: Any,
8585
) -> RequestValidationResult:
86+
if isinstance(spec, (Request, WebhookRequest)) and isinstance(
87+
request, Spec
88+
):
89+
warnings.warn(
90+
"spec parameter as a first argument is deprecated. "
91+
"Move it to second argument instead.",
92+
DeprecationWarning,
93+
)
94+
request, spec = spec, request
8695
if not isinstance(request, (Request, WebhookRequest)):
87-
raise TypeError("'request' is not (Webhook)Request")
96+
raise TypeError("'request' argument is not type of (Webhook)Request")
97+
if not isinstance(spec, Spec):
98+
raise TypeError("'spec' argument is not type of Spec")
8899
if validator is not None and isinstance(request, Request):
89100
warnings.warn(
90101
"validator parameter is deprecated. Use cls instead.",
@@ -113,18 +124,33 @@ def validate_request(
113124

114125

115126
def validate_response(
116-
request: AnyRequest,
117-
response: Response,
118-
spec: Spec,
127+
request: Union[Request, WebhookRequest, Spec],
128+
response: Union[Response, Request, WebhookRequest],
129+
spec: Union[Spec, Response],
119130
base_url: Optional[str] = None,
120131
validator: Optional[SpecResponseValidatorProxy] = None,
121132
cls: Optional[AnyResponseValidatorType] = None,
122133
**validator_kwargs: Any,
123134
) -> ResponseValidationResult:
135+
if (
136+
isinstance(request, Spec)
137+
and isinstance(response, (Request, WebhookRequest))
138+
and isinstance(spec, Response)
139+
):
140+
warnings.warn(
141+
"spec parameter as a first argument is deprecated. "
142+
"Move it to third argument instead.",
143+
DeprecationWarning,
144+
)
145+
args = request, response, spec
146+
spec, request, response = args
147+
124148
if not isinstance(request, (Request, WebhookRequest)):
125-
raise TypeError("'request' is not (Webhook)Request")
149+
raise TypeError("'request' argument is not type of (Webhook)Request")
126150
if not isinstance(response, Response):
127-
raise TypeError("'response' is not Response")
151+
raise TypeError("'response' argument is not type of Response")
152+
if not isinstance(spec, Spec):
153+
raise TypeError("'spec' argument is not type of Spec")
128154
if validator is not None and isinstance(request, Request):
129155
warnings.warn(
130156
"validator parameter is deprecated. Use cls instead.",

tests/unit/validation/conftest.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import pytest
2+
3+
from openapi_core import Spec
4+
5+
6+
@pytest.fixture
7+
def spec_v30():
8+
return Spec.from_dict({"openapi": "3.0"}, validator=None)
9+
10+
11+
@pytest.fixture
12+
def spec_v31():
13+
return Spec.from_dict({"openapi": "3.1"}, validator=None)
14+
15+
16+
@pytest.fixture
17+
def spec_invalid():
18+
return Spec.from_dict({}, validator=None)

tests/unit/validation/test_shortcuts.py

Lines changed: 69 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -18,62 +18,70 @@
1818

1919

2020
class TestValidateRequest:
21-
def test_spec_not_detected(self):
22-
spec = {}
21+
def test_spec_not_detected(self, spec_invalid):
2322
request = mock.Mock(spec=Request)
2423

2524
with pytest.raises(ValidatorDetectError):
26-
validate_request(request, spec=spec)
25+
validate_request(request, spec=spec_invalid)
2726

28-
def test_request_type_error(self):
29-
spec = {"openapi": "3.1"}
27+
def test_request_type_error(self, spec_v31):
3028
request = mock.sentinel.request
3129

3230
with pytest.raises(TypeError):
33-
validate_request(request, spec=spec)
31+
validate_request(request, spec=spec_v31)
3432

3533
@mock.patch(
3634
"openapi_core.validation.request.validators.RequestValidator.validate",
3735
)
38-
def test_request(self, mock_validate):
39-
spec = {"openapi": "3.1"}
36+
def test_request(self, mock_validate, spec_v31):
4037
request = mock.Mock(spec=Request)
4138

42-
result = validate_request(request, spec=spec)
39+
result = validate_request(request, spec=spec_v31)
4340

4441
assert result == mock_validate.return_value
4542
mock_validate.validate.aasert_called_once_with(request)
4643

4744
@mock.patch(
4845
"openapi_core.validation.request.validators.RequestValidator.validate",
4946
)
50-
def test_request_error(self, mock_validate):
51-
spec = {"openapi": "3.1"}
47+
def test_spec_as_first_arg_deprecated(self, mock_validate, spec_v31):
48+
request = mock.Mock(spec=Request)
49+
50+
with pytest.warns(DeprecationWarning):
51+
result = validate_request(spec_v31, request)
52+
53+
assert result == mock_validate.return_value
54+
mock_validate.validate.aasert_called_once_with(request)
55+
56+
@mock.patch(
57+
"openapi_core.validation.request.validators.RequestValidator.validate",
58+
)
59+
def test_request_error(self, mock_validate, spec_v31):
5260
request = mock.Mock(spec=Request)
5361
mock_validate.return_value = ResultMock(error_to_raise=ValueError)
5462

5563
with pytest.raises(ValueError):
56-
validate_request(request, spec=spec)
64+
validate_request(request, spec=spec_v31)
5765

5866
mock_validate.aasert_called_once_with(request)
5967

60-
def test_validator(self):
61-
spec = mock.sentinel.spec
68+
def test_validator(self, spec_v31):
6269
request = mock.Mock(spec=Request)
6370
validator = mock.Mock(spec=RequestValidator)
6471

6572
with pytest.warns(DeprecationWarning):
66-
result = validate_request(request, spec=spec, validator=validator)
73+
result = validate_request(
74+
request, spec=spec_v31, validator=validator
75+
)
6776

6877
assert result == validator.validate.return_value
6978
validator.validate.aasert_called_once_with(request)
7079

71-
def test_validator_cls(self):
72-
spec = mock.sentinel.spec
80+
def test_validator_cls(self, spec_v31):
7381
request = mock.Mock(spec=Request)
7482
validator_cls = mock.Mock(spec=RequestValidator)
7583

76-
result = validate_request(request, spec=spec, cls=validator_cls)
84+
result = validate_request(request, spec=spec_v31, cls=validator_cls)
7785

7886
assert result == validator_cls().validate.return_value
7987
validator_cls().validate.aasert_called_once_with(request)
@@ -82,82 +90,87 @@ def test_validator_cls(self):
8290
"openapi_core.validation.request.validators.WebhookRequestValidator."
8391
"validate",
8492
)
85-
def test_webhook_request(self, mock_validate):
86-
spec = {"openapi": "3.1"}
93+
def test_webhook_request(self, mock_validate, spec_v31):
8794
request = mock.Mock(spec=WebhookRequest)
8895

89-
result = validate_request(request, spec=spec)
96+
result = validate_request(request, spec=spec_v31)
9097

9198
assert result == mock_validate.return_value
9299
mock_validate.validate.aasert_called_once_with(request)
93100

94-
def test_webhook_request_validator_not_found(self):
95-
spec = {"openapi": "3.0"}
101+
def test_webhook_request_validator_not_found(self, spec_v30):
96102
request = mock.Mock(spec=WebhookRequest)
97103

98104
with pytest.raises(ValidatorDetectError):
99-
validate_request(request, spec=spec)
105+
validate_request(request, spec=spec_v30)
100106

101107
@mock.patch(
102108
"openapi_core.validation.request.validators.WebhookRequestValidator."
103109
"validate",
104110
)
105-
def test_webhook_request_error(self, mock_validate):
106-
spec = {"openapi": "3.1"}
111+
def test_webhook_request_error(self, mock_validate, spec_v31):
107112
request = mock.Mock(spec=WebhookRequest)
108113
mock_validate.return_value = ResultMock(error_to_raise=ValueError)
109114

110115
with pytest.raises(ValueError):
111-
validate_request(request, spec=spec)
116+
validate_request(request, spec=spec_v31)
112117

113118
mock_validate.aasert_called_once_with(request)
114119

115-
def test_webhook_validator_cls(self):
116-
spec = mock.sentinel.spec
120+
def test_webhook_validator_cls(self, spec_v31):
117121
request = mock.Mock(spec=WebhookRequest)
118122
validator_cls = mock.Mock(spec=WebhookRequestValidator)
119123

120-
result = validate_request(request, spec=spec, cls=validator_cls)
124+
result = validate_request(request, spec=spec_v31, cls=validator_cls)
121125

122126
assert result == validator_cls().validate.return_value
123127
validator_cls().validate.aasert_called_once_with(request)
124128

125129

126130
class TestValidateResponse:
127-
def test_spec_not_detected(self):
128-
spec = {}
131+
def test_spec_not_detected(self, spec_invalid):
129132
request = mock.Mock(spec=Request)
130133
response = mock.Mock(spec=Response)
131134

132135
with pytest.raises(ValidatorDetectError):
133-
validate_response(request, response, spec=spec)
136+
validate_response(request, response, spec=spec_invalid)
134137

135-
def test_request_type_error(self):
136-
spec = {"openapi": "3.1"}
138+
def test_request_type_error(self, spec_v31):
137139
request = mock.sentinel.request
138140
response = mock.Mock(spec=Response)
139141

140142
with pytest.raises(TypeError):
141-
validate_response(request, response, spec=spec)
143+
validate_response(request, response, spec=spec_v31)
142144

143-
def test_response_type_error(self):
144-
spec = {"openapi": "3.1"}
145+
def test_response_type_error(self, spec_v31):
145146
request = mock.Mock(spec=Request)
146147
response = mock.sentinel.response
147148

148149
with pytest.raises(TypeError):
149-
validate_response(request, response, spec=spec)
150+
validate_response(request, response, spec=spec_v31)
151+
152+
@mock.patch(
153+
"openapi_core.validation.response.validators.ResponseValidator."
154+
"validate",
155+
)
156+
def test_request_response(self, mock_validate, spec_v31):
157+
request = mock.Mock(spec=Request)
158+
response = mock.Mock(spec=Response)
159+
160+
result = validate_response(request, response, spec=spec_v31)
161+
162+
assert result == mock_validate.return_value
163+
mock_validate.aasert_called_once_with(request, response)
150164

151165
@mock.patch(
152166
"openapi_core.validation.response.validators.ResponseValidator."
153167
"validate",
154168
)
155-
def test_request_response(self, mock_validate):
156-
spec = {"openapi": "3.1"}
169+
def test_spec_as_first_arg_deprecated(self, mock_validate, spec_v31):
157170
request = mock.Mock(spec=Request)
158171
response = mock.Mock(spec=Response)
159172

160-
result = validate_response(request, response, spec=spec)
173+
result = validate_response(spec_v31, request, response)
161174

162175
assert result == mock_validate.return_value
163176
mock_validate.aasert_called_once_with(request, response)
@@ -166,62 +179,57 @@ def test_request_response(self, mock_validate):
166179
"openapi_core.validation.response.validators.ResponseValidator."
167180
"validate",
168181
)
169-
def test_request_response_error(self, mock_validate):
170-
spec = {"openapi": "3.1"}
182+
def test_request_response_error(self, mock_validate, spec_v31):
171183
request = mock.Mock(spec=Request)
172184
response = mock.Mock(spec=Response)
173185
mock_validate.return_value = ResultMock(error_to_raise=ValueError)
174186

175187
with pytest.raises(ValueError):
176-
validate_response(request, response, spec=spec)
188+
validate_response(request, response, spec=spec_v31)
177189

178190
mock_validate.aasert_called_once_with(request, response)
179191

180-
def test_validator(self):
181-
spec = mock.sentinel.spec
192+
def test_validator(self, spec_v31):
182193
request = mock.Mock(spec=Request)
183194
response = mock.Mock(spec=Response)
184195
validator = mock.Mock(spec=ResponseValidator)
185196

186197
with pytest.warns(DeprecationWarning):
187198
result = validate_response(
188-
request, response, spec=spec, validator=validator
199+
request, response, spec=spec_v31, validator=validator
189200
)
190201

191202
assert result == validator.validate.return_value
192203
validator.validate.aasert_called_once_with(request)
193204

194-
def test_validator_cls(self):
195-
spec = mock.sentinel.spec
205+
def test_validator_cls(self, spec_v31):
196206
request = mock.Mock(spec=Request)
197207
response = mock.Mock(spec=Response)
198208
validator_cls = mock.Mock(spec=ResponseValidator)
199209

200210
result = validate_response(
201-
request, response, spec=spec, cls=validator_cls
211+
request, response, spec=spec_v31, cls=validator_cls
202212
)
203213

204214
assert result == validator_cls().validate.return_value
205215
validator_cls().validate.aasert_called_once_with(request)
206216

207-
def test_webhook_response_validator_not_found(self):
208-
spec = {"openapi": "3.0"}
217+
def test_webhook_response_validator_not_found(self, spec_v30):
209218
request = mock.Mock(spec=WebhookRequest)
210219
response = mock.Mock(spec=Response)
211220

212221
with pytest.raises(ValidatorDetectError):
213-
validate_response(request, response, spec=spec)
222+
validate_response(request, response, spec=spec_v30)
214223

215224
@mock.patch(
216225
"openapi_core.validation.response.validators.WebhookResponseValidator."
217226
"validate",
218227
)
219-
def test_webhook_request(self, mock_validate):
220-
spec = {"openapi": "3.1"}
228+
def test_webhook_request(self, mock_validate, spec_v31):
221229
request = mock.Mock(spec=WebhookRequest)
222230
response = mock.Mock(spec=Response)
223231

224-
result = validate_response(request, response, spec=spec)
232+
result = validate_response(request, response, spec=spec_v31)
225233

226234
assert result == mock_validate.return_value
227235
mock_validate.aasert_called_once_with(request, response)
@@ -230,25 +238,23 @@ def test_webhook_request(self, mock_validate):
230238
"openapi_core.validation.response.validators.WebhookResponseValidator."
231239
"validate",
232240
)
233-
def test_webhook_request_error(self, mock_validate):
234-
spec = {"openapi": "3.1"}
241+
def test_webhook_request_error(self, mock_validate, spec_v31):
235242
request = mock.Mock(spec=WebhookRequest)
236243
response = mock.Mock(spec=Response)
237244
mock_validate.return_value = ResultMock(error_to_raise=ValueError)
238245

239246
with pytest.raises(ValueError):
240-
validate_response(request, response, spec=spec)
247+
validate_response(request, response, spec=spec_v31)
241248

242249
mock_validate.aasert_called_once_with(request, response)
243250

244-
def test_webhook_response_cls(self):
245-
spec = mock.sentinel.spec
251+
def test_webhook_response_cls(self, spec_v31):
246252
request = mock.Mock(spec=WebhookRequest)
247253
response = mock.Mock(spec=Response)
248254
validator_cls = mock.Mock(spec=WebhookResponseValidator)
249255

250256
result = validate_response(
251-
request, response, spec=spec, cls=validator_cls
257+
request, response, spec=spec_v31, cls=validator_cls
252258
)
253259

254260
assert result == validator_cls().validate.return_value

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy