mirror of
https://github.com/LukeHagar/connexion.git
synced 2025-12-08 04:19:31 +00:00
#48 validate integer, number and boolean query parameters
This commit is contained in:
@@ -21,7 +21,7 @@ import six
|
|||||||
import strict_rfc3339
|
import strict_rfc3339
|
||||||
|
|
||||||
from connexion.problem import problem
|
from connexion.problem import problem
|
||||||
from connexion.utils import validate_date
|
from connexion.utils import validate_date, boolean
|
||||||
|
|
||||||
logger = logging.getLogger('connexion.decorators.validation')
|
logger = logging.getLogger('connexion.decorators.validation')
|
||||||
|
|
||||||
@@ -34,6 +34,12 @@ TYPE_MAP = {'integer': int,
|
|||||||
'array': list,
|
'array': list,
|
||||||
'object': dict} # map of swagger types to python types
|
'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,
|
FORMAT_MAP = {('string', 'date-time'): strict_rfc3339.validate_rfc3339,
|
||||||
('string', 'date'): validate_date}
|
('string', 'date'): validate_date}
|
||||||
@@ -178,6 +184,14 @@ class ParameterValidator():
|
|||||||
for param in self.parameters.get('query', []):
|
for param in self.parameters.get('query', []):
|
||||||
val = flask.request.args.get(param['name'])
|
val = flask.request.args.get(param['name'])
|
||||||
if val is not None:
|
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:
|
for func in VALIDATORS:
|
||||||
error = func(param, val)
|
error = func(param, val)
|
||||||
if error:
|
if error:
|
||||||
|
|||||||
@@ -101,3 +101,21 @@ def validate_date(s):
|
|||||||
True
|
True
|
||||||
'''
|
'''
|
||||||
return strict_rfc3339.validate_rfc3339(s + 'T00:00:00Z')
|
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
|
in: query
|
||||||
type: string
|
type: string
|
||||||
format: date
|
format: date
|
||||||
|
- name: int
|
||||||
|
in: query
|
||||||
|
type: integer
|
||||||
|
- name: bool
|
||||||
|
in: query
|
||||||
|
type: boolean
|
||||||
definitions:
|
definitions:
|
||||||
new_stack:
|
new_stack:
|
||||||
type: object
|
type: object
|
||||||
|
|||||||
@@ -330,10 +330,26 @@ def test_single_route(app):
|
|||||||
def test_parameter_validation(app):
|
def test_parameter_validation(app):
|
||||||
app_client = app.app.test_client()
|
app_client = app.app.test_client()
|
||||||
|
|
||||||
|
url = '/v1.0/test_parameter_validation'
|
||||||
|
|
||||||
for invalid_date in '', 'foo', '2015-01-01T12:00:00Z':
|
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.status_code == 400
|
||||||
assert response.content_type == 'application/problem+json'
|
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
|
assert response.status_code == 200
|
||||||
|
|||||||
@@ -28,3 +28,8 @@ def test_validate_date():
|
|||||||
assert utils.validate_date('2015-07-31')
|
assert utils.validate_date('2015-07-31')
|
||||||
assert not utils.validate_date('2015-07-31T19:51:00Z')
|
assert not utils.validate_date('2015-07-31T19:51:00Z')
|
||||||
assert utils.validate_date('9999-12-31')
|
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