import pathlib from django.core.checks import Warning from django.core.checks.caches import ( E001, check_cache_location_not_exposed, check_default_cache_is_configured, check_file_based_cache_is_absolute, ) from django.test import SimpleTestCase from django.test.utils import override_settings class CheckCacheSettingsAppDirsTest(SimpleTestCase): VALID_CACHES_CONFIGURATION = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, } INVALID_CACHES_CONFIGURATION = { 'other': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, } @override_settings(CACHES=VALID_CACHES_CONFIGURATION) def test_default_cache_included(self): """ Don't error if 'default' is present in CACHES setting. """ self.assertEqual(check_default_cache_is_configured(None), []) @override_settings(CACHES=INVALID_CACHES_CONFIGURATION) def test_default_cache_not_included(self): """ Error if 'default' not present in CACHES setting. """ self.assertEqual(check_default_cache_is_configured(None), [E001]) class CheckCacheLocationTest(SimpleTestCase): warning_message = ( "Your 'default' cache configuration might expose your cache or lead " "to corruption of your data because its LOCATION %s %s." ) @staticmethod def get_settings(setting, cache_path, setting_path): return { 'CACHES': { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': cache_path, }, }, setting: [setting_path] if setting == 'STATICFILES_DIRS' else setting_path, } def test_cache_path_matches_media_static_setting(self): root = pathlib.Path.cwd() for setting in ('MEDIA_ROOT', 'STATIC_ROOT', 'STATICFILES_DIRS'): settings = self.get_settings(setting, root, root) with self.subTest(setting=setting), self.settings(**settings): msg = self.warning_message % ('matches', setting) self.assertEqual(check_cache_location_not_exposed(None), [ Warning(msg, id='caches.W002'), ]) def test_cache_path_inside_media_static_setting(self): root = pathlib.Path.cwd() for setting in ('MEDIA_ROOT', 'STATIC_ROOT', 'STATICFILES_DIRS'): settings = self.get_settings(setting, root / 'cache', root) with self.subTest(setting=setting), self.settings(**settings): msg = self.warning_message % ('is inside', setting) self.assertEqual(check_cache_location_not_exposed(None), [ Warning(msg, id='caches.W002'), ]) def test_cache_path_contains_media_static_setting(self): root = pathlib.Path.cwd() for setting in ('MEDIA_ROOT', 'STATIC_ROOT', 'STATICFILES_DIRS'): settings = self.get_settings(setting, root, root / 'other') with self.subTest(setting=setting), self.settings(**settings): msg = self.warning_message % ('contains', setting) self.assertEqual(check_cache_location_not_exposed(None), [ Warning(msg, id='caches.W002'), ]) def test_cache_path_not_conflict(self): root = pathlib.Path.cwd() for setting in ('MEDIA_ROOT', 'STATIC_ROOT', 'STATICFILES_DIRS'): settings = self.get_settings(setting, root / 'cache', root / 'other') with self.subTest(setting=setting), self.settings(**settings): self.assertEqual(check_cache_location_not_exposed(None), []) class CheckCacheAbsolutePath(SimpleTestCase): def test_absolute_path(self): with self.settings(CACHES={ 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': pathlib.Path.cwd() / 'cache', }, }): self.assertEqual(check_file_based_cache_is_absolute(None), []) def test_relative_path(self): with self.settings(CACHES={ 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': 'cache', }, }): self.assertEqual(check_file_based_cache_is_absolute(None), [ Warning( "Your 'default' cache LOCATION path is relative. Use an " "absolute path instead.", id='caches.W003', ), ])