Merge branch 'regex-query-shortcuts'
This commit is contained in:
@@ -186,6 +186,59 @@ class QuerySetTest(unittest.TestCase):
|
||||
person = self.Person.objects.get(age=50)
|
||||
self.assertEqual(person.name, "User C")
|
||||
|
||||
def test_regex_query_shortcuts(self):
|
||||
"""Ensure that contains, startswith, endswith, etc work.
|
||||
"""
|
||||
person = self.Person(name='Guido van Rossum')
|
||||
person.save()
|
||||
|
||||
# Test contains
|
||||
obj = self.Person.objects(name__contains='van').first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(name__contains='Van').first()
|
||||
self.assertEqual(obj, None)
|
||||
obj = self.Person.objects(Q(name__contains='van')).first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__contains='Van')).first()
|
||||
self.assertEqual(obj, None)
|
||||
|
||||
# Test icontains
|
||||
obj = self.Person.objects(name__icontains='Van').first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__icontains='Van')).first()
|
||||
self.assertEqual(obj, person)
|
||||
|
||||
# Test startswith
|
||||
obj = self.Person.objects(name__startswith='Guido').first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(name__startswith='guido').first()
|
||||
self.assertEqual(obj, None)
|
||||
obj = self.Person.objects(Q(name__startswith='Guido')).first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__startswith='guido')).first()
|
||||
self.assertEqual(obj, None)
|
||||
|
||||
# Test istartswith
|
||||
obj = self.Person.objects(name__istartswith='guido').first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__istartswith='guido')).first()
|
||||
self.assertEqual(obj, person)
|
||||
|
||||
# Test endswith
|
||||
obj = self.Person.objects(name__endswith='Rossum').first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(name__endswith='rossuM').first()
|
||||
self.assertEqual(obj, None)
|
||||
obj = self.Person.objects(Q(name__endswith='Rossum')).first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__endswith='rossuM')).first()
|
||||
self.assertEqual(obj, None)
|
||||
|
||||
# Test iendswith
|
||||
obj = self.Person.objects(name__iendswith='rossuM').first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__iendswith='rossuM')).first()
|
||||
self.assertEqual(obj, person)
|
||||
|
||||
def test_filter_chaining(self):
|
||||
"""Ensure filters can be chained together.
|
||||
@@ -356,6 +409,11 @@ class QuerySetTest(unittest.TestCase):
|
||||
post6 = BlogPost(published=False)
|
||||
post6.save()
|
||||
|
||||
# Check ObjectId lookup works
|
||||
obj = BlogPost.objects(id=post1.id).first()
|
||||
self.assertEqual(obj, post1)
|
||||
|
||||
# Check Q object combination
|
||||
date = datetime(2010, 1, 10)
|
||||
q = BlogPost.objects(Q(publish_date__lte=date) | Q(published=True))
|
||||
posts = [post.id for post in q]
|
||||
@@ -376,6 +434,26 @@ class QuerySetTest(unittest.TestCase):
|
||||
self.assertEqual(len(self.Person.objects(Q(age__in=[20]))), 2)
|
||||
self.assertEqual(len(self.Person.objects(Q(age__in=[20, 30]))), 3)
|
||||
|
||||
def test_q_regex(self):
|
||||
"""Ensure that Q objects can be queried using regexes.
|
||||
"""
|
||||
person = self.Person(name='Guido van Rossum')
|
||||
person.save()
|
||||
|
||||
import re
|
||||
obj = self.Person.objects(Q(name=re.compile('^Gui'))).first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name=re.compile('^gui'))).first()
|
||||
self.assertEqual(obj, None)
|
||||
|
||||
obj = self.Person.objects(Q(name=re.compile('^gui', re.I))).first()
|
||||
self.assertEqual(obj, person)
|
||||
|
||||
obj = self.Person.objects(Q(name__ne=re.compile('^bob'))).first()
|
||||
self.assertEqual(obj, person)
|
||||
obj = self.Person.objects(Q(name__ne=re.compile('^Gui'))).first()
|
||||
self.assertEqual(obj, None)
|
||||
|
||||
def test_exec_js_query(self):
|
||||
"""Ensure that queries are properly formed for use in exec_js.
|
||||
"""
|
||||
@@ -420,6 +498,58 @@ class QuerySetTest(unittest.TestCase):
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
def test_exec_js_field_sub(self):
|
||||
"""Ensure that field substitutions occur properly in exec_js functions.
|
||||
"""
|
||||
class Comment(EmbeddedDocument):
|
||||
content = StringField(name='body')
|
||||
|
||||
class BlogPost(Document):
|
||||
name = StringField(name='doc-name')
|
||||
comments = ListField(EmbeddedDocumentField(Comment), name='cmnts')
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
comments1 = [Comment(content='cool'), Comment(content='yay')]
|
||||
post1 = BlogPost(name='post1', comments=comments1)
|
||||
post1.save()
|
||||
|
||||
comments2 = [Comment(content='nice stuff')]
|
||||
post2 = BlogPost(name='post2', comments=comments2)
|
||||
post2.save()
|
||||
|
||||
code = """
|
||||
function getComments() {
|
||||
var comments = [];
|
||||
db[collection].find(query).forEach(function(doc) {
|
||||
var docComments = doc[~comments];
|
||||
for (var i = 0; i < docComments.length; i++) {
|
||||
comments.push({
|
||||
'document': doc[~name],
|
||||
'comment': doc[~comments][i][~comments.content]
|
||||
});
|
||||
}
|
||||
});
|
||||
return comments;
|
||||
}
|
||||
"""
|
||||
|
||||
sub_code = BlogPost.objects._sub_js_fields(code)
|
||||
code_chunks = ['doc["cmnts"];', 'doc["doc-name"],',
|
||||
'doc["cmnts"][i]["body"]']
|
||||
for chunk in code_chunks:
|
||||
self.assertTrue(chunk in sub_code)
|
||||
|
||||
results = BlogPost.objects.exec_js(code)
|
||||
expected_results = [
|
||||
{u'comment': u'cool', u'document': u'post1'},
|
||||
{u'comment': u'yay', u'document': u'post1'},
|
||||
{u'comment': u'nice stuff', u'document': u'post2'},
|
||||
]
|
||||
self.assertEqual(results, expected_results)
|
||||
|
||||
BlogPost.drop_collection()
|
||||
|
||||
def test_delete(self):
|
||||
"""Ensure that documents are properly deleted from the database.
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user