From 06609ca238cd94742cc8f89cbb5d862d27bc9dda Mon Sep 17 00:00:00 2001 From: "m.orban" Date: Thu, 8 Sep 2016 13:38:15 +0200 Subject: [PATCH] Added tests for MultiRef datahandler and modified _check_data_value raise exception --- lodel/leapi/datahandlers/base_classes.py | 39 +++++++++++------------- tests/datahandlers/test_reference.py | 34 +++++++++++++++++++-- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/lodel/leapi/datahandlers/base_classes.py b/lodel/leapi/datahandlers/base_classes.py index 3a6e707..7872557 100644 --- a/lodel/leapi/datahandlers/base_classes.py +++ b/lodel/leapi/datahandlers/base_classes.py @@ -298,10 +298,13 @@ class Reference(DataHandler): value = super()._check_data_value(value) if not (hasattr(value, '__class__') and issubclass(value.__class__, LeObject)): - rcls = list(self.__allowed_classes)[0] - uidname = rcls.uid_fieldname()[0]# TODO multiple uid is broken - uiddh = rcls.data_handler(uidname) - value = uiddh._check_data_value(value) + if self.__allowed_classes: + rcls = list(self.__allowed_classes)[0] + uidname = rcls.uid_fieldname()[0]# TODO multiple uid is broken + uiddh = rcls.data_handler(uidname) + value = uiddh._check_data_value(value) + else: + raise FieldValidationError("Reference datahandler can not check this value %s if any allowed_class is allowed." % value) return value ##@brief Check datas consistency @@ -387,23 +390,17 @@ class MultipleRef(Reference): if self.max_item is not None: if self.max_item < len(value): raise FieldValidationError("Too many items") - error_list = [] - # if we have got a str - # right place to test this ? - - if isinstance(value, str): - value.replace(" ","") - s_value=value.split(',') - value=list(s_value) - logger.debug(value) - for i,v in enumerate(s_value): - new_val = super()._check_data_value(v) - value[i]=new_val - error_list[i]=new_val - logger.debug(value) - if len(error_list) >0: - raise FieldValidationError("MultipleRef have for error :", error_list) - return value + new_val = list() + error_list = list() + for i,v in enumerate(value): + try: + v = super()._check_data_value(v) + new_val.append(v) + except (FieldValidationError) as f: + error_list.append(repr(v)) + if error_list: + raise FieldValidationError("MultipleRef have for invalid values [%s] :" % (",".join(error_list))) + return new_val def construct_data(self, emcomponent, fname, datas, cur_value): cur_value = super().construct_data(emcomponent, fname, datas, cur_value) diff --git a/tests/datahandlers/test_reference.py b/tests/datahandlers/test_reference.py index 802994a..964ce4e 100644 --- a/tests/datahandlers/test_reference.py +++ b/tests/datahandlers/test_reference.py @@ -48,7 +48,35 @@ class MultipleRefTestCase(unittest.TestCase): def test_multiref_check_data_value_not_iter(self): test_multiref = MultipleRef(3) - for test_value in [(obj3, 15)]: - value = test_multiref._check_data_value(test_value) - self.assertEqual(test_value, value) + for test_value in [obj3]: + with self.assertRaises(FieldValidationError): + test_multiref._check_data_value(test_value) + + def test_multiref_check_data_multi_bad_value_error(self): + test_multiref = MultipleRef(3) + for test_value in [(obj3, 15, 'toto')]: + with self.assertRaises(FieldValidationError) as cm: + test_multiref._check_data_value(test_value) + the_exception = cm.exception + self.assertEqual(the_exception.args, ("MultipleRef have for invalid values [15,'toto'] :",)) + + def test_multiref_check_data_too_max_lenght_iter_error(self): + test_multiref = MultipleRef(3) + for test_value in [(obj3, obj2, obj1, obj3)]: + with self.assertRaises(FieldValidationError): + test_multiref._check_data_value(test_value) + + def test_multiref_check_data_uid_multi_bad_value_error(self): + test_multiref = MultipleRef(5, **{'allowed_classes' : [dyncode.Person, dyncode.Collection]}) + for test_value in [(obj3, obj2, 1, 15, 'toto')]: + with self.assertRaises(FieldValidationError) as cm: + test_multiref._check_data_value(test_value) + the_exception = cm.exception + self.assertEqual(the_exception.args, ("MultipleRef have for invalid values ['toto'] :",)) + + def test_multiref_check_data_object_uid_multi_good_value_error(self): + test_multiref = MultipleRef(5, **{'allowed_classes' : [dyncode.Person, dyncode.Collection]}) + for test_value in [(obj3, obj2, 1.2, 15)]: + value = test_multiref._check_data_value(test_value) + self.assertEqual(value, [obj3, obj2, 1, 15])