general: add support for explicit int and float query params (#36609)

This commit is contained in:
Valentin Deniaud 2019-10-03 14:20:21 +02:00
parent c98ed032d9
commit eca46f8bd8
2 changed files with 70 additions and 0 deletions

View File

@ -316,6 +316,17 @@ class GenericEndpointView(GenericConnectorMixin, SingleObjectMixin, View):
d[parameter] = False
else:
raise InvalidParameterValue(parameter)
elif parameter_info.get('type') == 'int':
try:
d[parameter] = int(d[parameter])
except ValueError:
raise InvalidParameterValue(parameter)
elif parameter_info.get('type') == 'float':
d[parameter] = d[parameter].replace(',', '.')
try:
d[parameter] = float(d[parameter])
except ValueError:
raise InvalidParameterValue(parameter)
if request.method == 'POST' and self.endpoint.endpoint_info.post:
request_body = self.endpoint.endpoint_info.post.get('request_body')

View File

@ -344,3 +344,62 @@ def test_https_warnings(app, db, monkeypatch, httpbin_secure, relax_openssl):
with warnings.catch_warnings():
warnings.simplefilter('error')
resource.requests.get(httpbin_secure.join('/get/'))
def test_endpoint_typed_params(app, db, monkeypatch):
@endpoint(methods=['get'],
parameters={
'boolean': {
'type': 'bool',
},
'integer': {
'type': 'int',
},
'floating': {
'type': 'float',
},
})
def httpcall(obj, request, boolean=False, integer=1, floating=1.1):
return {'boolean': boolean, 'integer': integer, 'floating': floating}
monkeypatch.setattr(StubInvoicesConnector, 'httpcall', httpcall, raising=False)
connector = StubInvoicesConnector(slug='fake')
connector.save()
json_res = app.get('/stub-invoices/fake/httpcall').json
json_res = app.get('/stub-invoices/fake/httpcall?boolean=True').json
assert json_res['boolean'] is True
json_res = app.get('/stub-invoices/fake/httpcall?boolean=on').json
assert json_res['boolean'] is True
json_res = app.get('/stub-invoices/fake/httpcall?boolean=False').json
assert json_res['boolean'] is False
json_res = app.get('/stub-invoices/fake/httpcall?boolean=off').json
assert json_res['boolean'] is False
json_res = app.get('/stub-invoices/fake/httpcall?boolean=notabool', status=400).json
assert json_res['err'] == 1
assert json_res['err_desc'] == 'invalid value for parameter "boolean"'
json_res = app.get('/stub-invoices/fake/httpcall?boolean=', status=400).json
assert json_res['err'] == 1
assert json_res['err_desc'] == 'invalid value for parameter "boolean"'
json_res = app.get('/stub-invoices/fake/httpcall?integer=2').json
assert json_res['integer'] == 2
json_res = app.get('/stub-invoices/fake/httpcall?integer=notanint', status=400).json
assert json_res['err'] == 1
assert json_res['err_desc'] == 'invalid value for parameter "integer"'
json_res = app.get('/stub-invoices/fake/httpcall?integer=', status=400).json
assert json_res['err'] == 1
assert json_res['err_desc'] == 'invalid value for parameter "integer"'
json_res = app.get('/stub-invoices/fake/httpcall?floating=1.5').json
assert json_res['floating'] == 1.5
json_res = app.get('/stub-invoices/fake/httpcall?floating=1,5').json
assert json_res['floating'] == 1.5
json_res = app.get('/stub-invoices/fake/httpcall?floating=notafloat', status=400).json
assert json_res['err'] == 1
assert json_res['err_desc'] == 'invalid value for parameter "floating"'
json_res = app.get('/stub-invoices/fake/httpcall?floating=', status=400).json
assert json_res['err'] == 1
assert json_res['err_desc'] == 'invalid value for parameter "floating"'