diff --git a/openapi_core/contrib/requests/responses.py b/openapi_core/contrib/requests/responses.py index 0546051d..502d6b9b 100644 --- a/openapi_core/contrib/requests/responses.py +++ b/openapi_core/contrib/requests/responses.py @@ -8,7 +8,7 @@ class RequestsOpenAPIResponseFactory(object): def create(cls, response): mimetype = response.headers.get('Content-Type') return OpenAPIResponse( - data=response.raw, + data=response.content, status_code=response.status_code, mimetype=mimetype, ) diff --git a/requirements_dev.txt b/requirements_dev.txt index 1f282d67..38acad62 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,4 +6,5 @@ falcon==2.0.0 flask django==2.2.10; python_version>="3.0" requests==2.22.0 +responses==0.10.12 webob diff --git a/setup.cfg b/setup.cfg index ba0da4b4..e58fefef 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,6 +40,7 @@ tests_require = pytest-cov falcon flask + responses webob [options.packages.find] diff --git a/tests/integration/contrib/requests/conftest.py b/tests/integration/contrib/requests/conftest.py index 00aac4f7..fc62bfc8 100644 --- a/tests/integration/contrib/requests/conftest.py +++ b/tests/integration/contrib/requests/conftest.py @@ -1,7 +1,9 @@ import pytest from requests.models import Request, Response from requests.structures import CaseInsensitiveDict +from six import BytesIO, b from six.moves.urllib.parse import urljoin, parse_qs +from urllib3.response import HTTPResponse @pytest.fixture @@ -24,11 +26,13 @@ def create_request(method, path, subdomain=None, query_string=''): def response_factory(): def create_response( data, status_code=200, content_type='application/json'): + fp = BytesIO(b(data)) + raw = HTTPResponse(fp, preload_content=False) resp = Response() resp.headers = CaseInsensitiveDict({ 'Content-Type': content_type, }) resp.status_code = status_code - resp.raw = data + resp.raw = raw return resp return create_response diff --git a/tests/integration/contrib/requests/test_requests_responses.py b/tests/integration/contrib/requests/test_requests_responses.py new file mode 100644 index 00000000..9ad45fde --- /dev/null +++ b/tests/integration/contrib/requests/test_requests_responses.py @@ -0,0 +1,14 @@ +from openapi_core.contrib.requests import RequestsOpenAPIResponse + + +class TestRequestsOpenAPIResponse(object): + + def test_invalid_server(self, response_factory): + response = response_factory('Not Found', status_code=404) + + openapi_response = RequestsOpenAPIResponse(response) + + assert openapi_response.data == response.content + assert openapi_response.status_code == response.status_code + mimetype = response.headers.get('Content-Type') + assert openapi_response.mimetype == mimetype diff --git a/tests/integration/contrib/requests/test_requests_validation.py b/tests/integration/contrib/requests/test_requests_validation.py index 7dc03554..6812d93f 100644 --- a/tests/integration/contrib/requests/test_requests_validation.py +++ b/tests/integration/contrib/requests/test_requests_validation.py @@ -1,4 +1,6 @@ import pytest +import requests +import responses from openapi_core.contrib.requests import ( RequestsOpenAPIRequest, RequestsOpenAPIResponse, @@ -15,21 +17,25 @@ def spec(self, factory): specfile = 'contrib/requests/data/v3.0/requests_factory.yaml' return create_spec(factory.spec_from_file(specfile)) - def test_response_validator_path_pattern(self, - spec, - request_factory, - response_factory): + @responses.activate + def test_response_validator_path_pattern(self, spec): + responses.add( + responses.GET, 'http://localhost/browse/12/', + json={"data": "data"}, status=200) validator = ResponseValidator(spec) - request = request_factory('GET', '/browse/12/', subdomain='kb') + request = requests.Request('GET', 'http://localhost/browse/12/') + request_prepared = request.prepare() + session = requests.Session() + response = session.send(request_prepared) openapi_request = RequestsOpenAPIRequest(request) - response = response_factory('{"data": "data"}', status_code=200) openapi_response = RequestsOpenAPIResponse(response) result = validator.validate(openapi_request, openapi_response) assert not result.errors - def test_request_validator_path_pattern(self, spec, request_factory): + @responses.activate + def test_request_validator_path_pattern(self, spec): validator = RequestValidator(spec) - request = request_factory('GET', '/browse/12/', subdomain='kb') + request = requests.Request('GET', 'http://localhost/browse/12/') openapi_request = RequestsOpenAPIRequest(request) result = validator.validate(openapi_request) assert not result.errors