diff --git a/tests/generic_relations_regress/tests.py b/tests/generic_relations_regress/tests.py index d7a43846bb..285bd43c47 100644 --- a/tests/generic_relations_regress/tests.py +++ b/tests/generic_relations_regress/tests.py @@ -1,4 +1,4 @@ -from django.db.models import Q +from django.db.models import Q, Sum from django.db.utils import IntegrityError from django.test import TestCase, skipIfDBFeature @@ -213,3 +213,26 @@ class GenericRelationTests(TestCase): # B would then fail). self.assertNotIn(" join ", str(B.objects.exclude(a__flag=True).query).lower()) self.assertIn("content_type_id", str(B.objects.exclude(a__flag=True).query).lower()) + + def test_annotate(self): + hs1 = HasLinkThing.objects.create() + b = Board.objects.create(name=str(hs1.pk)) + l = Link.objects.create(content_object=hs1) + Link.objects.create(content_object=b) + qs = HasLinkThing.objects.annotate(Sum('links')) + # If content_type restriction isn't in the query's join condition, + # then wrong results are produced here as b will also match (it has + # same pk). + self.assertEqual(qs.count(), 1) + self.assertEqual(qs[0].links__sum, 1) + l.delete() + # Now if we don't have proper left join, we will not produce any + # results at all here. + # clear cached results + qs = qs.all() + self.assertEqual(qs.count(), 1) + # Note - 0 here would be a nicer result... + self.assertIs(qs[0].links__sum, None) + # Finally test that filtering works. + self.assertEqual(qs.filter(links__sum__isnull=True).count(), 1) + self.assertEqual(qs.filter(links__sum__isnull=False).count(), 0)