예제 #1
0
    def test_single_parameter(self) -> None:
        parameter = Parameter(name='x', validators=[MaxLength(3)])
        converted_value = parameter.validate(value='hed')
        self.assertEqual(converted_value, 'hed')

        with self.assertRaises(expected_exception=ParameterException):
            parameter.validate(value='hello world')
예제 #2
0
            class Foo:
                @validate(Parameter(name='k', value_type=int, validators=[Min(42)]),
                          return_as=ReturnAs.KWARGS_WITHOUT_NONE)
                async def bar(self, k):
                    return k

                @validate(Parameter(name='k', value_type=int, validators=[Min(42)]), return_as=ReturnAs.ARGS)
                async def bar_2(self, k):
                    return k
예제 #3
0
    def test_multiple_parameters(self) -> None:
        @validate(
            Parameter(name='a', validators=[Min(3)]),
            Parameter(name='b', validators=[Max(3)]),
            Parameter(name='c', validators=[Max(43)]),
        )
        def bar(a, b, c):
            return a + b + c

        self.assertEqual(11, bar(3, 3, 5))
        self.assertEqual(11, bar(a=3, b=3, c=5))
예제 #4
0
    def test_empty_parameter_kwargs_without_none(self):
        @validate(
            Parameter(name='a', required=False),
            Parameter(name='b', required=True),
            Parameter(name='c', required=False),
            return_as=ReturnAs.KWARGS_WITHOUT_NONE
        )
        def some_calculation(a: Optional[int] = 1, b: Optional[int] = 2, c:  Optional[int] = 3):
            return str(a) + str(b) + str(c)

        self.assertEqual('430-50', some_calculation(43, 0, -50))
        self.assertEqual('103', some_calculation(None, 0, None))
예제 #5
0
    def test_empty_parameter_kwargs_with_none(self):
        @validate(
            Parameter(name='a', required=False),
            Parameter(name='b', required=True),
            Parameter(name='c', required=False),
            return_as=ReturnAs.KWARGS_WITH_NONE
        )
        def some_calculation(a, b, c):
            return str(a) + str(b) + str(c)

        self.assertEqual('430-50', some_calculation(43, 0, -50))
        self.assertEqual('None0None', some_calculation(None, 0, None))
예제 #6
0
    def test_required(self):
        @validate(
            Parameter(name='a', required=True),
            Parameter(name='b', required=True),
            Parameter(name='c', required=True),
        )
        def some_calculation(a, b, c):
            return a + b + c

        some_calculation(43, 0, -50)

        with self.assertRaises(expected_exception=ValidateException):
            some_calculation(30, None, 50)
예제 #7
0
        class MyClass:
            @validate(
                Parameter(name='x', validators=[Min(1)]),
            )
            def some_calculation(self, x: int) -> int:
                return x

            @validate(
                Parameter(name='x', validators=[Min(1)]),
                return_as=ReturnAs.KWARGS_WITHOUT_NONE,
            )
            def some_calculation_2(self, x: int) -> int:
                return x
예제 #8
0
    def test_return_as_args_advanced(self) -> None:
        @validate(
            Parameter(name='a'),
            Parameter(name='b'),
            Parameter(name='c'),
            return_as=ReturnAs.ARGS,
        )
        def bar(a, b, *args, **kwargs):
            return a, b, args, kwargs

        bar(a=1, b=3, c=42)
        bar(1, 3, 4)
        bar(1, 3, c=4)
예제 #9
0
    def test_return_multiple_args(self) -> None:
        @validate(
            Parameter(name='c'),
            Parameter(name='a'),
            Parameter(name='b'),
            return_as=ReturnAs.KWARGS_WITH_NONE,
        )
        def bar(*args, **kwargs):
            return args, kwargs

        self.assertEqual(((), {'a': 1, 'b': 3, 'c': 42}), bar(a=1, b=3, c=42))
        self.assertEqual(((), {'a': 3, 'b': 42, 'c': 1}), bar(1, 3, 42))
        self.assertEqual(((), {'a': 1, 'b': 3, 'c': 42}), bar(1, 3, c=42))
예제 #10
0
    def test_return_as_args_advanced_different_order(self) -> None:
        @validate(
            Parameter(name='c'),
            Parameter(name='a'),
            Parameter(name='b'),
            return_as=ReturnAs.ARGS,
        )
        def bar(a, b, *args, **kwargs):
            return a, b, args, kwargs

        self.assertEqual((1, 3, (42,), {}), bar(a=1, b=3, c=42))
        self.assertEqual((1, 3, (42,), {}), bar(1, 3, 42))
        self.assertEqual((42, 1, (3,), {}), bar(1, 3, c=42))
예제 #11
0
    def test_validate_args(self):
        @validate(
            Parameter(name='a', validators=[Min(42, include_boundary=False)]),
            Parameter(name='b', validators=[Min(42, include_boundary=False)]),
            Parameter(name='c', validators=[Min(42, include_boundary=False)]),
        )
        def some_calculation(a, b, c):
            return a + b + c

        some_calculation(43, 45, 50)
        with self.assertRaises(expected_exception=ParameterException):
            some_calculation(30, 40, 50)
        with self.assertRaises(expected_exception=ParameterException):
            some_calculation(c=30, a=40, b=50)
    def test_validator_email_converts_to_lower_case(self) -> None:
        @validate(Parameter(name='x', validators=[Email(post_processor=lambda x: x.lower())]))
        def foo(x):
            return x

        for value in ['*****@*****.**', '*****@*****.**', '*****@*****.**']:
            self.assertEqual(value.lower(), foo(value))
예제 #13
0
    def test_return_as_args(self) -> None:
        @validate(Parameter(name='x'), return_as=ReturnAs.ARGS)
        def bar(*args, **kwargs):
            return args, kwargs

        self.assertEqual(((42,), {}), bar(42))
        self.assertEqual(((42,), {}), bar(x=42))
예제 #14
0
    def test_return_as_simple(self) -> None:
        @validate(Parameter(name='x'), return_as=ReturnAs.ARGS)
        def bar(x):
            return x

        self.assertEqual(42, bar(42))
        self.assertEqual(42, bar(x=42))
예제 #15
0
 class MyClass:
     @staticmethod
     @validate(
         Parameter(name='x', validators=[Min(1)]),
     )
     def some_calculation(x: int) -> int:
         return x
예제 #16
0
    def test_return_as_kwargs_without_none(self) -> None:
        @validate(Parameter(name='x'), return_as=ReturnAs.KWARGS_WITHOUT_NONE)
        def bar(*args, **kwargs):
            return args, kwargs

        self.assertEqual(((), {'x': 42}), bar(42))
        self.assertEqual(((), {'x': 42}), bar(x=42))
예제 #17
0
    def test_no_default_value(self) -> None:
        @validate(Parameter(name='a', required=False))
        def bar(a: datetime) -> datetime:
            return a

        with self.assertRaises(expected_exception=ValidateException):
            bar()
예제 #18
0
    def test_call_with_args(self):
        @validate(
            Parameter(name='x', validators=[Min(1)]),
        )
        def some_calculation(x: int) -> int:
            return x

        some_calculation(42)
    def test_validator_is_enum_to_upper_case_disabled(self) -> None:
        @validate(Parameter(name='x', validators=[IsEnum(MyEnum, convert=False, to_upper_case=False)]))
        def foo(x):
            return x

        for value in ['red', 'blue', 'Red', 'bLUe']:
            with self.assertRaises(expected_exception=ParameterException):
                foo(value)
예제 #20
0
    def test_none_is_removed_for_not_required_parameter(self) -> None:
        @validate(Parameter(name='a', required=False))
        def bar(a: int = 42):
            return a

        self.assertEqual(42, bar())
        self.assertEqual(2, bar(a=2))
        self.assertEqual(2, bar(2))
    def test_validator_is_enum_to_upper_case(self) -> None:
        @validate(Parameter(name='x', validators=[IsEnum(MyEnum, convert=False)]))
        def foo(x):
            return x

        self.assertEqual('RED', foo('red'))
        self.assertEqual('BLUE', foo('blue'))
        self.assertEqual('BLUE', foo('bLUe'))
예제 #22
0
    def test_unexpected_parameter_strict(self) -> None:
        @validate(Parameter(name='y'))
        def bar(x):
            return x

        with self.assertRaises(expected_exception=ValidateException):
            bar(42)
        with self.assertRaises(expected_exception=ValidateException):
            bar(x=42)
    def test_validator_for_each_single_child(self) -> None:
        @validate(Parameter(name='x', validators=[ForEach(Min(3))]))
        def foo(x):
            return x

        self.assertEqual([3, 4, 5], foo([3, 4, 5]))

        for value in [42, [3, 2, 5]]:
            with self.assertRaises(expected_exception=ParameterException):
                foo(value)
예제 #24
0
    def test_default_value_is_not_validated_internal_parameter(self) -> None:
        t = datetime(year=2021, month=11, day=24)
        unix_timestamp = (t - datetime(year=1970, month=1, day=1)).total_seconds()

        @validate(Parameter(name='a', required=False, default=t, validators=[DateTimeUnixTimestamp()]))
        def bar(a: datetime) -> datetime:
            return a

        self.assertEqual(t, bar(a=unix_timestamp))
        self.assertEqual(t, bar())
예제 #25
0
    def test_none_is_not_validated_if_not_required_kwargs_without_none(self) -> None:
        @validate(Parameter(name='a', validators=[Email()], required=False), return_as=ReturnAs.KWARGS_WITHOUT_NONE)
        def bar(a: Optional[str] = None):
            return a

        self.assertIsNone(bar(a=None))
        self.assertIsNone(bar(None))

        with self.assertRaises(expected_exception=ParameterException):
            bar('no_email')
예제 #26
0
    def test_unexpected_parameter_not_strict(self) -> None:
        @validate(Parameter(name='y'), strict=False)
        def bar(x):
            return x

        with self.assertRaises(expected_exception=ValidateException):
            self.assertEqual(42, bar(42))

        with self.assertRaises(expected_exception=ValidateException):
            self.assertEqual(42, bar(x=42))
예제 #27
0
    def test_allow_renaming_of_parameter_of_custom_validator(self) -> None:
        class MyCustomValidator(Validator):
            def validate(self, i_renamed_this_arg: Any) -> Any:
                return i_renamed_this_arg

        @validate(Parameter(name='a', validators=[MyCustomValidator()]))
        def bar(a: int):
            return a

        self.assertEqual(42, bar(42))
        self.assertEqual(42, bar(a=42))
예제 #28
0
    def test_too_many_arguments(self) -> None:
        @validate(
            Parameter(name='x'),
        )
        def bar(x):
            return x

        self.assertEqual(42, bar(42))

        with self.assertRaises(expected_exception=ValidateException):
            bar(42, 43)
    def test_validator_email(self) -> None:
        @validate(Parameter(name='x', validators=[Email()]))
        def foo(x):
            return x

        for value in ['*****@*****.**', '*****@*****.**', '*****@*****.**']:
            self.assertEqual(value, foo(value))

        for value in ['fred', 'fred@web', 'fred@[email protected]', 'fred@@web.de', 'invalid@invalid']:
            with self.assertRaises(expected_exception=ParameterException):
                foo(value)
    def test_validator_is_enum_convert_false(self) -> None:
        @validate(Parameter(name='x', validators=[IsEnum(MyEnum, convert=False)]))
        def foo(x):
            return x

        self.assertEqual('RED', foo('RED'))
        self.assertEqual('BLUE', foo('BLUE'))

        for value in ['fred', 1, 'GREEN']:
            with self.assertRaises(expected_exception=ParameterException):
                foo(value)