예제 #1
0
    def test_accepts(self):
        @V.accepts(a="fraction", b=int, body={"+field_ids": ["integer"],
                                              "?is_ok": bool,
                                              "?sex": "gender"})
        def f(a, b=1, **body):
            pass

        valid = [
            partial(f, 2.0, field_ids=[]),
            partial(f, Decimal(1), b=5, field_ids=[1], is_ok=True),
            partial(f, a=3j, b=-1, field_ids=[long(1), 2, long(5)], sex="male"),
            partial(f, 5 + 3j, 0, field_ids=[long(-12), 0, long(0)], is_ok=False, sex="female"),
            partial(f, 2.0, field_ids=[], additional="extra param allowed"),
        ]

        invalid = [
            partial(f, 1),  # 'a' is not a fraction
            partial(f, 1.0),  # missing 'field_ids' from body
            partial(f, 1.0, b=4.1, field_ids=[]),  # 'b' is not int
            partial(f, 1.0, b=2, field_ids=3),  # 'field_ids' is not a list
            partial(f, 1.0, b=1, field_ids=[3.0]),  # 'field_ids[0]' is not a integer
            partial(f, 1.0, b=1, field_ids=[], is_ok=1),  # 'is_ok' is not bool
            partial(f, 1.0, b=1, field_ids=[], sex="m"),  # 'sex' is not a gender
        ]

        for fcall in valid:
            fcall()
        for fcall in invalid:
            self.assertRaises(V.ValidationError, fcall)
예제 #2
0
    def test_condition(self):
        def is_odd(n):
            return n % 2 == 1

        is_even = lambda n: n % 2 == 0

        class C(object):
            def is_odd_method(self, n):
                return is_odd(n)

            def is_even_method(self, n):
                return is_even(n)

            is_odd_static = staticmethod(is_odd)
            is_even_static = staticmethod(is_even)

        for obj in is_odd, C().is_odd_method, C.is_odd_static:
            self._testValidation(obj,
                                 valid=[1, long(3), -11, 9.0, True],
                                 invalid=[6, 2.1, False, "1", []])

        for obj in is_even, C().is_even_method, C.is_even_static:
            self._testValidation(obj,
                                 valid=[6, long(2), -42, 4.0, 0, 0.0, False],
                                 invalid=[1, 2.1, True, "2", []])

        self._testValidation(str.isalnum,
                             valid=["abc", "123", "ab32c"],
                             invalid=["a+b", "a 1", "", True, 2])

        self.assertRaises(TypeError, V.Condition, C)
        self.assertRaises(TypeError,
                          V.Condition(is_even, traps=()).validate, [2, 4])
예제 #3
0
    def test_condition(self):
        def is_odd(n):
            return n % 2 == 1
        is_even = lambda n: n % 2 == 0

        class C(object):
            def is_odd_method(self, n):
                return is_odd(n)

            def is_even_method(self, n):
                return is_even(n)
            is_odd_static = staticmethod(is_odd)
            is_even_static = staticmethod(is_even)

        for obj in is_odd, C().is_odd_method, C.is_odd_static:
            self._testValidation(obj,
                                 valid=[1, long(3), -11, 9.0, True],
                                 invalid=[6, 2.1, False, "1", []])

        for obj in is_even, C().is_even_method, C.is_even_static:
            self._testValidation(obj,
                                 valid=[6, long(2), -42, 4.0, 0, 0.0, False],
                                 invalid=[1, 2.1, True, "2", []])

        self._testValidation(str.isalnum,
                             valid=["abc", "123", "ab32c"],
                             invalid=["a+b", "a 1", "", True, 2])

        self.assertRaises(TypeError, V.Condition, C)
        self.assertRaises(TypeError, V.Condition(is_even, traps=()).validate, [2, 4])
예제 #4
0
 def test_homogeneous_sequence(self):
     for obj in V.HomogeneousSequence, V.HomogeneousSequence():
         self._testValidation(obj,
                              valid=[[], [1], (1, 2), [1, (2, 3), 4]],
                              invalid=[1, 1.1, "foo", u"bar", {}, False, True])
     self._testValidation(["number"],
                          valid=[[], [1, 2.1, long(3)], (1, long(4), 6)],
                          invalid=[[1, 2.1, long(3), u"x"]])
예제 #5
0
 def test_homogeneous_sequence(self):
     for obj in V.HomogeneousSequence, V.HomogeneousSequence():
         self._testValidation(
             obj,
             valid=[[], [1], (1, 2), [1, (2, 3), 4]],
             invalid=[1, 1.1, "foo", u"bar", {}, False, True])
     self._testValidation(["number"],
                          valid=[[], [1, 2.1, long(3)], (1, long(4), 6)],
                          invalid=[[1, 2.1, long(3), u"x"]])
예제 #6
0
 def test_nonnullable(self):
     for obj in V.NonNullable, V.NonNullable():
         self._testValidation(obj,
                              invalid=[None],
                              valid=[0, False, "", (), []])
     for obj in "+integer", V.NonNullable(V.Integer()), V.NonNullable("?integer"):
         self._testValidation(obj,
                              invalid=[None, False],
                              valid=[0, long(2)])
예제 #7
0
 def test_nonnullable(self):
     for obj in V.NonNullable, V.NonNullable():
         self._testValidation(obj,
                              invalid=[None],
                              valid=[0, False, "", (), []])
     for obj in "+integer", V.NonNullable(
             V.Integer()), V.NonNullable("?integer"):
         self._testValidation(obj,
                              invalid=[None, False],
                              valid=[0, long(2)])
예제 #8
0
    def test_accepts(self):
        @V.accepts(a="fraction",
                   b=int,
                   body={
                       "+field_ids": ["integer"],
                       "?is_ok": bool,
                       "?sex": "gender"
                   })
        def f(a, b=1, **body):
            pass

        valid = [
            partial(f, 2.0, field_ids=[]),
            partial(f, Decimal(1), b=5, field_ids=[1], is_ok=True),
            partial(f, a=3j, b=-1, field_ids=[long(1), 2, long(5)],
                    sex="male"),
            partial(f,
                    5 + 3j,
                    0,
                    field_ids=[long(-12), 0, long(0)],
                    is_ok=False,
                    sex="female"),
            partial(f, 2.0, field_ids=[], additional="extra param allowed"),
        ]

        invalid = [
            partial(f, 1),  # 'a' is not a fraction
            partial(f, 1.0),  # missing 'field_ids' from body
            partial(f, 1.0, b=4.1, field_ids=[]),  # 'b' is not int
            partial(f, 1.0, b=2, field_ids=3),  # 'field_ids' is not a list
            partial(f, 1.0, b=1,
                    field_ids=[3.0]),  # 'field_ids[0]' is not a integer
            partial(f, 1.0, b=1, field_ids=[], is_ok=1),  # 'is_ok' is not bool
            partial(f, 1.0, b=1, field_ids=[],
                    sex="m"),  # 'sex' is not a gender
        ]

        for fcall in valid:
            fcall()
        for fcall in invalid:
            self.assertRaises(V.ValidationError, fcall)
예제 #9
0
    def test_complex_validation(self):

        for valid in [
            {'n': 2},
            {'n': 2.1, 'i': 3},
            {'n': -1, 'b': False},
            {'n': Decimal(3), 'e': "r"},
            {'n': long(2), 'd': datetime.now()},
            {'n': 0, 'd': date.today()},
            {'n': 0, 's': "abc"},
            {'n': 0, 'p': None},
            {'n': 0, 'p': "123"},
            {'n': 0, 'l': []},
            {'n': 0, 'l': [{"s2": "foo"}, {"s2": ""}]},
            {'n': 0, 't': (u"joe", 3.1)},
            {'n': 0, 'h': {5: ["foo", u"bar"], 0: []}},
            {'n': 0, 'o': {"i2": 3}},
        ]:
            self.complex_validator.validate(valid, adapt=False)

        for invalid in [
            None,
            {},
            {'n': None},
            {'n': True},
            {'n': 1, 'e': None},
            {'n': 1, 'e': "a"},
            {'n': 1, 'd': None},
            {'n': 1, 's': None},
            {'n': 1, 's': ''},
            {'n': 1, 's': '123456789'},
            {'n': 1, 'p': '123a'},
            {'n': 1, 'l': None},
            {'n': 1, 'l': [None]},
            {'n': 1, 'l': [{}]},
            {'n': 1, 'l': [{'s2': None}]},
            {'n': 1, 'l': [{'s2': 1}]},
            {'n': 1, 't': ()},
            {'n': 0, 't': (3.1, u"joe")},
            {'n': 0, 't': (u"joe", None)},
            {'n': 1, 'h': {5: ["foo", u"bar"], "0": []}},
            {'n': 1, 'h': {5: ["foo", 2.1], 0: []}},
            {'n': 1, 'o': {}},
            {'n': 1, 'o': {"i2": "2"}},
        ]:
            self.assertRaises(V.ValidationError,
                              self.complex_validator.validate, invalid, adapt=False)
예제 #10
0
 def test_complex_adaptation(self):
     for value in [
         {'n': 2},
         {'n': 2.1, 'i': 3},
         {'n': -1, 'b': False},
         {'n': Decimal(3), 'e': "r"},
         {'n': long(2), 'd': datetime.now()},
         {'n': 0, 'd': date.today()},
         {'n': 0, 's': "abc"},
         {'n': 0, 'p': None},
         {'n': 0, 'p': "123"},
         {'n': 0, 'l': []},
         {'n': 0, 'l': [{"s2": "foo"}, {"s2": ""}]},
         {'n': 0, 't': (u"joe", 3.1)},
         {'n': 0, 'h': {5: ["foo", u"bar"], 0: []}},
         {'n': 0, 'o': {"i2": 3}},
     ]:
         adapted = self.complex_validator.validate(value)
         self.assertTrue(isinstance(adapted["n"], (int, long, float, Decimal)))
         self.assertTrue(isinstance(adapted["i"], int_types))
         self.assertTrue(adapted.get("b") is None or isinstance(adapted["b"], bool))
         self.assertTrue(adapted.get("d") is None or isinstance(adapted["d"], (date, datetime)))
         self.assertTrue(adapted.get("e") is None or adapted["e"] in "rgb")
         self.assertTrue(adapted.get("s") is None or isinstance(adapted["s"], string_types))
         self.assertTrue(adapted.get("l") is None or isinstance(adapted["l"], list))
         self.assertTrue(adapted.get("t") is None or isinstance(adapted["t"], tuple))
         self.assertTrue(adapted.get("h") is None or isinstance(adapted["h"], dict))
         if adapted.get("l") is not None:
             self.assertTrue(all(isinstance(item["s2"], string_types)
                                 for item in adapted["l"]))
         if adapted.get("t") is not None:
             self.assertEqual(len(adapted["t"]), 2)
             self.assertTrue(isinstance(adapted["t"][0], unicode))
             self.assertTrue(isinstance(adapted["t"][1], float))
         if adapted.get("h") is not None:
             self.assertTrue(all(isinstance(key, int)
                                 for key in adapted["h"].keys()))
             self.assertTrue(all(isinstance(value_item, string_types)
                                 for value in adapted["h"].values()
                                 for value_item in value))
         if adapted.get("o") is not None:
             self.assertTrue(isinstance(adapted["o"]["i2"], int_types))
예제 #11
0
    def test_complex_validation(self):

        for valid in [
            {
                'n': 2
            },
            {
                'n': 2.1,
                'i': 3
            },
            {
                'n': -1,
                'b': False
            },
            {
                'n': Decimal(3),
                'e': "r"
            },
            {
                'n': long(2),
                'd': datetime.now()
            },
            {
                'n': 0,
                'd': date.today()
            },
            {
                'n': 0,
                's': "abc"
            },
            {
                'n': 0,
                'p': None
            },
            {
                'n': 0,
                'p': "123"
            },
            {
                'n': 0,
                'l': []
            },
            {
                'n': 0,
                'l': [{
                    "s2": "foo"
                }, {
                    "s2": ""
                }]
            },
            {
                'n': 0,
                't': (u"joe", 3.1)
            },
            {
                'n': 0,
                'h': {
                    5: ["foo", u"bar"],
                    0: []
                }
            },
            {
                'n': 0,
                'o': {
                    "i2": 3
                }
            },
        ]:
            self.complex_validator.validate(valid, adapt=False)

        for invalid in [
                None,
            {},
            {
                'n': None
            },
            {
                'n': True
            },
            {
                'n': 1,
                'e': None
            },
            {
                'n': 1,
                'e': "a"
            },
            {
                'n': 1,
                'd': None
            },
            {
                'n': 1,
                's': None
            },
            {
                'n': 1,
                's': ''
            },
            {
                'n': 1,
                's': '123456789'
            },
            {
                'n': 1,
                'p': '123a'
            },
            {
                'n': 1,
                'l': None
            },
            {
                'n': 1,
                'l': [None]
            },
            {
                'n': 1,
                'l': [{}]
            },
            {
                'n': 1,
                'l': [{
                    's2': None
                }]
            },
            {
                'n': 1,
                'l': [{
                    's2': 1
                }]
            },
            {
                'n': 1,
                't': ()
            },
            {
                'n': 0,
                't': (3.1, u"joe")
            },
            {
                'n': 0,
                't': (u"joe", None)
            },
            {
                'n': 1,
                'h': {
                    5: ["foo", u"bar"],
                    "0": []
                }
            },
            {
                'n': 1,
                'h': {
                    5: ["foo", 2.1],
                    0: []
                }
            },
            {
                'n': 1,
                'o': {}
            },
            {
                'n': 1,
                'o': {
                    "i2": "2"
                }
            },
        ]:
            self.assertRaises(V.ValidationError,
                              self.complex_validator.validate,
                              invalid,
                              adapt=False)
예제 #12
0
 def test_complex_adaptation(self):
     for value in [
         {
             'n': 2
         },
         {
             'n': 2.1,
             'i': 3
         },
         {
             'n': -1,
             'b': False
         },
         {
             'n': Decimal(3),
             'e': "r"
         },
         {
             'n': long(2),
             'd': datetime.now()
         },
         {
             'n': 0,
             'd': date.today()
         },
         {
             'n': 0,
             's': "abc"
         },
         {
             'n': 0,
             'p': None
         },
         {
             'n': 0,
             'p': "123"
         },
         {
             'n': 0,
             'l': []
         },
         {
             'n': 0,
             'l': [{
                 "s2": "foo"
             }, {
                 "s2": ""
             }]
         },
         {
             'n': 0,
             't': (u"joe", 3.1)
         },
         {
             'n': 0,
             'h': {
                 5: ["foo", u"bar"],
                 0: []
             }
         },
         {
             'n': 0,
             'o': {
                 "i2": 3
             }
         },
     ]:
         adapted = self.complex_validator.validate(value)
         self.assertTrue(
             isinstance(adapted["n"], (int, long, float, Decimal)))
         self.assertTrue(isinstance(adapted["i"], int_types))
         self.assertTrue(
             adapted.get("b") is None or isinstance(adapted["b"], bool))
         self.assertTrue(
             adapted.get("d") is None or isinstance(adapted["d"],
                                                    (date, datetime)))
         self.assertTrue(adapted.get("e") is None or adapted["e"] in "rgb")
         self.assertTrue(
             adapted.get("s") is None
             or isinstance(adapted["s"], string_types))
         self.assertTrue(
             adapted.get("l") is None or isinstance(adapted["l"], list))
         self.assertTrue(
             adapted.get("t") is None or isinstance(adapted["t"], tuple))
         self.assertTrue(
             adapted.get("h") is None or isinstance(adapted["h"], dict))
         if adapted.get("l") is not None:
             self.assertTrue(
                 all(
                     isinstance(item["s2"], string_types)
                     for item in adapted["l"]))
         if adapted.get("t") is not None:
             self.assertEqual(len(adapted["t"]), 2)
             self.assertTrue(isinstance(adapted["t"][0], unicode))
             self.assertTrue(isinstance(adapted["t"][1], float))
         if adapted.get("h") is not None:
             self.assertTrue(
                 all(isinstance(key, int) for key in adapted["h"].keys()))
             self.assertTrue(
                 all(
                     isinstance(value_item, string_types)
                     for value in adapted["h"].values()
                     for value_item in value))
         if adapted.get("o") is not None:
             self.assertTrue(isinstance(adapted["o"]["i2"], int_types))