Commit 76da0536 authored by Anssi Kääriäinen's avatar Anssi Kääriäinen
Browse files

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.
parent 8a048922
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
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)