def test_unique_indexes(self, unique_field): @self.instance.register class NestedDoc(EmbeddedDocument): simple = fields.StrField(unique=True) u_field, index = { "nested": ( fields.EmbeddedField(NestedDoc), IndexModel([('field.simple', ASCENDING)], unique=True, sparse=True), ), "list": ( fields.ListField(fields.EmbeddedField(NestedDoc)), IndexModel([('field.simple', ASCENDING)], unique=True, sparse=True), ), }[unique_field] @self.instance.register class Doc(Document): field = u_field assert_indexes(Doc.opts.indexes, [index])
def test_parse_index(self): for value, expected in ( ('my_index', IndexModel([('my_index', ASCENDING)])), ('+my_index', IndexModel([('my_index', ASCENDING)])), ('-my_index', IndexModel([('my_index', DESCENDING)])), ('$my_index', IndexModel([('my_index', TEXT)])), ('#my_index', IndexModel([('my_index', HASHED)])), # Compound indexes (('index1', '-index2'), IndexModel([('index1', ASCENDING), ('index2', DESCENDING)])), # No changes if not needed (IndexModel([('my_index', ASCENDING)]), IndexModel([('my_index', ASCENDING)])), # Custom index ({ 'name': 'my-custom-index', 'key': ['+index1', '-index2'], 'sparse': True, 'unique': True, 'expireAfterSeconds': 42 }, IndexModel([('index1', ASCENDING), ('index2', DESCENDING)], name='my-custom-index', sparse=True, unique=True, expireAfterSeconds=42)), ): assert_indexes(parse_index(value), expected)
def test_nested_indexes(self): """Test multikey indexes Note: umongo does not check that indexes entered in Meta match existing fields """ @self.instance.register class Doc(Document): class Meta: indexes = [ 'parent', 'parent.child', 'parent.child.grandchild', ] assert_indexes(Doc.opts.indexes, [ IndexModel([('parent', ASCENDING)]), IndexModel([('parent.child', ASCENDING)]), IndexModel([('parent.child.grandchild', ASCENDING)]), ])
def test_inheritance(self): class Parent(Document): last_name = fields.StrField() class Meta: allow_inheritance = True indexes = ['last_name'] class Child(Parent): first_name = fields.StrField() class Meta: indexes = ['-first_name'] assert_indexes(Parent.opts.indexes, [IndexModel([('last_name', ASCENDING)])]) assert_indexes(Child.opts.indexes, [ IndexModel([('last_name', ASCENDING)]), IndexModel([('first_name', DESCENDING), ('_cls', ASCENDING)]), IndexModel([('_cls', ASCENDING)]) ])
def test_nested_indexes(self): class NestedDoc(EmbeddedDocument): simple = fields.StrField() listed = fields.ListField(fields.StrField()) class Doc(Document): nested = fields.EmbeddedField(NestedDoc) listed = fields.ListField(fields.EmbeddedField(NestedDoc)) class Meta: indexes = [ 'nested', 'nested.simple', 'listed', 'listed.simple', 'listed.listed' ] assert_indexes(Doc.opts.indexes, [ IndexModel([('nested', ASCENDING)]), IndexModel([('nested.simple', ASCENDING)]), IndexModel([('listed', ASCENDING)]), IndexModel([('listed.simple', ASCENDING)]), IndexModel([('listed.listed', ASCENDING)]), ])
def test_inheritance(self): @self.instance.register class Parent(Document): last_name = fields.StrField() class Meta: indexes = ['last_name'] @self.instance.register class Child(Parent): first_name = fields.StrField() class Meta: indexes = ['-first_name'] assert_indexes(Parent.indexes, [IndexModel([('last_name', ASCENDING)])]) assert_indexes(Child.indexes, [ IndexModel([('last_name', ASCENDING)]), IndexModel([('first_name', DESCENDING), ('_cls', ASCENDING)]), IndexModel([('_cls', ASCENDING)]) ])