diff options
Diffstat (limited to 'tests/regressiontests')
| -rw-r--r-- | tests/regressiontests/one_to_one_regress/tests.py | 70 | ||||
| -rw-r--r-- | tests/regressiontests/select_related_onetoone/tests.py | 30 |
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 |
