Added tests for to_python, to_database method of UserDefinedType
This commit is contained in:
@@ -1002,6 +1002,9 @@ class UserDefinedType(Column):
|
|||||||
return val
|
return val
|
||||||
|
|
||||||
def to_python(self, value):
|
def to_python(self, value):
|
||||||
|
if value is None:
|
||||||
|
return
|
||||||
|
|
||||||
copied_value = deepcopy(value)
|
copied_value = deepcopy(value)
|
||||||
for name, field in self.user_type._fields.items():
|
for name, field in self.user_type._fields.items():
|
||||||
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
|
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
|
||||||
@@ -1010,6 +1013,9 @@ class UserDefinedType(Column):
|
|||||||
return copied_value
|
return copied_value
|
||||||
|
|
||||||
def to_database(self, value):
|
def to_database(self, value):
|
||||||
|
if value is None:
|
||||||
|
return
|
||||||
|
|
||||||
copied_value = deepcopy(value)
|
copied_value = deepcopy(value)
|
||||||
for name, field in self.user_type._fields.items():
|
for name, field in self.user_type._fields.items():
|
||||||
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
|
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
|
||||||
|
@@ -151,6 +151,7 @@ class UDT(UserType):
|
|||||||
age = columns.Integer()
|
age = columns.Integer()
|
||||||
mf = columns.Map(columns.Integer, columns.Integer)
|
mf = columns.Map(columns.Integer, columns.Integer)
|
||||||
dummy_udt = columns.Integer(default=42)
|
dummy_udt = columns.Integer(default=42)
|
||||||
|
time_col = columns.Time()
|
||||||
|
|
||||||
|
|
||||||
class ModelWithDefault(Model):
|
class ModelWithDefault(Model):
|
||||||
@@ -343,3 +344,29 @@ class ModelWithDefaultTests(BaseCassEngTestCase):
|
|||||||
item.update(udt_default=udt_default)
|
item.update(udt_default=udt_default)
|
||||||
self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(),
|
self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(),
|
||||||
{'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default})
|
{'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default})
|
||||||
|
|
||||||
|
|
||||||
|
def test_udt_to_python(self):
|
||||||
|
"""
|
||||||
|
Test the to_python and to_database are correctly called on UDTs
|
||||||
|
@since 3.10
|
||||||
|
@jira_ticket PYTHON-743
|
||||||
|
@expected_result the int value is correctly converted to utils.Time
|
||||||
|
and written to C*
|
||||||
|
|
||||||
|
@test_category object_mapper
|
||||||
|
"""
|
||||||
|
item = ModelWithDefault(id=1)
|
||||||
|
item.save()
|
||||||
|
|
||||||
|
# We update time_col this way because we want to hit
|
||||||
|
# the to_python method from UserDefinedType, otherwise to_python
|
||||||
|
# would be called in UDT.__init__
|
||||||
|
user_to_update = UDT()
|
||||||
|
user_to_update.time_col = 10
|
||||||
|
|
||||||
|
item.update(udt=user_to_update)
|
||||||
|
|
||||||
|
udt, udt_default = UDT(time_col=10), UDT(age=1, mf={2:2})
|
||||||
|
self.assertEqual(ModelWithDefault.objects.get(id=1)._as_dict(),
|
||||||
|
{'id': 1, 'dummy': 42, 'mf': {}, "udt": udt, "udt_default": udt_default})
|
||||||
|
Reference in New Issue
Block a user