2020-10-27 00:01:03 +08:00
|
|
|
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,
|
2020-11-08 22:57:51 +08:00
|
|
|
check_file_based_cache_is_absolute,
|
2020-10-27 00:01:03 +08:00
|
|
|
)
|
2015-09-02 20:20:46 +08:00
|
|
|
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.
|
|
|
|
"""
|
2020-03-22 03:14:02 +08:00
|
|
|
self.assertEqual(check_default_cache_is_configured(None), [])
|
2015-09-02 20:20:46 +08:00
|
|
|
|
|
|
|
@override_settings(CACHES=INVALID_CACHES_CONFIGURATION)
|
|
|
|
def test_default_cache_not_included(self):
|
|
|
|
"""
|
|
|
|
Error if 'default' not present in CACHES setting.
|
|
|
|
"""
|
2020-03-22 03:14:02 +08:00
|
|
|
self.assertEqual(check_default_cache_is_configured(None), [E001])
|
2020-10-27 00:01:03 +08:00
|
|
|
|
|
|
|
|
|
|
|
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), [])
|
2020-11-08 22:57:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
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',
|
|
|
|
),
|
|
|
|
])
|