Skip to content

Commit 96cfe3d

Browse files
author
bjmb
committed
Added tests for to_python, to_database method of UserDefinedType
1 parent 8152506 commit 96cfe3d

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

cassandra/cqlengine/columns.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,9 @@ def validate(self, value):
10021002
return val
10031003

10041004
def to_python(self, value):
1005+
if value is None:
1006+
return
1007+
10051008
copied_value = deepcopy(value)
10061009
for name, field in self.user_type._fields.items():
10071010
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
@@ -1010,6 +1013,9 @@ def to_python(self, value):
10101013
return copied_value
10111014

10121015
def to_database(self, value):
1016+
if value is None:
1017+
return
1018+
10131019
copied_value = deepcopy(value)
10141020
for name, field in self.user_type._fields.items():
10151021
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):

tests/integration/cqlengine/model/test_updates.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class UDT(UserType):
151151
age = columns.Integer()
152152
mf = columns.Map(columns.Integer, columns.Integer)
153153
dummy_udt = columns.Integer(default=42)
154+
time_col = columns.Time()
154155

155156

156157
class ModelWithDefault(Model):
@@ -343,3 +344,29 @@ def test_collection_with_default(self):
343344
item.update(udt_default=udt_default)
344345
self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(),
345346
{'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default})
347+
348+
349+
def test_udt_to_python(self):
350+
"""
351+
Test the to_python and to_database are correctly called on UDTs
352+
@since 3.10
353+
@jira_ticket PYTHON-743
354+
@expected_result the int value is correctly converted to utils.Time
355+
and written to C*
356+
357+
@test_category object_mapper
358+
"""
359+
item = ModelWithDefault(id=1)
360+
item.save()
361+
362+
# We update time_col this way because we want to hit
363+
# the to_python method from UserDefinedType, otherwise to_python
364+
# would be called in UDT.__init__
365+
user_to_update = UDT()
366+
user_to_update.time_col = 10
367+
368+
item.update(udt=user_to_update)
369+
370+
udt, udt_default = UDT(time_col=10), UDT(age=1, mf={2:2})
371+
self.assertEqual(ModelWithDefault.objects.get(id=1)._as_dict(),
372+
{'id': 1, 'dummy': 42, 'mf': {}, "udt": udt, "udt_default": udt_default})

0 commit comments

Comments
 (0)