예제 #1
0
 def test_translates_validations_with_custom_messages_on_constructor(self):
     validator = Validator(
         rules={'email': ['required', 'email']},
         request={'email': ''},
         messages={
             'email.required': 'Kindly provide the email',
             'email.email': 'Whoa! That is not valid',
         }
     )
     self.assertTrue(validator.fails())
     self.assertDictEqual({
         'email': [
             'Kindly provide the email',
             'Whoa! That is not valid'
         ]
     }, validator.messages())
예제 #2
0
    def test_handles_different_types_of_requests(self):
        class MockMultiDict:
            def to_dict(self, flat=None):
                return {'field': 1}

        class MockRequest:
            def __init__(self):
                self.is_json = True
                self.form = self.files = MockMultiDict()
                self.json = self.form.to_dict()

        request = MockRequest()
        validator = Validator(request=request, rules={'field': ['numeric']})
        self.assertTrue(validator.passes())
        request.is_json = False
        validator.set_request(request)
        self.assertTrue(validator.passes())
예제 #3
0
class FormRequest:
    def __init__(self, request=None):
        request = request or flask_request
        self._validator = Validator(rules=self.rules(), request=request)
        self._validator.set_custom_messages(self.messages())
        self._validator.set_custom_handlers(self.custom_handlers())

    def validate(self):
        if self._validator.fails():
            raise ValidationException(self._validator.messages())
        return True

    @staticmethod
    def messages():
        return {}

    @staticmethod
    def custom_handlers():
        return {}
예제 #4
0
 def __init__(self, request=None):
     request = request or flask_request
     self._validator = Validator(rules=self.rules(), request=request)
     self._validator.set_custom_messages(self.messages())
     self._validator.set_custom_handlers(self.custom_handlers())
예제 #5
0
 def __init__(self, request=None):
     request = request or flask_request
     if not request.is_json:
         raise ValidationException({'request': 'Request must be valid JSON'})
     self._validator = Validator(rules=self.rules(), request=request)
예제 #6
0
 def setUp(self):
     self._validator = Validator()
예제 #7
0
class TestValidator(unittest.TestCase):
    def setUp(self):
        self._validator = Validator()

    def test_translates_validations(self):
        self.set_validator_params(
            rules={'email': ['required', 'email']},
            request={'email': 'invalid_email'},
        )
        self.assertTrue(self._validator.fails())
        self.assertIn('valid email', str(self._validator.messages()))

    def test_translates_validations_with_param(self):
        self.set_validator_params(
            rules={'name': ['required', 'string', 'min:6']},
            request={'name': 'joe'},
        )
        self.assertTrue(self._validator.fails())
        self.assertIn('6 characters', str(self._validator.messages()))

    def test_translates_validations_with_rest_params(self):
        self.set_validator_params(
            rules={'name': ['required_unless:email,[email protected],[email protected]']},
            request={'email': '*****@*****.**'}
        )
        self.assertTrue(self._validator.fails())
        self.assertIn('required unless', str(self._validator.messages()))

    def test_translates_validations_with_all_params(self):
        self.set_validator_params(
            rules={'name': ['required_with:email,age']},
            request={'email': '*****@*****.**', 'age': 2}
        )
        self.assertTrue(self._validator.fails())
        self.assertIn('required when', str(self._validator.messages()))

    def test_handles_different_types_of_requests(self):
        class MockMultiDict:
            def to_dict(self, flat=None):
                return {'field': 1}

        class MockRequest:
            def __init__(self):
                self.is_json = True
                self.form = self.files = MockMultiDict()
                self.json = self.form.to_dict()


        request = MockRequest()
        validator = Validator(request=request, rules={'field': ['numeric']})
        self.assertTrue(validator.passes())
        request.is_json = False
        validator.set_request(request)
        self.assertTrue(validator.passes())


    def test_validate_decorator(self):
        class FailingRequest:
            def validate(self):
                raise ValueError()
        @validate(FailingRequest)
        def failing_request_endpoint():
            pass
        with self.assertRaises(ValueError):
            failing_request_endpoint()

        class PassingRequest:
            def validate(self):
                pass
        @validate(PassingRequest)
        def passing_request_endpoint():
            return True
        self.assertTrue(passing_request_endpoint())

    def test_translates_validations_with_custom_messages(self):
        self.set_validator_params(
            rules={'email': ['required', 'email']},
            request={'email': ''}
        )
        self._validator.set_custom_messages({
            'email.required': 'Kindly provide the email',
            'email.email': 'Whoa! That is not valid',
        })
        self.assertTrue(self._validator.fails())
        self.assertDictEqual({
            'email': [
                'Kindly provide the email',
                'Whoa! That is not valid'
            ]
        }, self._validator.messages())

    def test_translates_validations_with_custom_handler(self):
        def validate_odd(value, **kwargs):
            return int(value) % 2
        self._validator.register_rule_handler(
            handler=validate_odd,
            message='This number must be odd.',
            params_count=0
        )
        self.set_validator_params(
            rules={'number': ['odd']},
            request={'number': 4}
        )
        self.assertTrue(self._validator.fails())
        self.assertDictEqual({
            'number': [
                'This number must be odd.'
            ]
        }, self._validator.messages())
        self.set_validator_params(
            rules={'number': ['odd']},
            request={'number': 3}
        )
        self.assertTrue(self._validator.passes())

    def test_cannot_set_custom_handler_without_validate_keyword(self):
        def method_odd(value, **kwargs):
            return int(value) % 2
        with self.assertRaises(ValueError):
            self._validator.register_rule_handler(
                handler=method_odd,
                message='This number must be odd.',
                params_count=0
            )

    def set_validator_params(self, rules=None, request=None):
        rules = rules or {}
        request = request or {}
        self._validator.set_rules(rules)
        self._validator.set_request(request)