test_related_fields.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from django.test import TestCase
  2. from wagtail.search import index
  3. from wagtail.tests.search.models import Book, Novel
  4. from wagtail.tests.testapp.models import Advert, ManyToManyBlogPage
  5. class TestSelectOnQuerySet(TestCase):
  6. def test_select_on_queryset_with_foreign_key(self):
  7. fields = index.RelatedFields('protagonist', [
  8. index.SearchField('name'),
  9. ])
  10. queryset = fields.select_on_queryset(Novel.objects.all())
  11. # ForeignKey should be select_related
  12. self.assertFalse(queryset._prefetch_related_lookups)
  13. self.assertIn('protagonist', queryset.query.select_related)
  14. def test_select_on_queryset_with_one_to_one(self):
  15. fields = index.RelatedFields('book_ptr', [
  16. index.SearchField('title'),
  17. ])
  18. queryset = fields.select_on_queryset(Novel.objects.all())
  19. # OneToOneField should be select_related
  20. self.assertFalse(queryset._prefetch_related_lookups)
  21. self.assertIn('book_ptr', queryset.query.select_related)
  22. def test_select_on_queryset_with_many_to_many(self):
  23. fields = index.RelatedFields('adverts', [
  24. index.SearchField('title'),
  25. ])
  26. queryset = fields.select_on_queryset(ManyToManyBlogPage.objects.all())
  27. # ManyToManyField should be prefetch_related
  28. self.assertIn('adverts', queryset._prefetch_related_lookups)
  29. self.assertFalse(queryset.query.select_related)
  30. def test_select_on_queryset_with_reverse_foreign_key(self):
  31. fields = index.RelatedFields('categories', [
  32. index.RelatedFields('category', [
  33. index.SearchField('name')
  34. ])
  35. ])
  36. queryset = fields.select_on_queryset(ManyToManyBlogPage.objects.all())
  37. # reverse ForeignKey should be prefetch_related
  38. self.assertIn('categories', queryset._prefetch_related_lookups)
  39. self.assertFalse(queryset.query.select_related)
  40. def test_select_on_queryset_with_reverse_one_to_one(self):
  41. fields = index.RelatedFields('novel', [
  42. index.SearchField('subtitle'),
  43. ])
  44. queryset = fields.select_on_queryset(Book.objects.all())
  45. # reverse OneToOneField should be select_related
  46. self.assertFalse(queryset._prefetch_related_lookups)
  47. self.assertIn('novel', queryset.query.select_related)
  48. def test_select_on_queryset_with_reverse_many_to_many(self):
  49. fields = index.RelatedFields('manytomanyblogpage', [
  50. index.SearchField('title'),
  51. ])
  52. queryset = fields.select_on_queryset(Advert.objects.all())
  53. # reverse ManyToManyField should be prefetch_related
  54. self.assertIn('manytomanyblogpage', queryset._prefetch_related_lookups)
  55. self.assertFalse(queryset.query.select_related)
  56. def test_select_on_queryset_with_taggable_manager(self):
  57. fields = index.RelatedFields('tags', [
  58. index.SearchField('name'),
  59. ])
  60. queryset = fields.select_on_queryset(Novel.objects.all())
  61. # Tags should be prefetch_related
  62. self.assertIn('tags', queryset._prefetch_related_lookups)
  63. self.assertFalse(queryset.query.select_related)