272 lines
8.5 KiB
Python
272 lines
8.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from mongoengine import *
|
|
|
|
from tests.utils import MongoDBTestCase
|
|
|
|
|
|
class TestSequenceField(MongoDBTestCase):
|
|
def test_sequence_field(self):
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True)
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
Person(name="Person %s" % x).save()
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
ids = [i.id for i in Person.objects]
|
|
self.assertEqual(ids, range(1, 11))
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
Person.id.set_next_value(1000)
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 1000)
|
|
|
|
def test_sequence_field_get_next_value(self):
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True)
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
Person(name="Person %s" % x).save()
|
|
|
|
self.assertEqual(Person.id.get_next_value(), 11)
|
|
self.db['mongoengine.counters'].drop()
|
|
|
|
self.assertEqual(Person.id.get_next_value(), 1)
|
|
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True, value_decorator=str)
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
Person(name="Person %s" % x).save()
|
|
|
|
self.assertEqual(Person.id.get_next_value(), '11')
|
|
self.db['mongoengine.counters'].drop()
|
|
|
|
self.assertEqual(Person.id.get_next_value(), '1')
|
|
|
|
def test_sequence_field_sequence_name(self):
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True, sequence_name='jelly')
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
Person(name="Person %s" % x).save()
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'jelly.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
ids = [i.id for i in Person.objects]
|
|
self.assertEqual(ids, range(1, 11))
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'jelly.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
Person.id.set_next_value(1000)
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'jelly.id'})
|
|
self.assertEqual(c['next'], 1000)
|
|
|
|
def test_multiple_sequence_fields(self):
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True)
|
|
counter = SequenceField()
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
Person(name="Person %s" % x).save()
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
ids = [i.id for i in Person.objects]
|
|
self.assertEqual(ids, range(1, 11))
|
|
|
|
counters = [i.counter for i in Person.objects]
|
|
self.assertEqual(counters, range(1, 11))
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
Person.id.set_next_value(1000)
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 1000)
|
|
|
|
Person.counter.set_next_value(999)
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.counter'})
|
|
self.assertEqual(c['next'], 999)
|
|
|
|
def test_sequence_fields_reload(self):
|
|
class Animal(Document):
|
|
counter = SequenceField()
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Animal.drop_collection()
|
|
|
|
a = Animal(name="Boi").save()
|
|
|
|
self.assertEqual(a.counter, 1)
|
|
a.reload()
|
|
self.assertEqual(a.counter, 1)
|
|
|
|
a.counter = None
|
|
self.assertEqual(a.counter, 2)
|
|
a.save()
|
|
|
|
self.assertEqual(a.counter, 2)
|
|
|
|
a = Animal.objects.first()
|
|
self.assertEqual(a.counter, 2)
|
|
a.reload()
|
|
self.assertEqual(a.counter, 2)
|
|
|
|
def test_multiple_sequence_fields_on_docs(self):
|
|
class Animal(Document):
|
|
id = SequenceField(primary_key=True)
|
|
name = StringField()
|
|
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True)
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Animal.drop_collection()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
Animal(name="Animal %s" % x).save()
|
|
Person(name="Person %s" % x).save()
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'animal.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
ids = [i.id for i in Person.objects]
|
|
self.assertEqual(ids, range(1, 11))
|
|
|
|
id = [i.id for i in Animal.objects]
|
|
self.assertEqual(id, range(1, 11))
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'animal.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
def test_sequence_field_value_decorator(self):
|
|
class Person(Document):
|
|
id = SequenceField(primary_key=True, value_decorator=str)
|
|
name = StringField()
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Person.drop_collection()
|
|
|
|
for x in range(10):
|
|
p = Person(name="Person %s" % x)
|
|
p.save()
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
ids = [i.id for i in Person.objects]
|
|
self.assertEqual(ids, map(str, range(1, 11)))
|
|
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'})
|
|
self.assertEqual(c['next'], 10)
|
|
|
|
def test_embedded_sequence_field(self):
|
|
class Comment(EmbeddedDocument):
|
|
id = SequenceField()
|
|
content = StringField(required=True)
|
|
|
|
class Post(Document):
|
|
title = StringField(required=True)
|
|
comments = ListField(EmbeddedDocumentField(Comment))
|
|
|
|
self.db['mongoengine.counters'].drop()
|
|
Post.drop_collection()
|
|
|
|
Post(title="MongoEngine",
|
|
comments=[Comment(content="NoSQL Rocks"),
|
|
Comment(content="MongoEngine Rocks")]).save()
|
|
c = self.db['mongoengine.counters'].find_one({'_id': 'comment.id'})
|
|
self.assertEqual(c['next'], 2)
|
|
post = Post.objects.first()
|
|
self.assertEqual(1, post.comments[0].id)
|
|
self.assertEqual(2, post.comments[1].id)
|
|
|
|
def test_inherited_sequencefield(self):
|
|
class Base(Document):
|
|
name = StringField()
|
|
counter = SequenceField()
|
|
meta = {'abstract': True}
|
|
|
|
class Foo(Base):
|
|
pass
|
|
|
|
class Bar(Base):
|
|
pass
|
|
|
|
bar = Bar(name='Bar')
|
|
bar.save()
|
|
|
|
foo = Foo(name='Foo')
|
|
foo.save()
|
|
|
|
self.assertTrue('base.counter' in
|
|
self.db['mongoengine.counters'].find().distinct('_id'))
|
|
self.assertFalse(('foo.counter' or 'bar.counter') in
|
|
self.db['mongoengine.counters'].find().distinct('_id'))
|
|
self.assertNotEqual(foo.counter, bar.counter)
|
|
self.assertEqual(foo._fields['counter'].owner_document, Base)
|
|
self.assertEqual(bar._fields['counter'].owner_document, Base)
|
|
|
|
def test_no_inherited_sequencefield(self):
|
|
class Base(Document):
|
|
name = StringField()
|
|
meta = {'abstract': True}
|
|
|
|
class Foo(Base):
|
|
counter = SequenceField()
|
|
|
|
class Bar(Base):
|
|
counter = SequenceField()
|
|
|
|
bar = Bar(name='Bar')
|
|
bar.save()
|
|
|
|
foo = Foo(name='Foo')
|
|
foo.save()
|
|
|
|
self.assertFalse('base.counter' in
|
|
self.db['mongoengine.counters'].find().distinct('_id'))
|
|
self.assertTrue(('foo.counter' and 'bar.counter') in
|
|
self.db['mongoengine.counters'].find().distinct('_id'))
|
|
self.assertEqual(foo.counter, bar.counter)
|
|
self.assertEqual(foo._fields['counter'].owner_document, Foo)
|
|
self.assertEqual(bar._fields['counter'].owner_document, Bar)
|