mirror of
https://github.com/jazzband/django-admin2.git
synced 2026-03-17 06:30:25 +00:00
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
from django.db import DEFAULT_DB_ALIAS, router
|
|
from django.test import TestCase
|
|
|
|
from djadmin2.utils import NestedObjects
|
|
|
|
from ..models import Count, Event, EventGuide, Guest, Location
|
|
|
|
|
|
class NestedObjectsTests(TestCase):
|
|
"""
|
|
Tests for ``NestedObject`` utility collection.
|
|
|
|
This is adopted from the Django core. django-admin2 mandates that code
|
|
doesn't depend on imports from django.contrib.admin.
|
|
|
|
https://github.com/django/django/blob/1.5.1/tests/regressiontests/admin_util/tests.py
|
|
"""
|
|
def setUp(self):
|
|
self.n = NestedObjects(using=DEFAULT_DB_ALIAS)
|
|
self.objs = [Count.objects.create(num=i) for i in range(5)]
|
|
|
|
def _check(self, target):
|
|
self.assertEqual(self.n.nested(lambda obj: obj.num), target)
|
|
|
|
def _connect(self, i, j):
|
|
self.objs[i].parent = self.objs[j]
|
|
self.objs[i].save()
|
|
|
|
def _collect(self, *indices):
|
|
self.n.collect([self.objs[i] for i in indices])
|
|
|
|
def test_unrelated_roots(self):
|
|
self._connect(2, 1)
|
|
self._collect(0)
|
|
self._collect(1)
|
|
self._check([0, 1, [2]])
|
|
|
|
def test_siblings(self):
|
|
self._connect(1, 0)
|
|
self._connect(2, 0)
|
|
self._collect(0)
|
|
self._check([0, [1, 2]])
|
|
|
|
def test_non_added_parent(self):
|
|
self._connect(0, 1)
|
|
self._collect(0)
|
|
self._check([0])
|
|
|
|
def test_cyclic(self):
|
|
self._connect(0, 2)
|
|
self._connect(1, 0)
|
|
self._connect(2, 1)
|
|
self._collect(0)
|
|
self._check([0, [1, [2]]])
|
|
|
|
def test_queries(self):
|
|
self._connect(1, 0)
|
|
self._connect(2, 0)
|
|
# 1 query to fetch all children of 0 (1 and 2)
|
|
# 1 query to fetch all children of 1 and 2 (none)
|
|
# Should not require additional queries to populate the nested graph.
|
|
self.assertNumQueries(2, self._collect, 0)
|
|
|
|
def test_on_delete_do_nothing(self):
|
|
"""
|
|
Check that the nested collector doesn't query for DO_NOTHING objects.
|
|
"""
|
|
objs = [Event.objects.create()]
|
|
using = router.db_for_write(Event._meta.model)
|
|
n = NestedObjects(using=using)
|
|
EventGuide.objects.create(event=objs[0])
|
|
with self.assertNumQueries(2):
|
|
# One for Location, one for Guest, and no query for EventGuide
|
|
n.collect(objs)
|