summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/known_related_objects/fixtures/tournament.json11
-rw-r--r--tests/modeltests/known_related_objects/models.py4
-rw-r--r--tests/modeltests/known_related_objects/tests.py42
3 files changed, 56 insertions, 1 deletions
diff --git a/tests/modeltests/known_related_objects/fixtures/tournament.json b/tests/modeltests/known_related_objects/fixtures/tournament.json
index 2f2b1c5627..b8f053e152 100644
--- a/tests/modeltests/known_related_objects/fixtures/tournament.json
+++ b/tests/modeltests/known_related_objects/fixtures/tournament.json
@@ -15,9 +15,17 @@
},
{
"pk": 1,
+ "model": "known_related_objects.organiser",
+ "fields": {
+ "name": "Organiser 1"
+ }
+ },
+ {
+ "pk": 1,
"model": "known_related_objects.pool",
"fields": {
"tournament": 1,
+ "organiser": 1,
"name": "T1 Pool 1"
}
},
@@ -26,6 +34,7 @@
"model": "known_related_objects.pool",
"fields": {
"tournament": 1,
+ "organiser": 1,
"name": "T1 Pool 2"
}
},
@@ -34,6 +43,7 @@
"model": "known_related_objects.pool",
"fields": {
"tournament": 2,
+ "organiser": 1,
"name": "T2 Pool 1"
}
},
@@ -42,6 +52,7 @@
"model": "known_related_objects.pool",
"fields": {
"tournament": 2,
+ "organiser": 1,
"name": "T2 Pool 2"
}
},
diff --git a/tests/modeltests/known_related_objects/models.py b/tests/modeltests/known_related_objects/models.py
index 4c516dd7e8..e256cc38f2 100644
--- a/tests/modeltests/known_related_objects/models.py
+++ b/tests/modeltests/known_related_objects/models.py
@@ -9,9 +9,13 @@ from django.db import models
class Tournament(models.Model):
name = models.CharField(max_length=30)
+class Organiser(models.Model):
+ name = models.CharField(max_length=30)
+
class Pool(models.Model):
name = models.CharField(max_length=30)
tournament = models.ForeignKey(Tournament)
+ organiser = models.ForeignKey(Organiser)
class PoolStyle(models.Model):
name = models.CharField(max_length=30)
diff --git a/tests/modeltests/known_related_objects/tests.py b/tests/modeltests/known_related_objects/tests.py
index 24feab2241..2371ac2e20 100644
--- a/tests/modeltests/known_related_objects/tests.py
+++ b/tests/modeltests/known_related_objects/tests.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import
from django.test import TestCase
-from .models import Tournament, Pool, PoolStyle
+from .models import Tournament, Organiser, Pool, PoolStyle
class ExistingRelatedInstancesTests(TestCase):
fixtures = ['tournament.json']
@@ -27,6 +27,46 @@ class ExistingRelatedInstancesTests(TestCase):
pool2 = tournaments[1].pool_set.all()[0]
self.assertIs(tournaments[1], pool2.tournament)
+ def test_queryset_or(self):
+ tournament_1 = Tournament.objects.get(pk=1)
+ tournament_2 = Tournament.objects.get(pk=2)
+ with self.assertNumQueries(1):
+ pools = tournament_1.pool_set.all() | tournament_2.pool_set.all()
+ related_objects = set(pool.tournament for pool in pools)
+ self.assertEqual(related_objects, set((tournament_1, tournament_2)))
+
+ def test_queryset_or_different_cached_items(self):
+ tournament = Tournament.objects.get(pk=1)
+ organiser = Organiser.objects.get(pk=1)
+ with self.assertNumQueries(1):
+ pools = tournament.pool_set.all() | organiser.pool_set.all()
+ first = pools.filter(pk=1)[0]
+ self.assertIs(first.tournament, tournament)
+ self.assertIs(first.organiser, organiser)
+
+ def test_queryset_or_only_one_with_precache(self):
+ tournament_1 = Tournament.objects.get(pk=1)
+ tournament_2 = Tournament.objects.get(pk=2)
+ # 2 queries here as pool id 3 has tournament 2, which is not cached
+ with self.assertNumQueries(2):
+ pools = tournament_1.pool_set.all() | Pool.objects.filter(pk=3)
+ related_objects = set(pool.tournament for pool in pools)
+ self.assertEqual(related_objects, set((tournament_1, tournament_2)))
+ # and the other direction
+ with self.assertNumQueries(2):
+ pools = Pool.objects.filter(pk=3) | tournament_1.pool_set.all()
+ related_objects = set(pool.tournament for pool in pools)
+ self.assertEqual(related_objects, set((tournament_1, tournament_2)))
+
+ def test_queryset_and(self):
+ tournament = Tournament.objects.get(pk=1)
+ organiser = Organiser.objects.get(pk=1)
+ with self.assertNumQueries(1):
+ pools = tournament.pool_set.all() & organiser.pool_set.all()
+ first = pools.filter(pk=1)[0]
+ self.assertIs(first.tournament, tournament)
+ self.assertIs(first.organiser, organiser)
+
def test_one_to_one(self):
with self.assertNumQueries(2):
style = PoolStyle.objects.get(pk=1)