from __future__ import with_statement import unittest from nose.plugins.skip import SkipTest from mongoengine.python3_support import PY3 from mongoengine import * try: from mongoengine.django.shortcuts import get_document_or_404 from django.http import Http404 from django.template import Context, Template from django.conf import settings from django.core.paginator import Paginator settings.configure() from django.contrib.sessions.tests import SessionTestsMixin from mongoengine.django.sessions import SessionStore, MongoSession except Exception, err: if PY3: SessionTestsMixin = type #dummy value so no error SessionStore = None #dummy value so no error else: raise err class QuerySetTest(unittest.TestCase): def setUp(self): if PY3: raise SkipTest('django does not have Python 3 support') connect(db='mongoenginetest') class Person(Document): name = StringField() age = IntField() self.Person = Person def test_order_by_in_django_template(self): """Ensure that QuerySets are properly ordered in Django template. """ self.Person.drop_collection() self.Person(name="A", age=20).save() self.Person(name="D", age=10).save() self.Person(name="B", age=40).save() self.Person(name="C", age=30).save() t = Template("{% for o in ol %}{{ o.name }}-{{ o.age }}:{% endfor %}") d = {"ol": self.Person.objects.order_by('-name')} self.assertEqual(t.render(Context(d)), u'D-10:C-30:B-40:A-20:') d = {"ol": self.Person.objects.order_by('+name')} self.assertEqual(t.render(Context(d)), u'A-20:B-40:C-30:D-10:') d = {"ol": self.Person.objects.order_by('-age')} self.assertEqual(t.render(Context(d)), u'B-40:C-30:A-20:D-10:') d = {"ol": self.Person.objects.order_by('+age')} self.assertEqual(t.render(Context(d)), u'D-10:A-20:C-30:B-40:') self.Person.drop_collection() def test_q_object_filter_in_template(self): self.Person.drop_collection() self.Person(name="A", age=20).save() self.Person(name="D", age=10).save() self.Person(name="B", age=40).save() self.Person(name="C", age=30).save() t = Template("{% for o in ol %}{{ o.name }}-{{ o.age }}:{% endfor %}") d = {"ol": self.Person.objects.filter(Q(age=10) | Q(name="C"))} self.assertEqual(t.render(Context(d)), 'D-10:C-30:') # Check double rendering doesn't throw an error self.assertEqual(t.render(Context(d)), 'D-10:C-30:') def test_get_document_or_404(self): p = self.Person(name="G404") p.save() self.assertRaises(Http404, get_document_or_404, self.Person, pk='1234') self.assertEqual(p, get_document_or_404(self.Person, pk=p.pk)) def test_pagination(self): """Ensure that Pagination works as expected """ class Page(Document): name = StringField() Page.drop_collection() for i in xrange(1, 11): Page(name=str(i)).save() paginator = Paginator(Page.objects.all(), 2) t = Template("{% for i in page.object_list %}{{ i.name }}:{% endfor %}") for p in paginator.page_range: d = {"page": paginator.page(p)} end = p * 2 start = end - 1 self.assertEqual(t.render(Context(d)), u'%d:%d:' % (start, end)) class MongoDBSessionTest(SessionTestsMixin, unittest.TestCase): backend = SessionStore def setUp(self): if PY3: raise SkipTest('django does not have Python 3 support') connect(db='mongoenginetest') MongoSession.drop_collection() super(MongoDBSessionTest, self).setUp() def test_first_save(self): session = SessionStore() session['test'] = True session.save() self.assertTrue('test' in session)