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)
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)))
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
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'))
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'))
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]
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)
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))
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]
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))
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'))
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'))
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'
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'
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'