Skip to content

Fix raising exception on multiple schemas #119

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
11 changes: 7 additions & 4 deletions flask_accepts/decorators/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,13 @@ def inner(*args, **kwargs):
f"Error parsing request body: {schema_error}"
)
if hasattr(error, "data"):
error.data["errors"].update({"schema_errors": schema_error})
error.data["errors"].setdefault('schema_errors', {}).update(schema_error)
else:
error.data = {"schema_errors": schema_error}

# Handle Marshmallow schema for query params
if query_params_schema:
schema_error = None
request_args = _convert_multidict_values_to_schema(
request.args,
query_params_schema)
Expand All @@ -155,12 +156,13 @@ def inner(*args, **kwargs):
f"Error parsing query params: {schema_error}"
)
if hasattr(error, "data"):
error.data["errors"].update({"schema_errors": schema_error})
error.data["errors"].setdefault('schema_errors', {}).update(schema_error)
else:
error.data = {"schema_errors": schema_error}

# Handle Marshmallow schema for headers
if headers_schema:
schema_error = None
request_headers = _convert_multidict_values_to_schema(
request.headers,
headers_schema)
Expand All @@ -175,12 +177,13 @@ def inner(*args, **kwargs):
f"Error parsing headers: {schema_error}"
)
if hasattr(error, "data"):
error.data["errors"].update({"schema_errors": schema_error})
error.data["errors"].setdefault('schema_errors', {}).update(schema_error)
else:
error.data = {"schema_errors": schema_error}

# Handle Marshmallow schema for form data
if form_schema:
schema_error = None
request_form = _convert_multidict_values_to_schema(
request.form,
form_schema)
Expand All @@ -195,7 +198,7 @@ def inner(*args, **kwargs):
f"Error parsing form data: {schema_error}"
)
if hasattr(error, "data"):
error.data["errors"].update({"schema_errors": schema_error})
error.data["errors"].setdefault('schema_errors', {}).update(schema_error)
else:
error.data = {"schema_errors": schema_error}

Expand Down
34 changes: 34 additions & 0 deletions flask_accepts/decorators/decorators_test.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from pytest import mark
from flask import request
from flask_restx import Resource, Api
from marshmallow import Schema, fields
Expand Down Expand Up @@ -303,6 +304,39 @@ def test():
assert resp.status_code == 400


@mark.parametrize('url,data,expected_code,expected_body', [
('/test?foo=12', '{"bar": "yo"}', 200, {'success': True}),
('/test', '{"bar": "yo"}', 200, {'success': True}),
('/test', '{"bar": 1}', 400, {'schema_errors': {'bar': ['Not a valid string.']}}),
('/test?foo=yeah', '{"bar": 1}', 400, {'errors': {'foo': "invalid literal for int() with base 10: 'yeah'",
'schema_errors': {'bar': ['Not a valid string.'],
'foo': ['Not a valid integer.']}},
'message': 'Input payload validation failed'}),
])
def test_failure_when_both_query_param_and_request_schema_are_provided(
url, data, expected_code, expected_body, app, client,
): # noqa
api = Api(app)

class TestSchema(Schema):
bar = fields.String(required=True)

class TestQuerySchema(Schema):
foo = fields.Integer(required=False, missing=None, default=None)

@api.route("/test")
class TestResource(Resource):
@accepts(schema=TestSchema, query_params_schema=TestQuerySchema, api=api)
def post(self):
return {'success': True}

with client as cl:
#
resp = cl.post(url, data=data, content_type='application/json')
assert resp.status_code == expected_code
assert resp.json == expected_body


def test_accepts_with_header_schema_single_value(app, client): # noqa
class TestSchema(Schema):
Foo = fields.Integer(required=True)
Expand Down