summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/one_to_one_regress/tests.py70
-rw-r--r--tests/regressiontests/select_related_onetoone/tests.py30
2 files changed, 99 insertions, 1 deletions
diff --git a/tests/regressiontests/one_to_one_regress/tests.py b/tests/regressiontests/one_to_one_regress/tests.py
index 88980c2191..eced88598b 100644
--- a/tests/regressiontests/one_to_one_regress/tests.py
+++ b/tests/regressiontests/one_to_one_regress/tests.py
@@ -132,3 +132,73 @@ class OneToOneRegressionTests(TestCase):
Target.objects.exclude(pointer2=None),
[]
)
+
+ def test_reverse_object_does_not_exist_cache(self):
+ """
+ Regression for #13839 and #17439.
+
+ DoesNotExist on a reverse one-to-one relation is cached.
+ """
+ p = Place(name='Zombie Cats', address='Not sure')
+ p.save()
+ with self.assertNumQueries(1):
+ with self.assertRaises(Restaurant.DoesNotExist):
+ p.restaurant
+ with self.assertNumQueries(0):
+ with self.assertRaises(Restaurant.DoesNotExist):
+ p.restaurant
+
+ def test_reverse_object_cached_when_related_is_accessed(self):
+ """
+ Regression for #13839 and #17439.
+
+ The target of a one-to-one relation is cached
+ when the origin is accessed through the reverse relation.
+ """
+ # Use a fresh object without caches
+ r = Restaurant.objects.get(pk=self.r1.pk)
+ p = r.place
+ with self.assertNumQueries(0):
+ self.assertEqual(p.restaurant, r)
+
+ def test_related_object_cached_when_reverse_is_accessed(self):
+ """
+ Regression for #13839 and #17439.
+
+ The origin of a one-to-one relation is cached
+ when the target is accessed through the reverse relation.
+ """
+ # Use a fresh object without caches
+ p = Place.objects.get(pk=self.p1.pk)
+ r = p.restaurant
+ with self.assertNumQueries(0):
+ self.assertEqual(r.place, p)
+
+ def test_reverse_object_cached_when_related_is_set(self):
+ """
+ Regression for #13839 and #17439.
+
+ The target of a one-to-one relation is always cached.
+ """
+ p = Place(name='Zombie Cats', address='Not sure')
+ p.save()
+ self.r1.place = p
+ self.r1.save()
+ with self.assertNumQueries(0):
+ self.assertEqual(p.restaurant, self.r1)
+
+ def test_reverse_object_cached_when_related_is_unset(self):
+ """
+ Regression for #13839 and #17439.
+
+ The target of a one-to-one relation is always cached.
+ """
+ b = UndergroundBar(place=self.p1, serves_cocktails=True)
+ b.save()
+ with self.assertNumQueries(0):
+ self.assertEqual(self.p1.undergroundbar, b)
+ b.place = None
+ b.save()
+ with self.assertNumQueries(0):
+ with self.assertRaises(UndergroundBar.DoesNotExist):
+ self.p1.undergroundbar
diff --git a/tests/regressiontests/select_related_onetoone/tests.py b/tests/regressiontests/select_related_onetoone/tests.py
index d57ee90570..1373f04717 100644
--- a/tests/regressiontests/select_related_onetoone/tests.py
+++ b/tests/regressiontests/select_related_onetoone/tests.py
@@ -79,4 +79,32 @@ class ReverseSelectRelatedTestCase(TestCase):
p1 = Product.objects.create(name="Django Plushie", image=im)
p2 = Product.objects.create(name="Talking Django Plushie")
- self.assertEqual(len(Product.objects.select_related("image")), 2)
+ with self.assertNumQueries(1):
+ result = sorted(Product.objects.select_related("image"), key=lambda x: x.name)
+ self.assertEqual([p.name for p in result], ["Django Plushie", "Talking Django Plushie"])
+
+ self.assertEqual(p1.image, im)
+ # Check for ticket #13839
+ self.assertIsNone(p2.image)
+
+ def test_missing_reverse(self):
+ """
+ Ticket #13839: select_related() should NOT cache None
+ for missing objects on a reverse 1-1 relation.
+ """
+ with self.assertNumQueries(1):
+ user = User.objects.select_related('userprofile').get(username='bob')
+ with self.assertRaises(UserProfile.DoesNotExist):
+ user.userprofile
+
+ def test_nullable_missing_reverse(self):
+ """
+ Ticket #13839: select_related() should NOT cache None
+ for missing objects on a reverse 0-1 relation.
+ """
+ Image.objects.create(name="imag1")
+
+ with self.assertNumQueries(1):
+ image = Image.objects.select_related('product').get()
+ with self.assertRaises(Product.DoesNotExist):
+ image.product