Skip to content

Commit

Permalink
Fixed #10461 -- bug in generic relation + annotate() case
Browse files Browse the repository at this point in the history
This issue was fixed when the contenttype restriction was moved from
where clause to the join clause. So, this is tests only addition.
  • Loading branch information
akaariai committed Nov 5, 2013
1 parent 8a04892 commit 76da053
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion 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

Expand Down Expand Up @@ -213,3 +213,26 @@ def test_extra_join_condition(self):
# 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)

0 comments on commit 76da053

Please sign in to comment.