summaryrefslogtreecommitdiff
path: root/tests/custom_managers/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/custom_managers/tests.py')
-rw-r--r--tests/custom_managers/tests.py318
1 files changed, 291 insertions, 27 deletions
diff --git a/tests/custom_managers/tests.py b/tests/custom_managers/tests.py
index 021decc455..af36110eca 100644
--- a/tests/custom_managers/tests.py
+++ b/tests/custom_managers/tests.py
@@ -3,7 +3,7 @@ from __future__ import unicode_literals
from django.test import TestCase
from django.utils import six
-from .models import Person, Book, Car, PersonManager, PublishedBookManager
+from .models import Person, FunPerson, Book, Car, PersonManager, PublishedBookManager
class CustomManagerTests(TestCase):
@@ -12,10 +12,11 @@ class CustomManagerTests(TestCase):
title="How to program", author="Rodney Dangerfield", is_published=True)
self.b2 = Book.published_objects.create(
title="How to be smart", author="Albert Einstein", is_published=False)
- self.p1 = Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True)
- self.p2 = Person.objects.create(first_name="Droopy", last_name="Dog", fun=False)
def test_manager(self):
+ Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True)
+ droopy = Person.objects.create(first_name="Droopy", last_name="Dog", fun=False)
+
# Test a custom `Manager` method.
self.assertQuerysetEqual(
Person.objects.get_fun_people(), [
@@ -66,7 +67,7 @@ class CustomManagerTests(TestCase):
# The RelatedManager used on the 'books' descriptor extends the default
# manager
- self.assertIsInstance(self.p2.books, PublishedBookManager)
+ self.assertIsInstance(droopy.books, PublishedBookManager)
# The default manager, "objects", doesn't exist, because a custom one
# was provided.
@@ -113,78 +114,341 @@ class CustomManagerTests(TestCase):
lambda c: c.name
)
- def test_related_manager_fk(self):
- self.p1.favorite_book = self.b1
- self.p1.save()
- self.p2.favorite_book = self.b1
- self.p2.save()
+ def test_fk_related_manager(self):
+ Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_book=self.b1)
+ Person.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_book=self.b1)
+ FunPerson.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_book=self.b1)
+ FunPerson.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_book=self.b1)
self.assertQuerysetEqual(
self.b1.favorite_books.order_by('first_name').all(), [
"Bugs",
"Droopy",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.assertQuerysetEqual(
+ self.b1.fun_people_favorite_books.all(), [
+ "Bugs",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
)
self.assertQuerysetEqual(
self.b1.favorite_books(manager='boring_people').all(), [
"Droopy",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
)
self.assertQuerysetEqual(
self.b1.favorite_books(manager='fun_people').all(), [
"Bugs",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
)
- def test_related_manager_gfk(self):
- self.p1.favorite_thing = self.b1
- self.p1.save()
- self.p2.favorite_thing = self.b1
- self.p2.save()
+ def test_gfk_related_manager(self):
+ Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_thing=self.b1)
+ Person.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_thing=self.b1)
+ FunPerson.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_thing=self.b1)
+ FunPerson.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_thing=self.b1)
self.assertQuerysetEqual(
- self.b1.favorite_things.order_by('first_name').all(), [
+ self.b1.favorite_things.all(), [
"Bugs",
"Droopy",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.assertQuerysetEqual(
+ self.b1.fun_people_favorite_things.all(), [
+ "Bugs",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
)
self.assertQuerysetEqual(
self.b1.favorite_things(manager='boring_people').all(), [
"Droopy",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
)
self.assertQuerysetEqual(
self.b1.favorite_things(manager='fun_people').all(), [
"Bugs",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
)
- def test_related_manager_m2m(self):
- self.b1.authors.add(self.p1)
- self.b1.authors.add(self.p2)
+ def test_m2m_related_manager(self):
+ bugs = Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True)
+ self.b1.authors.add(bugs)
+ droopy = Person.objects.create(first_name="Droopy", last_name="Dog", fun=False)
+ self.b1.authors.add(droopy)
+ bugs = FunPerson.objects.create(first_name="Bugs", last_name="Bunny", fun=True)
+ self.b1.fun_authors.add(bugs)
+ droopy = FunPerson.objects.create(first_name="Droopy", last_name="Dog", fun=False)
+ self.b1.fun_authors.add(droopy)
self.assertQuerysetEqual(
self.b1.authors.order_by('first_name').all(), [
"Bugs",
"Droopy",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.assertQuerysetEqual(
+ self.b1.fun_authors.order_by('first_name').all(), [
+ "Bugs",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
)
self.assertQuerysetEqual(
self.b1.authors(manager='boring_people').all(), [
"Droopy",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
)
self.assertQuerysetEqual(
self.b1.authors(manager='fun_people').all(), [
"Bugs",
],
- lambda c: c.first_name
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ def test_removal_through_default_fk_related_manager(self):
+ bugs = FunPerson.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_book=self.b1)
+ droopy = FunPerson.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_book=self.b1)
+
+ self.b1.fun_people_favorite_books.remove(droopy)
+ self.assertQuerysetEqual(
+ FunPerson._base_manager.filter(favorite_book=self.b1), [
+ "Bugs",
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ self.b1.fun_people_favorite_books.remove(bugs)
+ self.assertQuerysetEqual(
+ FunPerson._base_manager.filter(favorite_book=self.b1), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ bugs.favorite_book = self.b1
+ bugs.save()
+
+ self.b1.fun_people_favorite_books.clear()
+ self.assertQuerysetEqual(
+ FunPerson._base_manager.filter(favorite_book=self.b1), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ def test_removal_through_specified_fk_related_manager(self):
+ Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_book=self.b1)
+ droopy = Person.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_book=self.b1)
+
+ # Check that the fun manager DOESN'T remove boring people.
+ self.b1.favorite_books(manager='fun_people').remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.favorite_books(manager='boring_people').all(), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ # Check that the boring manager DOES remove boring people.
+ self.b1.favorite_books(manager='boring_people').remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.favorite_books(manager='boring_people').all(), [
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ droopy.favorite_book = self.b1
+ droopy.save()
+
+ # Check that the fun manager ONLY clears fun people.
+ self.b1.favorite_books(manager='fun_people').clear()
+ self.assertQuerysetEqual(
+ self.b1.favorite_books(manager='boring_people').all(), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.assertQuerysetEqual(
+ self.b1.favorite_books(manager='fun_people').all(), [
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ def test_removal_through_default_gfk_related_manager(self):
+ bugs = FunPerson.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_thing=self.b1)
+ droopy = FunPerson.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_thing=self.b1)
+
+ self.b1.fun_people_favorite_things.remove(droopy)
+ self.assertQuerysetEqual(
+ FunPerson._base_manager.order_by('first_name').filter(favorite_thing_id=self.b1.pk), [
+ "Bugs",
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ self.b1.fun_people_favorite_things.remove(bugs)
+ self.assertQuerysetEqual(
+ FunPerson._base_manager.order_by('first_name').filter(favorite_thing_id=self.b1.pk), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ bugs.favorite_book = self.b1
+ bugs.save()
+
+ self.b1.fun_people_favorite_things.clear()
+ self.assertQuerysetEqual(
+ FunPerson._base_manager.order_by('first_name').filter(favorite_thing_id=self.b1.pk), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ def test_removal_through_specified_gfk_related_manager(self):
+ Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True, favorite_thing=self.b1)
+ droopy = Person.objects.create(first_name="Droopy", last_name="Dog", fun=False, favorite_thing=self.b1)
+
+ # Check that the fun manager DOESN'T remove boring people.
+ self.b1.favorite_things(manager='fun_people').remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.favorite_things(manager='boring_people').all(), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ # Check that the boring manager DOES remove boring people.
+ self.b1.favorite_things(manager='boring_people').remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.favorite_things(manager='boring_people').all(), [
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ droopy.favorite_thing = self.b1
+ droopy.save()
+
+ # Check that the fun manager ONLY clears fun people.
+ self.b1.favorite_things(manager='fun_people').clear()
+ self.assertQuerysetEqual(
+ self.b1.favorite_things(manager='boring_people').all(), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.assertQuerysetEqual(
+ self.b1.favorite_things(manager='fun_people').all(), [
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ def test_removal_through_default_m2m_related_manager(self):
+ bugs = FunPerson.objects.create(first_name="Bugs", last_name="Bunny", fun=True)
+ self.b1.fun_authors.add(bugs)
+ droopy = FunPerson.objects.create(first_name="Droopy", last_name="Dog", fun=False)
+ self.b1.fun_authors.add(droopy)
+
+ self.b1.fun_authors.remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.fun_authors.through._default_manager.all(), [
+ "Bugs",
+ "Droopy",
+ ],
+ lambda c: c.funperson.first_name,
+ ordered=False,
+ )
+
+ self.b1.fun_authors.remove(bugs)
+ self.assertQuerysetEqual(
+ self.b1.fun_authors.through._default_manager.all(), [
+ "Droopy",
+ ],
+ lambda c: c.funperson.first_name,
+ ordered=False,
+ )
+ self.b1.fun_authors.add(bugs)
+
+ self.b1.fun_authors.clear()
+ self.assertQuerysetEqual(
+ self.b1.fun_authors.through._default_manager.all(), [
+ "Droopy",
+ ],
+ lambda c: c.funperson.first_name,
+ ordered=False,
+ )
+
+ def test_removal_through_specified_m2m_related_manager(self):
+ bugs = Person.objects.create(first_name="Bugs", last_name="Bunny", fun=True)
+ self.b1.authors.add(bugs)
+ droopy = Person.objects.create(first_name="Droopy", last_name="Dog", fun=False)
+ self.b1.authors.add(droopy)
+
+ # Check that the fun manager DOESN'T remove boring people.
+ self.b1.authors(manager='fun_people').remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.authors(manager='boring_people').all(), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+
+ # Check that the boring manager DOES remove boring people.
+ self.b1.authors(manager='boring_people').remove(droopy)
+ self.assertQuerysetEqual(
+ self.b1.authors(manager='boring_people').all(), [
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.b1.authors.add(droopy)
+
+
+ # Check that the fun manager ONLY clears fun people.
+ self.b1.authors(manager='fun_people').clear()
+ self.assertQuerysetEqual(
+ self.b1.authors(manager='boring_people').all(), [
+ "Droopy",
+ ],
+ lambda c: c.first_name,
+ ordered=False,
+ )
+ self.assertQuerysetEqual(
+ self.b1.authors(manager='fun_people').all(), [
+ ],
+ lambda c: c.first_name,
+ ordered=False,
)