Skip to content

Commit e41c772

Browse files
authored
Merge pull request #37 from dtkav/more_default_checks
validate parameter defaults in swagger 2.0 specs
2 parents 29ad281 + 499f38a commit e41c772

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

openapi_spec_validator/validators.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,5 +299,18 @@ def iter_errors(self, parameter):
299299
for err in self._iter_schema_errors(schema_deref):
300300
yield err
301301

302+
if 'default' in parameter:
303+
# only possible in swagger 2.0
304+
default = parameter['default']
305+
if default is not None:
306+
for err in self._iter_value_errors(parameter, default):
307+
yield err
308+
309+
def _iter_value_errors(self, schema, value):
310+
resolver = RefResolver.from_schema(schema)
311+
validator = Draft4ExtendedValidatorFactory.from_resolver(resolver)
312+
for err in validator(schema, resolver=resolver).iter_errors(value):
313+
yield err
314+
302315
def _iter_schema_errors(self, schema):
303316
return SchemaValidator(self.dereferencer).iter_errors(schema)

tests/integration/conftest.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from six.moves.urllib.parse import urlunparse
66
from yaml import safe_load
77

8-
from openapi_spec_validator import openapi_v3_spec_validator
8+
from openapi_spec_validator import (openapi_v3_spec_validator,
9+
openapi_v2_spec_validator)
910
from openapi_spec_validator.schemas import read_yaml_file
1011

1112

@@ -43,3 +44,8 @@ def factory():
4344
@pytest.fixture
4445
def validator():
4546
return openapi_v3_spec_validator
47+
48+
49+
@pytest.fixture
50+
def swagger_validator():
51+
return openapi_v2_spec_validator

tests/integration/test_validators.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,42 @@ def test_parameter_default_value_wrong_type(self, validator):
237237
assert errors_list[0].message == (
238238
"'invaldtype' is not of type 'integer'"
239239
)
240+
241+
def test_parameter_default_value_wrong_type_swagger(self,
242+
swagger_validator):
243+
spec = {
244+
'swagger': '2.0',
245+
'info': {
246+
'title': 'Test Api',
247+
'version': '0.0.1',
248+
},
249+
'paths': {
250+
'/test/': {
251+
'get': {
252+
'responses': {
253+
'200': {
254+
'description': 'OK',
255+
'schema': {'type': 'object'},
256+
},
257+
},
258+
'parameters': [
259+
{
260+
'name': 'param1',
261+
'in': 'query',
262+
'type': 'integer',
263+
'default': 'invaldtype',
264+
},
265+
],
266+
},
267+
},
268+
},
269+
}
270+
271+
errors = swagger_validator.iter_errors(spec)
272+
273+
errors_list = list(errors)
274+
assert len(errors_list) == 1
275+
assert errors_list[0].__class__ == ValidationError
276+
assert errors_list[0].message == (
277+
"'invaldtype' is not of type 'integer'"
278+
)

0 commit comments

Comments
 (0)