#48 validate integer, number and boolean query parameters

This commit is contained in:
Henning Jacobs
2015-08-26 18:35:57 +02:00
parent 4759a0c28f
commit f35dce3bd6
5 changed files with 62 additions and 3 deletions

View File

@@ -21,7 +21,7 @@ import six
import strict_rfc3339
from connexion.problem import problem
from connexion.utils import validate_date
from connexion.utils import validate_date, boolean
logger = logging.getLogger('connexion.decorators.validation')
@@ -34,6 +34,12 @@ TYPE_MAP = {'integer': int,
'array': list,
'object': dict} # map of swagger types to python types
TYPE_VALIDATION_MAP = {
'integer': int,
'number': float,
'boolean': boolean
}
FORMAT_MAP = {('string', 'date-time'): strict_rfc3339.validate_rfc3339,
('string', 'date'): validate_date}
@@ -178,6 +184,14 @@ class ParameterValidator():
for param in self.parameters.get('query', []):
val = flask.request.args.get(param['name'])
if val is not None:
schema_type = param.get('type')
expected_type = TYPE_VALIDATION_MAP.get(schema_type)
if expected_type:
try:
expected_type(val)
except:
m = "Wrong type, expected '{}' for query parameter '{}'".format(schema_type, param['name'])
return problem(400, 'Bad Request', m)
for func in VALIDATORS:
error = func(param, val)
if error:

View File

@@ -101,3 +101,21 @@ def validate_date(s):
True
'''
return strict_rfc3339.validate_rfc3339(s + 'T00:00:00Z')
def boolean(s):
'''
Convert JSON/Swagger boolean value to Python, raise ValueError otherwise
>>> boolean('true')
True
>>> boolean('false')
False
'''
if s == 'true':
return True
elif s == 'false':
return False
else:
raise ValueError('Invalid boolean value')

View File

@@ -258,6 +258,12 @@ paths:
in: query
type: string
format: date
- name: int
in: query
type: integer
- name: bool
in: query
type: boolean
definitions:
new_stack:
type: object

View File

@@ -330,10 +330,26 @@ def test_single_route(app):
def test_parameter_validation(app):
app_client = app.app.test_client()
url = '/v1.0/test_parameter_validation'
for invalid_date in '', 'foo', '2015-01-01T12:00:00Z':
response = app_client.get('/v1.0/test_parameter_validation', query_string={'date': invalid_date}) # type: flask.Response
response = app_client.get(url, query_string={'date': invalid_date}) # type: flask.Response
assert response.status_code == 400
assert response.content_type == 'application/problem+json'
response = app_client.get('/v1.0/test_parameter_validation', query_string={'date': '2015-08-26'}) # type: flask.Response
response = app_client.get(url, query_string={'date': '2015-08-26'}) # type: flask.Response
assert response.status_code == 200
for invalid_int in '', 'foo', '0.1':
response = app_client.get(url, query_string={'int': invalid_int}) # type: flask.Response
assert response.status_code == 400
response = app_client.get(url, query_string={'int': '123'}) # type: flask.Response
assert response.status_code == 200
for invalid_bool in '', 'foo', 'yes', 'False':
response = app_client.get(url, query_string={'bool': invalid_bool}) # type: flask.Response
assert response.status_code == 400
response = app_client.get(url, query_string={'bool': 'true'}) # type: flask.Response
assert response.status_code == 200

View File

@@ -28,3 +28,8 @@ def test_validate_date():
assert utils.validate_date('2015-07-31')
assert not utils.validate_date('2015-07-31T19:51:00Z')
assert utils.validate_date('9999-12-31')
def test_boolean():
assert utils.boolean('true')
assert not utils.boolean('false')