From 76da053641e52db540801e18b362497c01e9bb1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= <akaariai@gmail.com>
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)