1. from django.test import TestCase
    
  2. 
    
  3. from .models import SlugPage
    
  4. 
    
  5. 
    
  6. class RestrictedConditionsTests(TestCase):
    
  7.     @classmethod
    
  8.     def setUpTestData(cls):
    
  9.         slugs = [
    
  10.             "a",
    
  11.             "a/a",
    
  12.             "a/b",
    
  13.             "a/b/a",
    
  14.             "x",
    
  15.             "x/y/z",
    
  16.         ]
    
  17.         SlugPage.objects.bulk_create([SlugPage(slug=slug) for slug in slugs])
    
  18. 
    
  19.     def test_restrictions_with_no_joining_columns(self):
    
  20.         """
    
  21.         It's possible to create a working related field that doesn't
    
  22.         use any joining columns, as long as an extra restriction is supplied.
    
  23.         """
    
  24.         a = SlugPage.objects.get(slug="a")
    
  25.         self.assertEqual(
    
  26.             [p.slug for p in SlugPage.objects.filter(ascendants=a)],
    
  27.             ["a", "a/a", "a/b", "a/b/a"],
    
  28.         )
    
  29.         self.assertEqual(
    
  30.             [p.slug for p in a.descendants.all()],
    
  31.             ["a", "a/a", "a/b", "a/b/a"],
    
  32.         )
    
  33. 
    
  34.         aba = SlugPage.objects.get(slug="a/b/a")
    
  35.         self.assertEqual(
    
  36.             [p.slug for p in SlugPage.objects.filter(descendants__in=[aba])],
    
  37.             ["a", "a/b", "a/b/a"],
    
  38.         )
    
  39.         self.assertEqual(
    
  40.             [p.slug for p in aba.ascendants.all()],
    
  41.             ["a", "a/b", "a/b/a"],
    
  42.         )
    
  43. 
    
  44.     def test_empty_join_conditions(self):
    
  45.         x = SlugPage.objects.get(slug="x")
    
  46.         message = "Join generated an empty ON clause."
    
  47.         with self.assertRaisesMessage(ValueError, message):
    
  48.             list(SlugPage.objects.filter(containers=x))