"""Tests for handler_utils module.""" import json import application import marshmallow from oto import response from oto import status as response_code from oto.adaptors.flask import flaskify import pytest from conflict_manager.constants import header as header_const from conflict_manager.utils import handler_utils class _TestSchema(marshmallow.Schema): name = marshmallow.fields.Str(required=True) @pytest.fixture def json_headers(): """JSON Headers Fixture.""" return {header_const.CONTENT_TYPE: header_const.APPLICATION_JSON} @handler_utils.parse_and_validate_request_json(_TestSchema) def _handler_for_test_schema(json_data): return flaskify(response.Response(message={})) def test_parse_and_validate_request_json(json_headers): """Test parsing and validating request JSON.""" request_data = {'name': 'Snowball'} with application.app.test_request_context( headers=json_headers, data=json.dumps(request_data)): res = _handler_for_test_schema() assert res.status_code == response_code.OK @pytest.mark.parametrize('data', [ b'true', b'null', b"''", b'[]', b'', b'{"items": [}']) def test_parse_and_validate_request_json_invalid_data(json_headers, data): """Test non-dict values returns a bad request.""" with application.app.test_request_context( headers=json_headers, data=data): res = _handler_for_test_schema() assert res.status_code == response_code.BAD_REQUEST def test_parse_and_validate_request_json_invalid_headers(): """Test missing header data returns a bad request.""" request_data = {'name': 'Snowball'} with application.app.test_request_context(data=json.dumps(request_data)): res = _handler_for_test_schema() assert res.status_code == response_code.BAD_REQUEST def test_parse_and_validate_request_json_missing_required_field(json_headers): """Test schema validator returns error.""" request_data = {} with application.app.test_request_context( headers=json_headers, data=json.dumps(request_data)): res = _handler_for_test_schema() res_body = json.loads(res.data.decode()) assert res.status_code == response_code.BAD_REQUEST assert res_body['code'] == 'validation_error'