fix inc/dec operator with decimal
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
import datetime
|
||||
import unittest
|
||||
import uuid
|
||||
from decimal import Decimal
|
||||
|
||||
from bson import DBRef, ObjectId
|
||||
from nose.plugins.skip import SkipTest
|
||||
@@ -1851,21 +1852,16 @@ class QuerySetTest(unittest.TestCase):
|
||||
self.assertEqual(
|
||||
1, BlogPost.objects(author__in=["%s" % me.pk]).count())
|
||||
|
||||
def test_update(self):
|
||||
"""Ensure that atomic updates work properly.
|
||||
"""
|
||||
def test_update_intfield_operator(self):
|
||||
class BlogPost(Document):
|
||||
name = StringField()
|
||||
title = StringField()
|
||||
hits = IntField()
|
||||
tags = ListField(StringField())
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
post = BlogPost(name="Test Post", hits=5, tags=['test'])
|
||||
post = BlogPost(hits=5)
|
||||
post.save()
|
||||
|
||||
BlogPost.objects.update(set__hits=10)
|
||||
BlogPost.objects.update_one(set__hits=10)
|
||||
post.reload()
|
||||
self.assertEqual(post.hits, 10)
|
||||
|
||||
@@ -1882,6 +1878,55 @@ class QuerySetTest(unittest.TestCase):
|
||||
post.reload()
|
||||
self.assertEqual(post.hits, 11)
|
||||
|
||||
def test_update_decimalfield_operator(self):
|
||||
class BlogPost(Document):
|
||||
review = DecimalField()
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
post = BlogPost(review=3.5)
|
||||
post.save()
|
||||
|
||||
BlogPost.objects.update_one(inc__review=0.1) # test with floats
|
||||
post.reload()
|
||||
self.assertEqual(float(post.review), 3.6)
|
||||
|
||||
BlogPost.objects.update_one(dec__review=0.1)
|
||||
post.reload()
|
||||
self.assertEqual(float(post.review), 3.5)
|
||||
|
||||
BlogPost.objects.update_one(inc__review=Decimal(0.12)) # test with Decimal
|
||||
post.reload()
|
||||
self.assertEqual(float(post.review), 3.62)
|
||||
|
||||
BlogPost.objects.update_one(dec__review=Decimal(0.12))
|
||||
post.reload()
|
||||
self.assertEqual(float(post.review), 3.5)
|
||||
|
||||
def test_update_decimalfield_operator_not_working_with_force_string(self):
|
||||
class BlogPost(Document):
|
||||
review = DecimalField(force_string=True)
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
post = BlogPost(review=3.5)
|
||||
post.save()
|
||||
|
||||
with self.assertRaises(OperationError):
|
||||
BlogPost.objects.update_one(inc__review=0.1) # test with floats
|
||||
|
||||
def test_update_listfield_operator(self):
|
||||
"""Ensure that atomic updates work properly.
|
||||
"""
|
||||
class BlogPost(Document):
|
||||
tags = ListField(StringField())
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
post = BlogPost(tags=['test'])
|
||||
post.save()
|
||||
|
||||
# ListField operator
|
||||
BlogPost.objects.update(push__tags='mongo')
|
||||
post.reload()
|
||||
self.assertTrue('mongo' in post.tags)
|
||||
@@ -1900,13 +1945,23 @@ class QuerySetTest(unittest.TestCase):
|
||||
post.reload()
|
||||
self.assertEqual(post.tags.count('unique'), 1)
|
||||
|
||||
self.assertNotEqual(post.hits, None)
|
||||
BlogPost.objects.update_one(unset__hits=1)
|
||||
post.reload()
|
||||
self.assertEqual(post.hits, None)
|
||||
BlogPost.drop_collection()
|
||||
|
||||
def test_update_unset(self):
|
||||
class BlogPost(Document):
|
||||
title = StringField()
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
post = BlogPost(title='garbage').save()
|
||||
|
||||
self.assertNotEqual(post.title, None)
|
||||
BlogPost.objects.update_one(unset__title=1)
|
||||
post.reload()
|
||||
self.assertEqual(post.title, None)
|
||||
pymongo_doc = BlogPost.objects.as_pymongo().first()
|
||||
self.assertNotIn('title', pymongo_doc)
|
||||
|
||||
@needs_mongodb_v26
|
||||
def test_update_push_with_position(self):
|
||||
"""Ensure that the 'push' update with position works properly.
|
||||
|
||||
Reference in New Issue
Block a user