Esempio n. 1
0
def test_readonly_validator():
    validator = RequestValidator(fields=dict(a=dict(readonly=True)))
    with pytest.raises(HTTPBadRequest):
        validator(dict(a=None))

    validator = RequestValidator(fields=dict(a=dict(
        not_none='666 a is readonly')))
    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a=None))
    assert '666 a is readonly' == str(ctx.value)
Esempio n. 2
0
def test_not_none_validator():
    validator = RequestValidator(fields=dict(a=dict(not_none=True)))
    assert dict(a=1, b=2) == validator(dict(a=1, b=2))[0]
    assert dict(b=2) == validator(dict(b=2))[0]

    with pytest.raises(HTTPBadRequest):
        validator(dict(a=None))

    validator = RequestValidator(fields=dict(a=dict(not_none='666 a is null')))
    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a=None))
    assert '666 a is null' == str(ctx.value)

    with pytest.raises(TypeError):
        RequestValidator(fields=dict(a=dict(not_none=23)))
Esempio n. 3
0
def test_validation_max_length():
    validator = RequestValidator(fields=dict(a=dict(max_length=4)))
    assert dict(a='abcd') == validator(dict(a='abcd'))[0]

    # Longer than Expectation
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='abbcde'))
def test_httpstatus_as_validation_error():
    class MyStatusMin(HTTPStatus):
        status = '600 Greater than the minimum length'

    class MyStatusMax(HTTPStatus):
        status = '601 Greater than the maximum length'

    class MyStatusPattern(HTTPStatus):
        status = '602 Invalid input format'

    validator = RequestValidator(fields=dict(
        foo=dict(min_length=(2, MyStatusMin),
                 max_length=(5, MyStatusMax),
                 pattern=(r'^[A-Z]*$', MyStatusPattern))))

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(foo='A'))

    assert str(ctx.value) == MyStatusMin.status

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(foo=(5 + 1) * 'A'))

    assert str(ctx.value) == MyStatusMax.status

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(foo='abc'))

    assert str(ctx.value) == MyStatusPattern.status
Esempio n. 5
0
def test_validation_pattern():
    validator = RequestValidator(fields=dict(a=dict(pattern=r'^\D{5}$')))

    assert dict(a='abcdJ') == validator(dict(a='abcdJ'))[0]

    # Param1 not matching
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='asc'))
Esempio n. 6
0
def test_validation_min_length():

    validator = RequestValidator(fields=dict(a=dict(min_length=3)))
    assert dict(a='abc') == validator(dict(a='abc'))[0]

    # Shorter than Expectation
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='ab'))
Esempio n. 7
0
def test_validation_pattern_compiled():
    validator = RequestValidator(fields=dict(a=dict(
        pattern=re.compile(r'^\d{5}$'))))

    assert dict(a='01234') == validator(dict(a='01234'))[0]

    # Param1 not matching
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='123456'))
def test_not_null():
    class Myclass(HTTPStatus):
        status = '666 a is readonly'

    validator = RequestValidator(fields=dict(foo=dict(not_none=Myclass)))

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(foo=None))

    assert Myclass.status == str(ctx.value)
def test_validation_required_as_httpstatus():
    class Myclass(HTTPStatus):
        status = '600 Custom exception'

    validator = RequestValidator(fields=dict(foo=dict(required=Myclass)))

    with pytest.raises(HTTPStatus(Myclass).__class__):
        validator(dict(another_param='value1'))

    assert dict(foo='value1') == validator(dict(foo='value1'))[0]
Esempio n. 10
0
def test_localization():
    class Myclass(HTTPStatus):
        status = '605 لورم ایپسوم'

    validator = RequestValidator(fields=dict(foo=dict(not_none=Myclass)))

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(foo=None))

    assert Myclass.status == str(ctx.value)
Esempio n. 11
0
def test_validation_min():

    validator = RequestValidator(fields=dict(a=dict(minimum=10)))

    assert dict(a=11) == validator(dict(a=11))[0]
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='11'))

    # Less than Expectation
    with pytest.raises(HTTPBadRequest):
        validator(dict(a=9))
Esempio n. 12
0
def test_validation_required():

    validator = RequestValidator(fields=dict(a=dict(required=True)))

    # Trying to pass with a
    assert dict(a='value1') == validator(dict(a='value1'))[0]

    # Trying to pass without a
    with pytest.raises(HTTPBadRequest):
        validator(dict(another_param='value1'))

    # Define required validation with custom exception
    validator = RequestValidator(fields=dict(a=dict(
        required='600 Custom exception')))

    # Trying to pass with another param without a
    with pytest.raises(HTTPStatus('600 Custom exception').__class__):
        validator(dict(another_param='value1'))

    # Trying to pass with a
    assert dict(a='value1') == validator(dict(a='value1'))[0]
Esempio n. 13
0
def test_callable_validator():
    def f(age, container, field):
        age = int(age)
        if age < 0:
            raise ValueError('Age is not in valid range')
        return age

    validator = RequestValidator(fields=dict(a=f))

    assert dict(a=12).items() == validator(dict(a=12))[0].items()

    with pytest.raises(ValueError):
        validator(dict(a=-1))
Esempio n. 14
0
def test_validation_type():
    validator = RequestValidator(fields=dict(
        a=dict(type_=int), b=dict(type_=str), c=dict(type_=Decimal)))

    assert dict(a=123, b='123', c=1.23) == \
        validator(dict(a='123', b=123, c=1.23))[0]

    # Param1 bad value(Cannot be converted to int)
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='NotInteger', ))

    # Param3 bad value(Cannot be converted to decimal)
    with pytest.raises(HTTPBadRequest):
        validator(dict(c='NotDecimal'))
Esempio n. 15
0
def test_validation_max():

    validator = RequestValidator(fields=dict(a=dict(maximum=10)))
    assert dict(a=9) == validator(dict(a=9))[0]
    assert dict(a=None) == validator(dict(a=None))[0]

    with pytest.raises(HTTPBadRequest):
        validator(dict(a='9'))

    # More than Expectation
    with pytest.raises(HTTPBadRequest):
        validator(dict(a=11))

    # Not int input
    with pytest.raises(HTTPBadRequest):
        validator(dict(a='a'))
Esempio n. 16
0
def test_validation_custom_status():
    validator = RequestValidator(fields=dict(a=dict(
        type_=(int, '999 Type error'),
        minimum=(3, '666'),
        maximum=(4, '667 greater than maximum'),
    )))

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a='NotInteger'))
    assert str(ctx.value) == '999 Type error'

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a=2))
    assert str(ctx.value) == '666 Bad request'

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a=5))
    assert str(ctx.value) == '667 greater than maximum'
Esempio n. 17
0
def test_priority_validation():

    # This validator first checking the minimum and maximumi, then pattern
    validator = RequestValidator(fields=dict(
        a=dict(min_length=(2, '600 Greater than the minimum length'),
               max_length=(5, '601 Greater than the maximum length'),
               pattern=(r'^[A-Z]*$', '602 Invalid input format'))))

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a='A'))
    assert str(ctx.value) == '600 Greater than the minimum length'

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a=(5 + 1) * 'A'))
    assert str(ctx.value) == '601 Greater than the maximum length'

    with pytest.raises(HTTPStatus) as ctx:
        validator(dict(a='abc'))
    assert str(ctx.value) == '602 Invalid input format'
Esempio n. 18
0
def test_validation_query_string():
    validator = RequestValidator(fields=dict(a=dict(query=True), ))

    # Accept query_string
    assert dict(a='value') == validator(query=dict(a='value'))[1]
def test_validation(db):
    session = db()
    email = '*****@*****.**'

    validate = RequestValidator(Actor.create_validation_rules(strict=True))
    values, querystring = validate(dict(email=email, ))
    assert values['email'] == email

    # Not None
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=None))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '701 email cannot be null'

    # Required
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(title='required-test-case'))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '702 email required'

    # Minimum length
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=email, title='abc'))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '703 title must be at least 4 characters'

    # Mamimum length
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=email, title='a' * (50 + 1)))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '704 Maximum allowed length for title is 50'

    # Type
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=email, title='abcd', age='a'))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '705 age must be integer'

    # Minimum
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=email, title='abcd', age=18 - 1))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '706 age must be greater than 17'

    # Maximum
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=email, title='abcd', age=99 + 1))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '706 age must be less than 100'

    # Pattern
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email='invalidemail'))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '707 Invalid email address'

    # Readonly
    with pytest.raises(HTTPStatus) as ctx:
        validate(dict(email=email, id=22))
    assert issubclass(ctx.type, HTTPStatus)
    assert isinstance(ctx.value, HTTPStatus)
    assert str(ctx.value) == '709 id is readonly'