mirror of
https://github.com/LukeHagar/connexion.git
synced 2025-12-07 20:37:44 +00:00
#48 validate integer, number and boolean query parameters
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user