From 76da053641e52db540801e18b362497c01e9bb1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= Date: Tue, 5 Nov 2013 20:02:24 +0200 Subject: [PATCH] Fixed #10461 -- bug in generic relation + annotate() case This issue was fixed when the contenttype restriction was moved from where clause to the join clause. So, this is tests only addition. --- tests/generic_relations_regress/tests.py | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) 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)