Implementation and tests for exec_js field substitution
This commit is contained in:
@@ -387,6 +387,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