From 76b2c08dc8d1d8df603cd310a170192205147492 Mon Sep 17 00:00:00 2001 From: Bertrand Bordage Date: Tue, 17 Feb 2015 23:57:58 +0100 Subject: [PATCH] Adds more rare advanced queries not handled by cachalot. --- cachalot/tests/read.py | 8 +++++ cachalot/tests/write.py | 72 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/cachalot/tests/read.py b/cachalot/tests/read.py index 8df0f9c..eb1d467 100644 --- a/cachalot/tests/read.py +++ b/cachalot/tests/read.py @@ -468,6 +468,14 @@ class ReadTestCase(TransactionTestCase): .filter(n__gte=1)) self.assertListEqual(data2, [self.user]) + with self.assertNumQueries(1): + self.assertEqual(User.objects.annotate(n=Count('user_permissions')) + .filter(n__gte=1).count(), 1) + + with self.assertNumQueries(0): + self.assertEqual(User.objects.annotate(n=Count('user_permissions')) + .filter(n__gte=1).count(), 1) + def test_extra_select(self): username_length_sql = """ SELECT LENGTH(%(user_table)s.username) diff --git a/cachalot/tests/write.py b/cachalot/tests/write.py index 1313058..04be171 100644 --- a/cachalot/tests/write.py +++ b/cachalot/tests/write.py @@ -373,6 +373,68 @@ class WriteTestCase(TransactionTestCase): ) self.assertListEqual(data10, []) + def test_invalidate_nested_subqueries(self): + with self.assertNumQueries(1): + data1 = list( + User.objects.filter( + pk__in=User.objects.filter( + user_permissions__in=Permission.objects.all() + ) + ) + ) + self.assertListEqual(data1, []) + + u = User.objects.create_user('test') + + with self.assertNumQueries(1): + data2 = list( + User.objects.filter( + pk__in=User.objects.filter( + user_permissions__in=Permission.objects.all() + ) + ) + ) + self.assertListEqual(data2, []) + + p = Permission.objects.first() + u.user_permissions.add(p) + + with self.assertNumQueries(1): + data3 = list( + User.objects.filter( + pk__in=User.objects.filter( + user_permissions__in=Permission.objects.all() + ) + ) + ) + self.assertListEqual(data3, [u]) + + with self.assertNumQueries(1): + data4 = list( + User.objects.filter( + pk__in=User.objects.filter( + pk__in=User.objects.filter( + user_permissions__in=Permission.objects.all() + ) + ) + ) + ) + self.assertListEqual(data4, [u]) + + u.user_permissions.remove(p) + + with self.assertNumQueries(1): + data5 = list( + User.objects.filter( + pk__in=User.objects.filter( + pk__in=User.objects.filter( + user_permissions__in=Permission.objects.all() + ) + ) + ) + ) + self.assertListEqual(data5, []) + def test_invalidate_select_related(self): with self.assertNumQueries(1): data1 = list(Test.objects.select_related('owner')) @@ -575,6 +637,16 @@ class WriteTestCase(TransactionTestCase): .filter(n__gte=1)) self.assertListEqual(data3, [u]) + with self.assertNumQueries(1): + self.assertEqual(User.objects.annotate(n=Count('user_permissions')) + .filter(n__gte=1).count(), 1) + + u.user_permissions.clear() + + with self.assertNumQueries(1): + self.assertEqual(User.objects.annotate(n=Count('user_permissions')) + .filter(n__gte=1).count(), 0) + def test_invalidate_extra_where(self): sql_condition = ("owner_id IN " "(SELECT id FROM auth_user WHERE username = 'admin')")