Handle updating and getting None values
Fixes updating a field to None, so it works in a similar fashion as unsetting it via save() Updated to handle null data from the database Fixes #362
This commit is contained in:
@@ -46,6 +46,81 @@ class FieldTest(unittest.TestCase):
|
||||
person = Person(age=30)
|
||||
self.assertRaises(ValidationError, person.validate)
|
||||
|
||||
def test_not_required_handles_none_in_update(self):
|
||||
"""Ensure that every fields should accept None if required is False.
|
||||
"""
|
||||
|
||||
class HandleNoneFields(Document):
|
||||
str_fld = StringField()
|
||||
int_fld = IntField()
|
||||
flt_fld = FloatField()
|
||||
comp_dt_fld = ComplexDateTimeField()
|
||||
|
||||
HandleNoneFields.drop_collection()
|
||||
|
||||
doc = HandleNoneFields()
|
||||
doc.str_fld = u'spam ham egg'
|
||||
doc.int_fld = 42
|
||||
doc.flt_fld = 4.2
|
||||
doc.com_dt_fld = datetime.datetime.utcnow()
|
||||
doc.save()
|
||||
|
||||
res = HandleNoneFields.objects(id=doc.id).update(
|
||||
set__str_fld=None,
|
||||
set__int_fld=None,
|
||||
set__flt_fld=None,
|
||||
set__comp_dt_fld=None,
|
||||
)
|
||||
self.assertEqual(res, 1)
|
||||
|
||||
# Retrive data from db and verify it.
|
||||
ret = HandleNoneFields.objects.all()[0]
|
||||
|
||||
self.assertEqual(ret.str_fld, None)
|
||||
self.assertEqual(ret.int_fld, None)
|
||||
self.assertEqual(ret.flt_fld, None)
|
||||
|
||||
# Return current time if retrived value is None.
|
||||
self.assertTrue(isinstance(ret.comp_dt_fld, datetime.datetime))
|
||||
|
||||
def test_not_required_handles_none_from_database(self):
|
||||
"""Ensure that every fields can handle null values from the database.
|
||||
"""
|
||||
|
||||
class HandleNoneFields(Document):
|
||||
str_fld = StringField(required=True)
|
||||
int_fld = IntField(required=True)
|
||||
flt_fld = FloatField(required=True)
|
||||
comp_dt_fld = ComplexDateTimeField(required=True)
|
||||
|
||||
HandleNoneFields.drop_collection()
|
||||
|
||||
doc = HandleNoneFields()
|
||||
doc.str_fld = u'spam ham egg'
|
||||
doc.int_fld = 42
|
||||
doc.flt_fld = 4.2
|
||||
doc.com_dt_fld = datetime.datetime.utcnow()
|
||||
doc.save()
|
||||
|
||||
collection = self.db[HandleNoneFields._get_collection_name()]
|
||||
obj = collection.update({"_id": doc.id}, {"$unset": {
|
||||
"str_fld": 1,
|
||||
"int_fld": 1,
|
||||
"flt_fld": 1,
|
||||
"comp_dt_fld": 1}
|
||||
})
|
||||
|
||||
# Retrive data from db and verify it.
|
||||
ret = HandleNoneFields.objects.all()[0]
|
||||
|
||||
self.assertEqual(ret.str_fld, None)
|
||||
self.assertEqual(ret.int_fld, None)
|
||||
self.assertEqual(ret.flt_fld, None)
|
||||
# Return current time if retrived value is None.
|
||||
self.assert_(isinstance(ret.comp_dt_fld, datetime.datetime))
|
||||
|
||||
self.assertRaises(ValidationError, ret.validate)
|
||||
|
||||
def test_object_id_validation(self):
|
||||
"""Ensure that invalid values cannot be assigned to string fields.
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user