From 96cfe3deea8ae14594a85ae5c698668dccd461dc Mon Sep 17 00:00:00 2001 From: bjmb Date: Mon, 8 May 2017 17:00:10 -0400 Subject: [PATCH] Added tests for to_python, to_database method of UserDefinedType --- cassandra/cqlengine/columns.py | 6 +++++ .../cqlengine/model/test_updates.py | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/cassandra/cqlengine/columns.py b/cassandra/cqlengine/columns.py index a5afb66e..3470a44a 100644 --- a/cassandra/cqlengine/columns.py +++ b/cassandra/cqlengine/columns.py @@ -1002,6 +1002,9 @@ class UserDefinedType(Column): return val def to_python(self, value): + if value is None: + return + copied_value = deepcopy(value) for name, field in self.user_type._fields.items(): if copied_value[name] is not None or isinstance(field, BaseContainerColumn): @@ -1010,6 +1013,9 @@ class UserDefinedType(Column): return copied_value def to_database(self, value): + if value is None: + return + copied_value = deepcopy(value) for name, field in self.user_type._fields.items(): if copied_value[name] is not None or isinstance(field, BaseContainerColumn): diff --git a/tests/integration/cqlengine/model/test_updates.py b/tests/integration/cqlengine/model/test_updates.py index 2f966e7e..0de6543e 100644 --- a/tests/integration/cqlengine/model/test_updates.py +++ b/tests/integration/cqlengine/model/test_updates.py @@ -151,6 +151,7 @@ class UDT(UserType): age = columns.Integer() mf = columns.Map(columns.Integer, columns.Integer) dummy_udt = columns.Integer(default=42) + time_col = columns.Time() class ModelWithDefault(Model): @@ -343,3 +344,29 @@ class ModelWithDefaultTests(BaseCassEngTestCase): item.update(udt_default=udt_default) self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), {'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})