Skip to content

Commit a1597a7

Browse files
committed
Shortcuts backward compatible
1 parent 82fce49 commit a1597a7

File tree

2 files changed

+101
-69
lines changed

2 files changed

+101
-69
lines changed

openapi_core/validation/shortcuts.py

+32-6
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/test_shortcuts.py

+69-63
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)