From 6f1e45e25596fb7450c4531f6b7f39e2eab2051d Mon Sep 17 00:00:00 2001 From: Artur Maciag Date: Fri, 3 Nov 2017 14:17:38 +0000 Subject: [PATCH] Flask wrapper added --- openapi_core/wrappers.py | 13 +++-- requirements_dev.txt | 1 + tests/integration/test_wrappers.py | 92 ++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 tests/integration/test_wrappers.py diff --git a/openapi_core/wrappers.py b/openapi_core/wrappers.py index 433c54b..7f6cbfb 100644 --- a/openapi_core/wrappers.py +++ b/openapi_core/wrappers.py @@ -64,7 +64,7 @@ class MockRequest(BaseOpenAPIRequest): self.mimetype = mimetype -class WerkzeugOpenAPIRequest(BaseOpenAPIRequest): +class FlaskOpenAPIRequest(BaseOpenAPIRequest): def __init__(self, request): self.request = request @@ -83,15 +83,18 @@ class WerkzeugOpenAPIRequest(BaseOpenAPIRequest): @property def path_pattern(self): + if self.request.url_rule is None: + return self.path + return self.request.url_rule.rule @property def parameters(self): return { - 'path': self.request['view_args'], - 'query': self.request['args'], - 'headers': self.request['headers'], - 'cookies': self.request['cookies'], + 'path': self.request.view_args, + 'query': self.request.args, + 'headers': self.request.headers, + 'cookies': self.request.cookies, } @property diff --git a/requirements_dev.txt b/requirements_dev.txt index 3dcd5e5..2326086 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -3,3 +3,4 @@ pytest pytest-pep8 pytest-flakes pytest-cov +flask \ No newline at end of file diff --git a/tests/integration/test_wrappers.py b/tests/integration/test_wrappers.py new file mode 100644 index 0000000..fa5869a --- /dev/null +++ b/tests/integration/test_wrappers.py @@ -0,0 +1,92 @@ +import pytest + +from flask.wrappers import Request +from werkzeug.datastructures import EnvironHeaders, ImmutableMultiDict +from werkzeug.routing import Map, Rule, Subdomain +from werkzeug.test import create_environ + +from openapi_core.wrappers import FlaskOpenAPIRequest + + +class TestFlaskOpenAPIRequest(object): + + server_name = 'localhost' + + @pytest.fixture + def environ(self): + return create_environ() + + @pytest.fixture + def map(self): + return Map([ + # Static URLs + Rule('/', endpoint='static/index'), + Rule('/about', endpoint='static/about'), + Rule('/help', endpoint='static/help'), + # Knowledge Base + Subdomain('kb', [ + Rule('/', endpoint='kb/index'), + Rule('/browse/', endpoint='kb/browse'), + Rule('/browse//', endpoint='kb/browse'), + Rule('/browse//', endpoint='kb/browse') + ]) + ], default_subdomain='www') + + @pytest.fixture + def request_factory(self, map, environ): + def create_request(method, path, subdomain=None): + req = Request(environ) + urls = map.bind_to_environ( + environ, server_name=self.server_name, subdomain=subdomain) + req.url_rule, req.view_args = urls.match( + path, method, return_rule=True) + return req + return create_request + + @pytest.fixture + def openapi_request(self, request): + return FlaskOpenAPIRequest(request) + + def test_simple(self, request_factory, environ, request): + request = request_factory('GET', '/', subdomain='www') + + openapi_request = FlaskOpenAPIRequest(request) + + path = {} + query = ImmutableMultiDict([]) + headers = EnvironHeaders(environ) + cookies = {} + assert openapi_request.parameters == { + 'path': path, + 'query': query, + 'headers': headers, + 'cookies': cookies, + } + assert openapi_request.host_url == request.host_url + assert openapi_request.path == request.path + assert openapi_request.method == request.method.lower() + assert openapi_request.path_pattern == request.path + assert openapi_request.body == request.data + assert openapi_request.mimetype == request.mimetype + + def test_url_rule(self, request_factory, environ, request): + request = request_factory('GET', '/browse/12/', subdomain='kb') + + openapi_request = FlaskOpenAPIRequest(request) + + path = {'id': 12} + query = ImmutableMultiDict([]) + headers = EnvironHeaders(environ) + cookies = {} + assert openapi_request.parameters == { + 'path': path, + 'query': query, + 'headers': headers, + 'cookies': cookies, + } + assert openapi_request.host_url == request.host_url + assert openapi_request.path == request.path + assert openapi_request.method == request.method.lower() + assert openapi_request.path_pattern == request.url_rule.rule + assert openapi_request.body == request.data + assert openapi_request.mimetype == request.mimetype