tests.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from __future__ import unicode_literals
  2. from django.test import TestCase
  3. from .models import Tournament, Organiser, Pool, PoolStyle
  4. class ExistingRelatedInstancesTests(TestCase):
  5. fixtures = ['tournament.json']
  6. def test_foreign_key(self):
  7. with self.assertNumQueries(2):
  8. tournament = Tournament.objects.get(pk=1)
  9. pool = tournament.pool_set.all()[0]
  10. self.assertIs(tournament, pool.tournament)
  11. def test_foreign_key_prefetch_related(self):
  12. with self.assertNumQueries(2):
  13. tournament = (Tournament.objects.prefetch_related('pool_set').get(pk=1))
  14. pool = tournament.pool_set.all()[0]
  15. self.assertIs(tournament, pool.tournament)
  16. def test_foreign_key_multiple_prefetch(self):
  17. with self.assertNumQueries(2):
  18. tournaments = list(Tournament.objects.prefetch_related('pool_set').order_by('pk'))
  19. pool1 = tournaments[0].pool_set.all()[0]
  20. self.assertIs(tournaments[0], pool1.tournament)
  21. pool2 = tournaments[1].pool_set.all()[0]
  22. self.assertIs(tournaments[1], pool2.tournament)
  23. def test_queryset_or(self):
  24. tournament_1 = Tournament.objects.get(pk=1)
  25. tournament_2 = Tournament.objects.get(pk=2)
  26. with self.assertNumQueries(1):
  27. pools = tournament_1.pool_set.all() | tournament_2.pool_set.all()
  28. related_objects = set(pool.tournament for pool in pools)
  29. self.assertEqual(related_objects, {tournament_1, tournament_2})
  30. def test_queryset_or_different_cached_items(self):
  31. tournament = Tournament.objects.get(pk=1)
  32. organiser = Organiser.objects.get(pk=1)
  33. with self.assertNumQueries(1):
  34. pools = tournament.pool_set.all() | organiser.pool_set.all()
  35. first = pools.filter(pk=1)[0]
  36. self.assertIs(first.tournament, tournament)
  37. self.assertIs(first.organiser, organiser)
  38. def test_queryset_or_only_one_with_precache(self):
  39. tournament_1 = Tournament.objects.get(pk=1)
  40. tournament_2 = Tournament.objects.get(pk=2)
  41. # 2 queries here as pool id 3 has tournament 2, which is not cached
  42. with self.assertNumQueries(2):
  43. pools = tournament_1.pool_set.all() | Pool.objects.filter(pk=3)
  44. related_objects = set(pool.tournament for pool in pools)
  45. self.assertEqual(related_objects, {tournament_1, tournament_2})
  46. # and the other direction
  47. with self.assertNumQueries(2):
  48. pools = Pool.objects.filter(pk=3) | tournament_1.pool_set.all()
  49. related_objects = set(pool.tournament for pool in pools)
  50. self.assertEqual(related_objects, {tournament_1, tournament_2})
  51. def test_queryset_and(self):
  52. tournament = Tournament.objects.get(pk=1)
  53. organiser = Organiser.objects.get(pk=1)
  54. with self.assertNumQueries(1):
  55. pools = tournament.pool_set.all() & organiser.pool_set.all()
  56. first = pools.filter(pk=1)[0]
  57. self.assertIs(first.tournament, tournament)
  58. self.assertIs(first.organiser, organiser)
  59. def test_one_to_one(self):
  60. with self.assertNumQueries(2):
  61. style = PoolStyle.objects.get(pk=1)
  62. pool = style.pool
  63. self.assertIs(style, pool.poolstyle)
  64. def test_one_to_one_select_related(self):
  65. with self.assertNumQueries(1):
  66. style = PoolStyle.objects.select_related('pool').get(pk=1)
  67. pool = style.pool
  68. self.assertIs(style, pool.poolstyle)
  69. def test_one_to_one_multi_select_related(self):
  70. with self.assertNumQueries(1):
  71. poolstyles = list(PoolStyle.objects.select_related('pool').order_by('pk'))
  72. self.assertIs(poolstyles[0], poolstyles[0].pool.poolstyle)
  73. self.assertIs(poolstyles[1], poolstyles[1].pool.poolstyle)
  74. def test_one_to_one_prefetch_related(self):
  75. with self.assertNumQueries(2):
  76. style = PoolStyle.objects.prefetch_related('pool').get(pk=1)
  77. pool = style.pool
  78. self.assertIs(style, pool.poolstyle)
  79. def test_one_to_one_multi_prefetch_related(self):
  80. with self.assertNumQueries(2):
  81. poolstyles = list(PoolStyle.objects.prefetch_related('pool').order_by('pk'))
  82. self.assertIs(poolstyles[0], poolstyles[0].pool.poolstyle)
  83. self.assertIs(poolstyles[1], poolstyles[1].pool.poolstyle)
  84. def test_reverse_one_to_one(self):
  85. with self.assertNumQueries(2):
  86. pool = Pool.objects.get(pk=2)
  87. style = pool.poolstyle
  88. self.assertIs(pool, style.pool)
  89. def test_reverse_one_to_one_select_related(self):
  90. with self.assertNumQueries(1):
  91. pool = Pool.objects.select_related('poolstyle').get(pk=2)
  92. style = pool.poolstyle
  93. self.assertIs(pool, style.pool)
  94. def test_reverse_one_to_one_prefetch_related(self):
  95. with self.assertNumQueries(2):
  96. pool = Pool.objects.prefetch_related('poolstyle').get(pk=2)
  97. style = pool.poolstyle
  98. self.assertIs(pool, style.pool)
  99. def test_reverse_one_to_one_multi_select_related(self):
  100. with self.assertNumQueries(1):
  101. pools = list(Pool.objects.select_related('poolstyle').order_by('pk'))
  102. self.assertIs(pools[1], pools[1].poolstyle.pool)
  103. self.assertIs(pools[2], pools[2].poolstyle.pool)
  104. def test_reverse_one_to_one_multi_prefetch_related(self):
  105. with self.assertNumQueries(2):
  106. pools = list(Pool.objects.prefetch_related('poolstyle').order_by('pk'))
  107. self.assertIs(pools[1], pools[1].poolstyle.pool)
  108. self.assertIs(pools[2], pools[2].poolstyle.pool)