Skip to content

Shortcuts backward compatible #482

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 32 additions & 6 deletions openapi_core/validation/shortcuts.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,19 @@ def validate_request(
cls: Optional[AnyRequestValidatorType] = None,
**validator_kwargs: Any,
) -> RequestValidationResult:
if isinstance(spec, (Request, WebhookRequest)) and isinstance(
request, Spec
):
warnings.warn(
"spec parameter as a first argument is deprecated. "
"Move it to second argument instead.",
DeprecationWarning,
)
request, spec = spec, request
if not isinstance(request, (Request, WebhookRequest)):
raise TypeError("'request' is not (Webhook)Request")
raise TypeError("'request' argument is not type of (Webhook)Request")
if not isinstance(spec, Spec):
raise TypeError("'spec' argument is not type of Spec")
if validator is not None and isinstance(request, Request):
warnings.warn(
"validator parameter is deprecated. Use cls instead.",
Expand Down Expand Up @@ -113,18 +124,33 @@ def validate_request(


def validate_response(
request: AnyRequest,
response: Response,
spec: Spec,
request: Union[Request, WebhookRequest, Spec],
response: Union[Response, Request, WebhookRequest],
spec: Union[Spec, Response],
base_url: Optional[str] = None,
validator: Optional[SpecResponseValidatorProxy] = None,
cls: Optional[AnyResponseValidatorType] = None,
**validator_kwargs: Any,
) -> ResponseValidationResult:
if (
isinstance(request, Spec)
and isinstance(response, (Request, WebhookRequest))
and isinstance(spec, Response)
):
warnings.warn(
"spec parameter as a first argument is deprecated. "
"Move it to third argument instead.",
DeprecationWarning,
)
args = request, response, spec
spec, request, response = args

if not isinstance(request, (Request, WebhookRequest)):
raise TypeError("'request' is not (Webhook)Request")
raise TypeError("'request' argument is not type of (Webhook)Request")
if not isinstance(response, Response):
raise TypeError("'response' is not Response")
raise TypeError("'response' argument is not type of Response")
if not isinstance(spec, Spec):
raise TypeError("'spec' argument is not type of Spec")
if validator is not None and isinstance(request, Request):
warnings.warn(
"validator parameter is deprecated. Use cls instead.",
Expand Down
18 changes: 18 additions & 0 deletions tests/unit/validation/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import pytest

from openapi_core import Spec


@pytest.fixture
def spec_v30():
return Spec.from_dict({"openapi": "3.0"}, validator=None)


@pytest.fixture
def spec_v31():
return Spec.from_dict({"openapi": "3.1"}, validator=None)


@pytest.fixture
def spec_invalid():
return Spec.from_dict({}, validator=None)
143 changes: 82 additions & 61 deletions tests/unit/validation/test_shortcuts.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,62 +18,77 @@


class TestValidateRequest:
def test_spec_not_detected(self):
spec = {}
def test_spec_not_detected(self, spec_invalid):
request = mock.Mock(spec=Request)

with pytest.raises(ValidatorDetectError):
validate_request(request, spec=spec)
validate_request(request, spec=spec_invalid)

def test_request_type_error(self):
spec = {"openapi": "3.1"}
def test_request_type_error(self, spec_v31):
request = mock.sentinel.request

with pytest.raises(TypeError):
validate_request(request, spec=spec_v31)

def test_spec_type_error(self):
request = mock.Mock(spec=Request)
spec = mock.sentinel.spec

with pytest.raises(TypeError):
validate_request(request, spec=spec)

@mock.patch(
"openapi_core.validation.request.validators.RequestValidator.validate",
)
def test_request(self, mock_validate):
spec = {"openapi": "3.1"}
def test_request(self, mock_validate, spec_v31):
request = mock.Mock(spec=Request)

result = validate_request(request, spec=spec_v31)

assert result == mock_validate.return_value
mock_validate.validate.aasert_called_once_with(request)

@mock.patch(
"openapi_core.validation.request.validators.RequestValidator.validate",
)
def test_spec_as_first_arg_deprecated(self, mock_validate, spec_v31):
request = mock.Mock(spec=Request)

result = validate_request(request, spec=spec)
with pytest.warns(DeprecationWarning):
result = validate_request(spec_v31, request)

assert result == mock_validate.return_value
mock_validate.validate.aasert_called_once_with(request)

@mock.patch(
"openapi_core.validation.request.validators.RequestValidator.validate",
)
def test_request_error(self, mock_validate):
spec = {"openapi": "3.1"}
def test_request_error(self, mock_validate, spec_v31):
request = mock.Mock(spec=Request)
mock_validate.return_value = ResultMock(error_to_raise=ValueError)

with pytest.raises(ValueError):
validate_request(request, spec=spec)
validate_request(request, spec=spec_v31)

mock_validate.aasert_called_once_with(request)

def test_validator(self):
spec = mock.sentinel.spec
def test_validator(self, spec_v31):
request = mock.Mock(spec=Request)
validator = mock.Mock(spec=RequestValidator)

with pytest.warns(DeprecationWarning):
result = validate_request(request, spec=spec, validator=validator)
result = validate_request(
request, spec=spec_v31, validator=validator
)

assert result == validator.validate.return_value
validator.validate.aasert_called_once_with(request)

def test_validator_cls(self):
spec = mock.sentinel.spec
def test_validator_cls(self, spec_v31):
request = mock.Mock(spec=Request)
validator_cls = mock.Mock(spec=RequestValidator)

result = validate_request(request, spec=spec, cls=validator_cls)
result = validate_request(request, spec=spec_v31, cls=validator_cls)

assert result == validator_cls().validate.return_value
validator_cls().validate.aasert_called_once_with(request)
Expand All @@ -82,82 +97,95 @@ def test_validator_cls(self):
"openapi_core.validation.request.validators.WebhookRequestValidator."
"validate",
)
def test_webhook_request(self, mock_validate):
spec = {"openapi": "3.1"}
def test_webhook_request(self, mock_validate, spec_v31):
request = mock.Mock(spec=WebhookRequest)

result = validate_request(request, spec=spec)
result = validate_request(request, spec=spec_v31)

assert result == mock_validate.return_value
mock_validate.validate.aasert_called_once_with(request)

def test_webhook_request_validator_not_found(self):
spec = {"openapi": "3.0"}
def test_webhook_request_validator_not_found(self, spec_v30):
request = mock.Mock(spec=WebhookRequest)

with pytest.raises(ValidatorDetectError):
validate_request(request, spec=spec)
validate_request(request, spec=spec_v30)

@mock.patch(
"openapi_core.validation.request.validators.WebhookRequestValidator."
"validate",
)
def test_webhook_request_error(self, mock_validate):
spec = {"openapi": "3.1"}
def test_webhook_request_error(self, mock_validate, spec_v31):
request = mock.Mock(spec=WebhookRequest)
mock_validate.return_value = ResultMock(error_to_raise=ValueError)

with pytest.raises(ValueError):
validate_request(request, spec=spec)
validate_request(request, spec=spec_v31)

mock_validate.aasert_called_once_with(request)

def test_webhook_validator_cls(self):
spec = mock.sentinel.spec
def test_webhook_validator_cls(self, spec_v31):
request = mock.Mock(spec=WebhookRequest)
validator_cls = mock.Mock(spec=WebhookRequestValidator)

result = validate_request(request, spec=spec, cls=validator_cls)
result = validate_request(request, spec=spec_v31, cls=validator_cls)

assert result == validator_cls().validate.return_value
validator_cls().validate.aasert_called_once_with(request)


class TestValidateResponse:
def test_spec_not_detected(self):
spec = {}
def test_spec_not_detected(self, spec_invalid):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)

with pytest.raises(ValidatorDetectError):
validate_response(request, response, spec=spec)
validate_response(request, response, spec=spec_invalid)

def test_request_type_error(self):
spec = {"openapi": "3.1"}
def test_request_type_error(self, spec_v31):
request = mock.sentinel.request
response = mock.Mock(spec=Response)

with pytest.raises(TypeError):
validate_response(request, response, spec=spec)
validate_response(request, response, spec=spec_v31)

def test_response_type_error(self):
spec = {"openapi": "3.1"}
def test_response_type_error(self, spec_v31):
request = mock.Mock(spec=Request)
response = mock.sentinel.response

with pytest.raises(TypeError):
validate_response(request, response, spec=spec_v31)

def test_spec_type_error(self):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)
spec = mock.sentinel.spec

with pytest.raises(TypeError):
validate_response(request, response, spec=spec)

@mock.patch(
"openapi_core.validation.response.validators.ResponseValidator."
"validate",
)
def test_request_response(self, mock_validate):
spec = {"openapi": "3.1"}
def test_request_response(self, mock_validate, spec_v31):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)

result = validate_response(request, response, spec=spec_v31)

assert result == mock_validate.return_value
mock_validate.aasert_called_once_with(request, response)

@mock.patch(
"openapi_core.validation.response.validators.ResponseValidator."
"validate",
)
def test_spec_as_first_arg_deprecated(self, mock_validate, spec_v31):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)

result = validate_response(request, response, spec=spec)
result = validate_response(spec_v31, request, response)

assert result == mock_validate.return_value
mock_validate.aasert_called_once_with(request, response)
Expand All @@ -166,62 +194,57 @@ def test_request_response(self, mock_validate):
"openapi_core.validation.response.validators.ResponseValidator."
"validate",
)
def test_request_response_error(self, mock_validate):
spec = {"openapi": "3.1"}
def test_request_response_error(self, mock_validate, spec_v31):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)
mock_validate.return_value = ResultMock(error_to_raise=ValueError)

with pytest.raises(ValueError):
validate_response(request, response, spec=spec)
validate_response(request, response, spec=spec_v31)

mock_validate.aasert_called_once_with(request, response)

def test_validator(self):
spec = mock.sentinel.spec
def test_validator(self, spec_v31):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)
validator = mock.Mock(spec=ResponseValidator)

with pytest.warns(DeprecationWarning):
result = validate_response(
request, response, spec=spec, validator=validator
request, response, spec=spec_v31, validator=validator
)

assert result == validator.validate.return_value
validator.validate.aasert_called_once_with(request)

def test_validator_cls(self):
spec = mock.sentinel.spec
def test_validator_cls(self, spec_v31):
request = mock.Mock(spec=Request)
response = mock.Mock(spec=Response)
validator_cls = mock.Mock(spec=ResponseValidator)

result = validate_response(
request, response, spec=spec, cls=validator_cls
request, response, spec=spec_v31, cls=validator_cls
)

assert result == validator_cls().validate.return_value
validator_cls().validate.aasert_called_once_with(request)

def test_webhook_response_validator_not_found(self):
spec = {"openapi": "3.0"}
def test_webhook_response_validator_not_found(self, spec_v30):
request = mock.Mock(spec=WebhookRequest)
response = mock.Mock(spec=Response)

with pytest.raises(ValidatorDetectError):
validate_response(request, response, spec=spec)
validate_response(request, response, spec=spec_v30)

@mock.patch(
"openapi_core.validation.response.validators.WebhookResponseValidator."
"validate",
)
def test_webhook_request(self, mock_validate):
spec = {"openapi": "3.1"}
def test_webhook_request(self, mock_validate, spec_v31):
request = mock.Mock(spec=WebhookRequest)
response = mock.Mock(spec=Response)

result = validate_response(request, response, spec=spec)
result = validate_response(request, response, spec=spec_v31)

assert result == mock_validate.return_value
mock_validate.aasert_called_once_with(request, response)
Expand All @@ -230,25 +253,23 @@ def test_webhook_request(self, mock_validate):
"openapi_core.validation.response.validators.WebhookResponseValidator."
"validate",
)
def test_webhook_request_error(self, mock_validate):
spec = {"openapi": "3.1"}
def test_webhook_request_error(self, mock_validate, spec_v31):
request = mock.Mock(spec=WebhookRequest)
response = mock.Mock(spec=Response)
mock_validate.return_value = ResultMock(error_to_raise=ValueError)

with pytest.raises(ValueError):
validate_response(request, response, spec=spec)
validate_response(request, response, spec=spec_v31)

mock_validate.aasert_called_once_with(request, response)

def test_webhook_response_cls(self):
spec = mock.sentinel.spec
def test_webhook_response_cls(self, spec_v31):
request = mock.Mock(spec=WebhookRequest)
response = mock.Mock(spec=Response)
validator_cls = mock.Mock(spec=WebhookResponseValidator)

result = validate_response(
request, response, spec=spec, cls=validator_cls
request, response, spec=spec_v31, cls=validator_cls
)

assert result == validator_cls().validate.return_value
Expand Down