From 80889c6e4921a173a400133f5ffe31cdeeeff797 Mon Sep 17 00:00:00 2001 From: p1c2u Date: Sat, 29 May 2021 17:13:39 +0100 Subject: [PATCH] Request validation parameters dataclass --- openapi_core/validation/request/datatypes.py | 10 ++- openapi_core/validation/request/validators.py | 10 +-- .../contrib/falcon/test_falcon_middlewares.py | 6 +- .../contrib/flask/test_flask_decorator.py | 6 +- tests/integration/validation/test_minimal.py | 6 +- tests/integration/validation/test_petstore.py | 62 +++++++++---------- .../integration/validation/test_validators.py | 38 ++++++------ 7 files changed, 73 insertions(+), 65 deletions(-) diff --git a/openapi_core/validation/request/datatypes.py b/openapi_core/validation/request/datatypes.py index f93feb0f..7c9fb4c1 100644 --- a/openapi_core/validation/request/datatypes.py +++ b/openapi_core/validation/request/datatypes.py @@ -60,8 +60,16 @@ class OpenAPIRequest: parameters: RequestParameters = field(default_factory=RequestParameters) +@dataclass +class Parameters: + query: Dict = field(default_factory=dict) + header: Dict = field(default_factory=dict) + cookie: Dict = field(default_factory=dict) + path: Dict = field(default_factory=dict) + + @dataclass class RequestValidationResult(BaseValidationResult): body: Optional[str] = None - parameters: RequestParameters = field(default_factory=RequestParameters) + parameters: Parameters = field(default_factory=Parameters) security: Optional[Dict[str, str]] = None diff --git a/openapi_core/validation/request/validators.py b/openapi_core/validation/request/validators.py index c6bc6c55..9f325a41 100644 --- a/openapi_core/validation/request/validators.py +++ b/openapi_core/validation/request/validators.py @@ -21,7 +21,7 @@ ) from openapi_core.validation.exceptions import InvalidSecurity from openapi_core.validation.request.datatypes import ( - RequestParameters, RequestValidationResult, + Parameters, RequestValidationResult, ) from openapi_core.validation.validators import BaseValidator @@ -47,7 +47,7 @@ def _get_parameters(self, request, path, operation): errors = [] seen = set() - locations = {} + parameters = Parameters() params_iter = iter_params(operation_params, path_params) for param in params_iter: param_name = param['name'] @@ -68,10 +68,10 @@ def _get_parameters(self, request, path, operation): errors.append(exc) continue else: - locations.setdefault(param_location, {}) - locations[param_location][param_name] = value + location = getattr(parameters, param_location) + location[param_name] = value - return RequestParameters(**locations), errors + return parameters, errors def _get_parameter(self, param, request): name = param['name'] diff --git a/tests/integration/contrib/falcon/test_falcon_middlewares.py b/tests/integration/contrib/falcon/test_falcon_middlewares.py index dbe4b2a4..fe06f844 100644 --- a/tests/integration/contrib/falcon/test_falcon_middlewares.py +++ b/tests/integration/contrib/falcon/test_falcon_middlewares.py @@ -6,7 +6,7 @@ from openapi_core.contrib.falcon.middlewares import FalconOpenAPIMiddleware from openapi_core.shortcuts import create_spec -from openapi_core.validation.request.datatypes import RequestParameters +from openapi_core.validation.request.datatypes import Parameters class TestFalconOpenAPIMiddleware: @@ -62,7 +62,7 @@ def view_response_callable(request, response, id): from falcon.status_codes import HTTP_200 assert request.openapi assert not request.openapi.errors - assert request.openapi.parameters == RequestParameters(path={ + assert request.openapi.parameters == Parameters(path={ 'id': 12, }) response.content_type = MEDIA_HTML @@ -186,7 +186,7 @@ def view_response_callable(request, response, id): from falcon.status_codes import HTTP_200 assert request.openapi assert not request.openapi.errors - assert request.openapi.parameters == RequestParameters(path={ + assert request.openapi.parameters == Parameters(path={ 'id': 12, }) response.status = HTTP_200 diff --git a/tests/integration/contrib/flask/test_flask_decorator.py b/tests/integration/contrib/flask/test_flask_decorator.py index db1b39aa..f81d6db6 100644 --- a/tests/integration/contrib/flask/test_flask_decorator.py +++ b/tests/integration/contrib/flask/test_flask_decorator.py @@ -3,7 +3,7 @@ from openapi_core.contrib.flask.decorators import FlaskOpenAPIViewDecorator from openapi_core.shortcuts import create_spec -from openapi_core.validation.request.datatypes import RequestParameters +from openapi_core.validation.request.datatypes import Parameters class TestFlaskOpenAPIDecorator: @@ -59,7 +59,7 @@ def view_response_callable(*args, **kwargs): from flask.globals import request assert request.openapi assert not request.openapi.errors - assert request.openapi.parameters == RequestParameters(path={ + assert request.openapi.parameters == Parameters(path={ 'id': 12, }) resp = make_response('success', 200) @@ -171,7 +171,7 @@ def view_response_callable(*args, **kwargs): from flask.globals import request assert request.openapi assert not request.openapi.errors - assert request.openapi.parameters == RequestParameters(path={ + assert request.openapi.parameters == Parameters(path={ 'id': 12, }) resp = jsonify(data='data') diff --git a/tests/integration/validation/test_minimal.py b/tests/integration/validation/test_minimal.py index d6495b16..97b5233f 100644 --- a/tests/integration/validation/test_minimal.py +++ b/tests/integration/validation/test_minimal.py @@ -5,7 +5,7 @@ PathNotFound, OperationNotFound, ) from openapi_core.testing import MockRequest -from openapi_core.validation.request.datatypes import RequestParameters +from openapi_core.validation.request.datatypes import Parameters from openapi_core.validation.request.validators import RequestValidator @@ -49,7 +49,7 @@ def test_invalid_operation(self, factory, server, spec_path): assert len(result.errors) == 1 assert isinstance(result.errors[0], OperationNotFound) assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() @pytest.mark.parametrize("server", servers) @pytest.mark.parametrize("spec_path", spec_paths) @@ -64,4 +64,4 @@ def test_invalid_path(self, factory, server, spec_path): assert len(result.errors) == 1 assert isinstance(result.errors[0], PathNotFound) assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() diff --git a/tests/integration/validation/test_petstore.py b/tests/integration/validation/test_petstore.py index e8bffac3..bed9afb8 100644 --- a/tests/integration/validation/test_petstore.py +++ b/tests/integration/validation/test_petstore.py @@ -24,7 +24,7 @@ ) from openapi_core.testing import MockRequest, MockResponse from openapi_core.unmarshalling.schemas.exceptions import InvalidSchemaValue -from openapi_core.validation.request.datatypes import RequestParameters +from openapi_core.validation.request.datatypes import Parameters from openapi_core.validation.request.validators import RequestValidator from openapi_core.validation.response.validators import ResponseValidator @@ -75,7 +75,7 @@ def test_get_pets(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': 20, 'page': 1, @@ -118,7 +118,7 @@ def test_get_pets_response(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': 20, 'page': 1, @@ -164,7 +164,7 @@ def test_get_pets_response_no_schema(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': 20, 'page': 1, @@ -196,7 +196,7 @@ def test_get_pets_invalid_response(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': 20, 'page': 1, @@ -249,7 +249,7 @@ def test_get_pets_ids_param(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': 20, 'page': 1, @@ -287,7 +287,7 @@ def test_get_pets_tags_param(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': 20, 'page': 1, @@ -397,7 +397,7 @@ def test_get_pets_allow_empty_value(self, spec): with pytest.warns(DeprecationWarning): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'page': 1, 'limit': 20, @@ -423,7 +423,7 @@ def test_get_pets_none_value(self, spec): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': None, 'page': 1, @@ -450,7 +450,7 @@ def test_get_pets_param_order(self, spec): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': None, 'order': 'desc', @@ -482,7 +482,7 @@ def test_get_pets_param_coordinates(self, spec): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( query={ 'limit': None, 'page': 1, @@ -537,7 +537,7 @@ def test_post_birds(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -604,7 +604,7 @@ def test_post_cats(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -664,7 +664,7 @@ def test_post_cats_boolean_string(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -712,7 +712,7 @@ def test_post_no_one_of_schema(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -751,7 +751,7 @@ def test_post_cats_only_required_body(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -792,7 +792,7 @@ def test_post_pets_raises_invalid_mimetype(self, spec): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -934,7 +934,7 @@ def test_get_pet(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( path={ 'petId': 1, } @@ -985,7 +985,7 @@ def test_get_pet_not_found(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( path={ 'petId': 1, } @@ -1027,7 +1027,7 @@ def test_get_pet_wildcard(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters( + assert parameters == Parameters( path={ 'petId': 1, } @@ -1057,7 +1057,7 @@ def test_get_tags(self, spec, response_validator): parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert body is None data_json = ['cats', 'birds'] @@ -1087,7 +1087,7 @@ def test_post_tags_extra_body_properties(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() with pytest.raises(InvalidSchemaValue): spec_validate_body(spec, request) @@ -1105,7 +1105,7 @@ def test_post_tags_empty_body(self, spec, spec_dict): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() with pytest.raises(InvalidSchemaValue): spec_validate_body(spec, request) @@ -1123,7 +1123,7 @@ def test_post_tags_wrong_property_type(self, spec): parameters = spec_validate_parameters(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() with pytest.raises(InvalidSchemaValue): spec_validate_body(spec, request) @@ -1146,7 +1146,7 @@ def test_post_tags_additional_properties( parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert isinstance(body, BaseModel) assert body.name == pet_name @@ -1192,7 +1192,7 @@ def test_post_tags_created_now( parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert isinstance(body, BaseModel) assert body.created == created assert body.name == pet_name @@ -1239,7 +1239,7 @@ def test_post_tags_created_datetime( parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert isinstance(body, BaseModel) assert body.created == datetime(2016, 4, 16, 16, 6, 5, tzinfo=UTC) assert body.name == pet_name @@ -1295,7 +1295,7 @@ def test_post_tags_created_invalid_type( with pytest.raises(InvalidSchemaValue): spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() code = 400 message = 'Bad request' @@ -1338,7 +1338,7 @@ def test_delete_tags_with_requestbody( parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert isinstance(body, BaseModel) assert body.ids == ids @@ -1371,7 +1371,7 @@ def test_delete_tags_no_requestbody( parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert body is None def test_delete_tags_raises_missing_required_response_header( @@ -1386,7 +1386,7 @@ def test_delete_tags_raises_missing_required_response_header( parameters = spec_validate_parameters(spec, request) body = spec_validate_body(spec, request) - assert parameters == RequestParameters() + assert parameters == Parameters() assert body is None data = None diff --git a/tests/integration/validation/test_validators.py b/tests/integration/validation/test_validators.py index 3c60a921..b6e8c35b 100644 --- a/tests/integration/validation/test_validators.py +++ b/tests/integration/validation/test_validators.py @@ -18,7 +18,7 @@ from openapi_core.testing import MockRequest, MockResponse from openapi_core.unmarshalling.schemas.exceptions import InvalidSchemaValue from openapi_core.validation.exceptions import InvalidSecurity -from openapi_core.validation.request.datatypes import RequestParameters +from openapi_core.validation.request.datatypes import Parameters from openapi_core.validation.request.validators import RequestValidator from openapi_core.validation.response.validators import ResponseValidator @@ -55,7 +55,7 @@ def test_request_server_error(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == PathNotFound assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() def test_invalid_path(self, validator): request = MockRequest(self.host_url, 'get', '/v1') @@ -65,7 +65,7 @@ def test_invalid_path(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == PathNotFound assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() def test_invalid_operation(self, validator): request = MockRequest(self.host_url, 'patch', '/v1/pets') @@ -75,7 +75,7 @@ def test_invalid_operation(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == OperationNotFound assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() def test_missing_parameter(self, validator): request = MockRequest(self.host_url, 'get', '/v1/pets') @@ -84,7 +84,7 @@ def test_missing_parameter(self, validator): assert type(result.errors[0]) == MissingRequiredParameter assert result.body is None - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( query={ 'page': 1, 'search': '', @@ -102,7 +102,7 @@ def test_get_pets(self, validator): assert result.errors == [] assert result.body is None - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( query={ 'limit': 10, 'page': 1, @@ -129,7 +129,7 @@ def test_get_pets_webob(self, validator): assert result.errors == [] assert result.body is None - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( query={ 'limit': 5, 'page': 1, @@ -156,7 +156,7 @@ def test_missing_body(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == MissingRequiredRequestBody assert result.body is None - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -184,7 +184,7 @@ def test_invalid_content_type(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == MediaTypeNotFound assert result.body is None - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -232,7 +232,7 @@ def test_invalid_complex_parameter(self, validator, spec_dict): assert len(result.errors) == 1 assert type(result.errors[0]) == InvalidSchemaValue - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -286,7 +286,7 @@ def test_post_pets(self, validator, spec_dict): result = validator.validate(request) assert result.errors == [] - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -325,7 +325,7 @@ def test_post_pets_plain_no_schema(self, validator, spec_dict): result = validator.validate(request) assert result.errors == [] - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( header={ 'api_key': self.api_key, }, @@ -346,7 +346,7 @@ def test_get_pet_unauthorized(self, validator): assert result.errors == [InvalidSecurity(), ] assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() assert result.security is None def test_get_pet(self, validator): @@ -364,7 +364,7 @@ def test_get_pet(self, validator): assert result.errors == [] assert result.body is None - assert result.parameters == RequestParameters( + assert result.parameters == Parameters( path={ 'petId': 1, }, @@ -422,7 +422,7 @@ def test_request_missing_param(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == MissingRequiredParameter assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() def test_request_invalid_param(self, validator): request = MockRequest( @@ -434,7 +434,7 @@ def test_request_invalid_param(self, validator): assert len(result.errors) == 1 assert type(result.errors[0]) == CastError assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() def test_request_valid_param(self, validator): request = MockRequest( @@ -445,7 +445,7 @@ def test_request_valid_param(self, validator): assert len(result.errors) == 0 assert result.body is None - assert result.parameters == RequestParameters(query={'resId': 10}) + assert result.parameters == Parameters(query={'resId': 10}) def test_request_override_param(self, spec_dict): # override path parameter on operation @@ -467,7 +467,7 @@ def test_request_override_param(self, spec_dict): assert len(result.errors) == 0 assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() def test_request_override_param_uniqueness(self, spec_dict): # add parameter on operation with same name as on path but @@ -491,7 +491,7 @@ def test_request_override_param_uniqueness(self, spec_dict): assert len(result.errors) == 1 assert type(result.errors[0]) == MissingRequiredParameter assert result.body is None - assert result.parameters == RequestParameters() + assert result.parameters == Parameters() class TestResponseValidator: pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy