From dba916c354611734b1bc9dbd19c80fe2f36fc232 Mon Sep 17 00:00:00 2001 From: Arjun Naik Date: Tue, 17 May 2016 16:29:32 +0200 Subject: [PATCH] Fix for when parameter spec is unordered. --- connexion/decorators/validation.py | 6 ++-- tests/api/test_unordered_definition.py | 9 ++++++ tests/conftest.py | 5 ++++ tests/fakeapi/hello.py | 4 +++ .../unordered_definition/swagger.yaml | 30 +++++++++++++++++++ 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 tests/api/test_unordered_definition.py create mode 100644 tests/fixtures/unordered_definition/swagger.yaml diff --git a/connexion/decorators/validation.py b/connexion/decorators/validation.py index 15cdb50f2..694ffc217 100644 --- a/connexion/decorators/validation.py +++ b/connexion/decorators/validation.py @@ -11,9 +11,9 @@ language governing permissions and limitations under the License. """ +import collections import copy import functools -import itertools import logging import sys @@ -157,7 +157,9 @@ def validate_schema(self, data): class ParameterValidator(object): def __init__(self, parameters): - self.parameters = {k: list(g) for k, g in itertools.groupby(parameters, key=lambda p: p['in'])} + self.parameters = collections.defaultdict(list) + for p in parameters: + self.parameters[p['in']].append(p) @staticmethod def validate_parameter(parameter_type, value, param): diff --git a/tests/api/test_unordered_definition.py b/tests/api/test_unordered_definition.py new file mode 100644 index 000000000..f2af5a281 --- /dev/null +++ b/tests/api/test_unordered_definition.py @@ -0,0 +1,9 @@ +import json + + +def test_app(unordered_definition_app): + app_client = unordered_definition_app.app.test_client() + response = app_client.get('/v1.0/unordered-params/1?first=first&second=2') # type: flask.Response + assert response.status_code == 400 + response_data = json.loads(response.data.decode()) + assert response_data['detail'] == 'Wrong type, expected \'integer\' for query parameter \'first\'' diff --git a/tests/conftest.py b/tests/conftest.py index fc08bc8ff..1fab9b62d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -108,3 +108,8 @@ def secure_endpoint_app(): @pytest.fixture(scope="session") def secure_api_app(): return build_app_from_fixture('secure_api') + + +@pytest.fixture(scope="session") +def unordered_definition_app(): + return build_app_from_fixture('unordered_definition') diff --git a/tests/fakeapi/hello.py b/tests/fakeapi/hello.py index 9710e2662..b33ba4d98 100755 --- a/tests/fakeapi/hello.py +++ b/tests/fakeapi/hello.py @@ -337,3 +337,7 @@ def get_invalid_response(): def get_custom_problem_response(): return problem(402, "You need to pay", "Missing amount", ext={'amount': 23.0}) + + +def unordered_params_response(first, path_param, second): + return dict(first=int(first), path_param=str(path_param), second=int(second)) diff --git a/tests/fixtures/unordered_definition/swagger.yaml b/tests/fixtures/unordered_definition/swagger.yaml new file mode 100644 index 000000000..d6e1d70ef --- /dev/null +++ b/tests/fixtures/unordered_definition/swagger.yaml @@ -0,0 +1,30 @@ +swagger: "2.0" + +info: + title: "{{title}}" + version: "1.0" + +basePath: /v1.0 + +paths: + /unordered-params/{path_param}: + get: + summary: Mixed parameters in swagger definition + operationId: fakeapi.hello.unordered_params_response + responses: + 200: + description: OK + parameters: + - name: first + in: query + type: integer + description: First Param + - name: path_param + in: path + required: true + type: string + description: Path Param + - name: second + in: query + type: integer + description: Second Param