def test_enum_error(monkeypatch): logger = MagicMock() monkeypatch.setattr('connexion.decorators.validation.logger', logger) value = 'INVALID' param = {'schema': {'type': 'string', 'enum': ['valid']}, 'name': 'test_path_param'} result = ParameterValidator.validate_parameter('path', value, param) assert result.startswith("'INVALID' is not one of ['valid']")
def test_get_nullable_parameter(): param = { 'type': 'number', 'required': True, 'name': 'foo', 'x-nullable': True } result = ParameterValidator.validate_parameter('formdata', 'None', param) assert result is None
def test_invalid_type_value_error(monkeypatch): logger = MagicMock() monkeypatch.setattr('connexion.decorators.validation.logger', logger) value = {'test': 1, 'second': 2} result = ParameterValidator.validate_parameter('formdata', value, { 'type': 'boolean', 'name': 'foo' }) assert result == "Wrong type, expected 'boolean' for formdata parameter 'foo'"
def test_get_nullable_parameter(): param = { 'schema': { 'type': 'number', 'nullable': True }, 'required': True, 'name': 'foo' } result = ParameterValidator.validate_parameter('query', 'null', param) assert result is None
def test_get_explodable_object_parameter(): param = { 'schema': { 'type': 'object', 'additionalProperties': True }, 'required': True, 'name': 'foo', 'style': 'deepObject', 'explode': True } result = ParameterValidator.validate_parameter('query', {'bar': 1}, param) assert result is None
def test_enum_error(monkeypatch): logger = MagicMock() monkeypatch.setattr('connexion.decorators.validation.logger', logger) value = 'INVALID' param = { 'schema': { 'type': 'string', 'enum': ['valid'] }, 'name': 'test_path_param' } result = ParameterValidator.validate_parameter('path', value, param) assert result.startswith("'INVALID' is not one of ['valid']")
def test_invalid_type(monkeypatch): logger = MagicMock() monkeypatch.setattr('connexion.decorators.validation.logger', logger) result = ParameterValidator.validate_parameter('formdata', 20, {'type': 'string', 'name': 'foo'}) expected_result = """20 is not of type 'string' Failed validating 'type' in schema: {'name': 'foo', 'type': 'string'} On instance: 20""" assert result == expected_result logger.info.assert_called_once()
def test_get_valid_parameter_with_enum_array_header(): value = 'VALUE1,VALUE2' param = { 'schema': { 'type': 'array', 'items': { 'type': 'string', 'enum': ['VALUE1', 'VALUE2'] } }, 'name': 'test_header_param' } result = ParameterValidator.validate_parameter('header', value, param) assert result is None
def test_invalid_type(monkeypatch): logger = MagicMock() monkeypatch.setattr('connexion.decorators.validation.logger', logger) result = ParameterValidator.validate_parameter('formdata', 20, { 'type': 'string', 'name': 'foo' }) expected_result = """20 is not of type 'string' Failed validating 'type' in schema: {'name': 'foo', 'type': 'string'} On instance: 20""" assert result == expected_result logger.info.assert_called_once()
def test_parameter_validator(monkeypatch): request = MagicMock(name='request') request.args = {} request.headers = {} request.params = {} app = MagicMock(name='app') app.response_class = lambda a, mimetype, status: json.loads(a)['detail'] monkeypatch.setattr('flask.request', request) monkeypatch.setattr('flask.current_app', app) def orig_handler(*args, **kwargs): return 'OK' params = [{'name': 'p1', 'in': 'path', 'type': 'integer', 'required': True}, {'name': 'h1', 'in': 'header', 'type': 'string', 'enum': ['a', 'b']}, {'name': 'q1', 'in': 'query', 'type': 'integer', 'maximum': 3}, {'name': 'a1', 'in': 'query', 'type': 'array', 'items': {'type': 'integer', 'minimum': 0}}] validator = ParameterValidator(params) handler = validator(orig_handler) assert handler() == "Missing path parameter 'p1'" assert handler(p1='123') == 'OK' assert handler(p1='') == "Wrong type, expected 'integer' for path parameter 'p1'" assert handler(p1='foo') == "Wrong type, expected 'integer' for path parameter 'p1'" assert handler(p1='1.2') == "Wrong type, expected 'integer' for path parameter 'p1'" request.args = {'q1': '4'} assert handler(p1=1).startswith('4 is greater than the maximum of 3') request.args = {'q1': '3'} assert handler(p1=1) == 'OK' request.args = {'a1': "1,2"} assert handler(p1=1) == "OK" request.args = {'a1': "1,a"} assert handler(p1=1).startswith("'a' is not of type 'integer'") request.args = {'a1': "1,-1"} assert handler(p1=1).startswith("-1 is less than the minimum of 0") del request.args['a1'] request.headers = {'h1': 'a'} assert handler(p1='123') == 'OK' request.headers = {'h1': 'x'} assert handler(p1='123').startswith("'x' is not one of ['a', 'b']")
def test_formdata_extra_parameter_strict(): """Tests that connexion handles explicitly defined formData parameters well across Swagger 2 and OpenApi 3. In Swagger 2, any formData parameter should be defined explicitly, while in OpenAPI 3 this is not allowed. See issues #1020 #1160 #1340 #1343.""" request = MagicMock(form={'param': 'value', 'extra_param': 'extra_value'}) # OAS3 validator = ParameterValidator([], FlaskApi, strict_validation=True) errors = validator.validate_formdata_parameter_list(request) assert not errors # Swagger 2 validator = ParameterValidator([{ 'in': 'formData', 'name': 'param' }], FlaskApi, strict_validation=True) errors = validator.validate_formdata_parameter_list(request) assert errors
def test_get_missing_required_parameter(): param = {'type': 'number', 'required': True, 'name': 'foo'} result = ParameterValidator.validate_parameter('formdata', None, param) assert result == "Missing formdata parameter 'foo'"
def test_get_valid_parameter_with_required_attr(): param = {'type': 'number', 'required': True, 'name': 'foobar'} result = ParameterValidator.validate_parameter('formdata', 20, param) assert result is None
def test_parameter_validator(monkeypatch): request = MagicMock(name='request') request.args = {} request.headers = {} request.cookies = {} request.params = {} app = MagicMock(name='app') app.response_class = flask.Response monkeypatch.setattr('flask.request', request) monkeypatch.setattr('flask.current_app', app) def orig_handler(*args, **kwargs): return 'OK' params = [{ 'name': 'p1', 'in': 'path', 'type': 'integer', 'required': True }, { 'name': 'h1', 'in': 'header', 'type': 'string', 'enum': ['a', 'b'] }, { 'name': 'c1', 'in': 'cookie', 'type': 'string', 'enum': ['a', 'b'] }, { 'name': 'q1', 'in': 'query', 'type': 'integer', 'maximum': 3 }, { 'name': 'a1', 'in': 'query', 'type': 'array', 'minItems': 2, 'maxItems': 3, 'items': { 'type': 'integer', 'minimum': 0 } }] validator = ParameterValidator(params, FlaskApi) handler = validator(orig_handler) kwargs = {'query': {}, 'headers': {}, 'cookies': {}} request = MagicMock(path_params={}, **kwargs) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail == "Missing path parameter 'p1'" request = MagicMock(path_params={'p1': '123'}, **kwargs) assert handler(request) == 'OK' request = MagicMock(path_params={'p1': ''}, **kwargs) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail == "Wrong type, expected 'integer' for path parameter 'p1'" request = MagicMock(path_params={'p1': 'foo'}, **kwargs) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail == "Wrong type, expected 'integer' for path parameter 'p1'" request = MagicMock(path_params={'p1': '1.2'}, **kwargs) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail == "Wrong type, expected 'integer' for path parameter 'p1'" request = MagicMock(path_params={'p1': 1}, query={'q1': '4'}, headers={}) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail.startswith('4 is greater than the maximum of 3') request = MagicMock(path_params={'p1': 1}, query={'q1': '3'}, headers={}, cookies={}) assert handler(request) == 'OK' request = MagicMock(path_params={'p1': 1}, query={'a1': ['1', '2']}, headers={}, cookies={}) assert handler(request) == "OK" request = MagicMock(path_params={'p1': 1}, query={'a1': ['1', 'a']}, headers={}) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail.startswith("'a' is not of type 'integer'") request = MagicMock(path_params={'p1': '123'}, query={}, headers={}, cookies={'c1': 'b'}) assert handler(request) == 'OK' request = MagicMock(path_params={'p1': '123'}, query={}, headers={}, cookies={'c1': 'x'}) with pytest.raises(BadRequestProblem) as exc: assert handler(request) assert exc.value.detail.startswith("'x' is not one of ['a', 'b']") request = MagicMock(path_params={'p1': 1}, query={'a1': ['1', '-1']}, headers={}) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail.startswith("-1 is less than the minimum of 0") request = MagicMock(path_params={'p1': 1}, query={'a1': ['1']}, headers={}) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail.startswith("[1] is too short") request = MagicMock(path_params={'p1': 1}, query={'a1': ['1', '2', '3', '4']}, headers={}) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail.startswith("[1, 2, 3, 4] is too long") request = MagicMock(path_params={'p1': '123'}, query={}, headers={'h1': 'a'}, cookies={}) assert handler(request) == 'OK' request = MagicMock(path_params={'p1': '123'}, query={}, headers={'h1': 'x'}) with pytest.raises(BadRequestProblem) as exc: handler(request) assert exc.value.detail.startswith("'x' is not one of ['a', 'b']")
def test_invalid_type_value_error(monkeypatch): logger = MagicMock() monkeypatch.setattr('connexion.decorators.validation.logger', logger) value = {'test': 1, 'second': 2} result = ParameterValidator.validate_parameter('formdata', value, {'type': 'boolean', 'name': 'foo'}) assert result == "Wrong type, expected 'boolean' for formdata parameter 'foo'"
def test_get_valid_parameter(): result = ParameterValidator.validate_parameter('formdata', 20, {'type': 'number', 'name': 'foobar'}) assert result is None
def test_get_nullable_parameter(): param = {'type': 'number', 'required': True, 'name': 'foo', 'x-nullable': True} result = ParameterValidator.validate_parameter('formdata', 'None', param) assert result is None
def test_get_valid_path_parameter(): param = {'required': True, 'schema': {'type': 'number'}, 'name': 'foobar'} result = ParameterValidator.validate_parameter('path', 20, param) assert result is None
def test_get_nullable_parameter(): param = {'schema': {'type': 'number', 'nullable': True}, 'required': True, 'name': 'foo'} result = ParameterValidator.validate_parameter('query', 'null', param) assert result is None
def validate_parameter(*args, **kwargs): result = ParameterValidator.validate_parameter(*args, **kwargs) if result is not None: raise DSSBindingException(result) return result
def test_get_valid_parameter(): result = ParameterValidator.validate_parameter('formdata', 20, { 'type': 'number', 'name': 'foobar' }) assert result is None
def test_parameter_validator(monkeypatch): request = MagicMock(name='request') request.args = {} request.headers = {} request.params = {} app = MagicMock(name='app') app.response_class = lambda a, mimetype, status: json.loads(a)['detail'] monkeypatch.setattr('flask.request', request) monkeypatch.setattr('flask.current_app', app) def orig_handler(*args, **kwargs): return 'OK' params = [{ 'name': 'p1', 'in': 'path', 'type': 'integer', 'required': True }, { 'name': 'h1', 'in': 'header', 'type': 'string', 'enum': ['a', 'b'] }, { 'name': 'q1', 'in': 'query', 'type': 'integer', 'maximum': 3 }, { 'name': 'a1', 'in': 'query', 'type': 'array', 'items': { 'type': 'integer', 'minimum': 0 } }] validator = ParameterValidator(params) handler = validator(orig_handler) assert handler() == "Missing path parameter 'p1'" assert handler(p1='123') == 'OK' assert handler( p1='') == "Wrong type, expected 'integer' for path parameter 'p1'" assert handler( p1='foo') == "Wrong type, expected 'integer' for path parameter 'p1'" assert handler( p1='1.2') == "Wrong type, expected 'integer' for path parameter 'p1'" request.args = {'q1': '4'} assert handler(p1=1) == 'Invalid value, must be at most 3' request.args = {'q1': '3'} assert handler(p1=1) == 'OK' request.args = {'a1': '1,2'} assert handler(p1=1) == "OK" request.args = {'a1': '1,a'} assert handler( p1=1) == "Wrong type, expected 'integer' for query parameter 'a1'" request.args = {'a1': '1,-1'} assert handler(p1=1) == "Invalid value, must be at least 0" del request.args['a1'] request.headers = {'h1': 'a'} assert handler(p1='123') == 'OK' request.headers = {'h1': 'x'} assert handler(p1='123') == "Enum value must be one of ['a', 'b']"