Переглянути джерело

Added tests for MultiRef datahandler and modified _check_data_value raise exception

m.orban 7 роки тому
джерело
коміт
06609ca238

+ 18
- 21
lodel/leapi/datahandlers/base_classes.py Переглянути файл

@@ -298,10 +298,13 @@ class Reference(DataHandler):
298 298
         value = super()._check_data_value(value)
299 299
         if not (hasattr(value, '__class__') and
300 300
                 issubclass(value.__class__, LeObject)):
301
-            rcls = list(self.__allowed_classes)[0]
302
-            uidname = rcls.uid_fieldname()[0]# TODO multiple uid is broken
303
-            uiddh = rcls.data_handler(uidname)
304
-            value = uiddh._check_data_value(value)
301
+            if self.__allowed_classes:
302
+                rcls = list(self.__allowed_classes)[0]
303
+                uidname = rcls.uid_fieldname()[0]# TODO multiple uid is broken
304
+                uiddh = rcls.data_handler(uidname)
305
+                value = uiddh._check_data_value(value)
306
+            else:
307
+                raise FieldValidationError("Reference datahandler can not check this value %s if any allowed_class is allowed." % value)
305 308
         return value
306 309
 
307 310
     ##@brief Check datas consistency
@@ -387,23 +390,17 @@ class MultipleRef(Reference):
387 390
         if self.max_item is not None:
388 391
             if self.max_item < len(value):
389 392
                 raise FieldValidationError("Too many items")
390
-        error_list = []
391
-        # if we have got a str
392
-        # right place to test this ?
393
-        
394
-        if isinstance(value, str):
395
-            value.replace(" ","")
396
-            s_value=value.split(',')
397
-            value=list(s_value)
398
-        logger.debug(value)
399
-        for i,v in enumerate(s_value):
400
-            new_val = super()._check_data_value(v)
401
-            value[i]=new_val
402
-            error_list[i]=new_val
403
-        logger.debug(value)
404
-        if len(error_list) >0:
405
-            raise FieldValidationError("MultipleRef have for error :", error_list)
406
-        return value
393
+        new_val = list() 
394
+        error_list = list()
395
+        for i,v in enumerate(value):
396
+            try:
397
+                v = super()._check_data_value(v)
398
+                new_val.append(v)
399
+            except (FieldValidationError) as f:
400
+                error_list.append(repr(v))
401
+        if error_list:
402
+            raise FieldValidationError("MultipleRef have for invalid values [%s]  :" % (",".join(error_list)))
403
+        return new_val
407 404
 
408 405
     def construct_data(self, emcomponent, fname, datas, cur_value):
409 406
         cur_value = super().construct_data(emcomponent, fname, datas, cur_value)

+ 31
- 3
tests/datahandlers/test_reference.py Переглянути файл

@@ -48,7 +48,35 @@ class MultipleRefTestCase(unittest.TestCase):
48 48
 
49 49
     def test_multiref_check_data_value_not_iter(self):
50 50
         test_multiref = MultipleRef(3)
51
-        for test_value in [(obj3, 15)]:
52
-            value = test_multiref._check_data_value(test_value)
53
-            self.assertEqual(test_value, value)
51
+        for test_value in [obj3]:
52
+            with self.assertRaises(FieldValidationError):
53
+                test_multiref._check_data_value(test_value)
54
+    
55
+    def test_multiref_check_data_multi_bad_value_error(self):
56
+        test_multiref = MultipleRef(3)
57
+        for test_value in [(obj3, 15, 'toto')]:
58
+            with self.assertRaises(FieldValidationError) as cm:
59
+                test_multiref._check_data_value(test_value)
60
+            the_exception = cm.exception
61
+            self.assertEqual(the_exception.args, ("MultipleRef have for invalid values [15,'toto']  :",))
62
+    
63
+    def test_multiref_check_data_too_max_lenght_iter_error(self):
64
+        test_multiref = MultipleRef(3)
65
+        for test_value in [(obj3, obj2, obj1, obj3)]:
66
+            with self.assertRaises(FieldValidationError):
67
+                test_multiref._check_data_value(test_value)
68
+
54 69
 
70
+    def test_multiref_check_data_uid_multi_bad_value_error(self):
71
+        test_multiref = MultipleRef(5, **{'allowed_classes' : [dyncode.Person, dyncode.Collection]})
72
+        for test_value in [(obj3, obj2, 1, 15, 'toto')]:
73
+            with self.assertRaises(FieldValidationError) as cm:
74
+                test_multiref._check_data_value(test_value)
75
+            the_exception = cm.exception
76
+            self.assertEqual(the_exception.args, ("MultipleRef have for invalid values ['toto']  :",))
77
+    
78
+    def test_multiref_check_data_object_uid_multi_good_value_error(self):
79
+        test_multiref = MultipleRef(5, **{'allowed_classes' : [dyncode.Person, dyncode.Collection]})
80
+        for test_value in [(obj3, obj2, 1.2, 15)]:
81
+                value = test_multiref._check_data_value(test_value)
82
+                self.assertEqual(value, [obj3, obj2, 1, 15])

Loading…
Відмінити
Зберегти