Exemple #1
0
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']")
Exemple #2
0
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
Exemple #3
0
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'"
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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()
Exemple #8
0
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
Exemple #9
0
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()
Exemple #10
0
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']")
Exemple #11
0
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
Exemple #12
0
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'"
Exemple #13
0
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
Exemple #14
0
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_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_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
Exemple #19
0
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
Exemple #20
0
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
Exemple #21
0
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
Exemple #22
0
 def validate_parameter(*args, **kwargs):
     result = ParameterValidator.validate_parameter(*args, **kwargs)
     if result is not None:
         raise DSSBindingException(result)
     return result
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'"
Exemple #24
0
def test_get_valid_parameter():
    result = ParameterValidator.validate_parameter('formdata', 20, {
        'type': 'number',
        'name': 'foobar'
    })
    assert result is None
Exemple #25
0
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']"