diff --git a/cachalot/tests/read.py b/cachalot/tests/read.py index 51e556a..7b3f893 100644 --- a/cachalot/tests/read.py +++ b/cachalot/tests/read.py @@ -295,6 +295,14 @@ class ReadTestCase(TransactionTestCase): self.assertListEqual(data2, [datetime.datetime(1789, 7, 14, 16), datetime.datetime(1944, 6, 6, 6)]) + def test_foreign_key(self): + with self.assertNumQueries(3): + data1 = [t.owner for t in Test.objects.all()] + with self.assertNumQueries(0): + data2 = [t.owner for t in Test.objects.all()] + self.assertListEqual(data2, data1) + self.assertListEqual(data2, [self.user, self.admin]) + def test_subquery(self): with self.assertNumQueries(1): data1 = list(Test.objects.filter(owner__in=User.objects.all())) diff --git a/cachalot/tests/write.py b/cachalot/tests/write.py index 1415ae5..344bc3c 100644 --- a/cachalot/tests/write.py +++ b/cachalot/tests/write.py @@ -234,6 +234,57 @@ class WriteTestCase(TransactionTestCase): self.assertEqual(len(data3), 1) self.assertDictEqual(data3[0], {'name': 'test2', 'public': True}) + def test_invalidate_foreign_key(self): + with self.assertNumQueries(1): + data1 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data1, []) + + u1 = User.objects.create_user('user1') + Test.objects.bulk_create([Test(name='test1', owner=u1), + Test(name='test2')]) + + with self.assertNumQueries(2): + data2 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data2, ['user1']) + + Test.objects.create(name='test3') + + with self.assertNumQueries(1): + data3 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data3, ['user1']) + + t2 = Test.objects.get(name='test2') + t2.owner = u1 + t2.save() + + with self.assertNumQueries(1): + data4 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data4, ['user1', 'user1']) + + u2 = User.objects.create_user('user2') + Test.objects.filter(name='test3').update(owner=u2) + + with self.assertNumQueries(3): + data5 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data5, ['user1', 'user1', 'user2']) + + User.objects.filter(username='user2').update(username='user3') + + with self.assertNumQueries(2): + data6 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data6, ['user1', 'user1', 'user3']) + + u2 = User.objects.create_user('user2') + Test.objects.filter(name='test2').update(owner=u2) + + with self.assertNumQueries(4): + data7 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data7, ['user1', 'user2', 'user3']) + + with self.assertNumQueries(0): + data8 = [t.owner.username for t in Test.objects.all() if t.owner] + self.assertListEqual(data8, ['user1', 'user2', 'user3']) + def test_invalidate_aggregate(self): with self.assertNumQueries(1): self.assertEqual(User.objects.aggregate(n=Count('test'))['n'], 0)