diff --git a/cachalot/management/commands/invalidate_cachalot.py b/cachalot/management/commands/invalidate_cachalot.py index 4343d80..f4fbbea 100644 --- a/cachalot/management/commands/invalidate_cachalot.py +++ b/cachalot/management/commands/invalidate_cachalot.py @@ -21,7 +21,7 @@ class Command(BaseCommand): def handle(self, *args, **options): cache_alias = options['cache_alias'] db_alias = options['db_alias'] - verbosity = options['verbosity'] + verbosity = int(options['verbosity']) models = [] for arg in args: @@ -38,7 +38,7 @@ class Command(BaseCommand): db_str = '' if db_alias is None else "for database '%s'" % db_alias keys_str = 'keys for %s models' % len(models) if args else 'all keys' - if verbosity != '0': + if verbosity > 0: self.stdout.write(' '.join(filter(bool, ['Invalidating', keys_str, cache_str, db_str])) + '...') @@ -48,5 +48,5 @@ class Command(BaseCommand): cache_alias=cache_alias, db_alias=db_alias) else: invalidate_all(cache_alias=cache_alias, db_alias=db_alias) - if verbosity != '0': + if verbosity > 0: self.stdout.write('Cache keys successfully invalidated.') diff --git a/cachalot/tests/__init__.py b/cachalot/tests/__init__.py index 310b20d..96d9f28 100644 --- a/cachalot/tests/__init__.py +++ b/cachalot/tests/__init__.py @@ -4,4 +4,4 @@ from .transaction import AtomicTestCase from .thread_safety import ThreadSafetyTestCase from .multi_db import MultiDatabaseTestCase from .settings import SettingsTestCase -from .api import APITestCase +from .api import APITestCase, CommandTestCase diff --git a/cachalot/tests/api.py b/cachalot/tests/api.py index 50379de..2e98e0a 100644 --- a/cachalot/tests/api.py +++ b/cachalot/tests/api.py @@ -1,8 +1,16 @@ # coding: utf-8 from __future__ import unicode_literals +try: + from unittest import skipIf +except ImportError: # For Python 2.6 + from unittest2 import skipIf -from django.db import connection, transaction +from django.conf import settings +from django.contrib.auth.models import User +from django.core.cache import DEFAULT_CACHE_ALIAS +from django.core.management import call_command +from django.db import connection, transaction, DEFAULT_DB_ALIAS from django.test import TransactionTestCase from ..api import * @@ -82,3 +90,88 @@ class APITestCase(TransactionTestCase): with self.assertNumQueries(1): Test.objects.get() + + +class CommandTestCase(TransactionTestCase): + multi_db = True + + def setUp(self): + self.db_alias2 = (alias for alias in settings.DATABASES + if alias != DEFAULT_DB_ALIAS).next() + + self.cache_alias2 = (alias for alias in settings.CACHES + if alias != DEFAULT_CACHE_ALIAS).next() + + self.t1 = Test.objects.create(name='test1') + self.t2 = Test.objects.using(self.db_alias2).create(name='test2') + self.u = User.objects.create_user('test') + + def test_invalidate_cachalot(self): + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + call_command('invalidate_cachalot', verbosity=0) + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + call_command('invalidate_cachalot', 'auth', verbosity=0) + with self.assertNumQueries(0): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + call_command('invalidate_cachalot', 'cachalot', verbosity=0) + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + call_command('invalidate_cachalot', 'cachalot.testchild', verbosity=0) + with self.assertNumQueries(0): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + call_command('invalidate_cachalot', 'cachalot.test', verbosity=0) + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + with self.assertNumQueries(1): + self.assertListEqual(list(User.objects.all()), [self.u]) + call_command('invalidate_cachalot', 'cachalot.test', 'auth.user', + verbosity=0) + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + with self.assertNumQueries(1): + self.assertListEqual(list(User.objects.all()), [self.u]) + + @skipIf(len(settings.DATABASES) == 1, + 'We can’t change the DB used since there’s only one configured') + def test_invalidate_cachalot_multi_db(self): + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + call_command('invalidate_cachalot', verbosity=0, + db_alias=self.db_alias2) + with self.assertNumQueries(0): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + with self.assertNumQueries(1, using=self.db_alias2): + self.assertListEqual(list(Test.objects.using(self.db_alias2)), + [self.t2]) + call_command('invalidate_cachalot', verbosity=0, + db_alias=self.db_alias2) + with self.assertNumQueries(1, using=self.db_alias2): + self.assertListEqual(list(Test.objects.using(self.db_alias2)), + [self.t2]) + + @skipIf(len(settings.CACHES) == 1, + 'We can’t change the cache used since there’s only one configured') + def test_invalidate_cachalot_multi_cache(self): + with self.assertNumQueries(1): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + call_command('invalidate_cachalot', verbosity=0, + cache_alias=self.cache_alias2) + with self.assertNumQueries(0): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + + with self.assertNumQueries(1): + with self.settings(CACHALOT_CACHE=self.cache_alias2): + self.assertListEqual(list(Test.objects.all()), [self.t1]) + call_command('invalidate_cachalot', verbosity=0, + cache_alias=self.cache_alias2) + with self.assertNumQueries(1): + with self.settings(CACHALOT_CACHE=self.cache_alias2): + self.assertListEqual(list(Test.objects.all()), [self.t1]) diff --git a/cachalot/tests/multi_db.py b/cachalot/tests/multi_db.py index f0473cb..b00ab76 100644 --- a/cachalot/tests/multi_db.py +++ b/cachalot/tests/multi_db.py @@ -21,8 +21,8 @@ class MultiDatabaseTestCase(TransactionTestCase): def setUp(self): self.t1 = Test.objects.create(name='test1') self.t2 = Test.objects.create(name='test2') - self.db_alias2 = [alias for alias in settings.DATABASES - if alias != DEFAULT_DB_ALIAS][0] + self.db_alias2 = (alias for alias in settings.DATABASES + if alias != DEFAULT_DB_ALIAS).next() self.is_sqlite2 = connections[self.db_alias2].vendor == 'sqlite' def test_read(self): diff --git a/cachalot/tests/settings.py b/cachalot/tests/settings.py index 13c798a..9a3f31f 100644 --- a/cachalot/tests/settings.py +++ b/cachalot/tests/settings.py @@ -69,8 +69,8 @@ class SettingsTestCase(TransactionTestCase): with self.assertNumQueries(0): list(Test.objects.all()) - other_cache_alias = [alias for alias in settings.CACHES - if alias != DEFAULT_CACHE_ALIAS][0] + other_cache_alias = (alias for alias in settings.CACHES + if alias != DEFAULT_CACHE_ALIAS).next() with self.settings(CACHALOT_CACHE=other_cache_alias): with self.assertNumQueries(1):