2011-06-12 04:40:02 +08:00
|
|
|
import os
|
2011-10-14 05:34:56 +08:00
|
|
|
|
2011-05-13 20:15:52 +08:00
|
|
|
from django.conf import settings, global_settings
|
2012-03-31 21:01:59 +08:00
|
|
|
from django.core.exceptions import ImproperlyConfigured
|
2011-12-17 06:06:06 +08:00
|
|
|
from django.http import HttpRequest
|
2011-08-11 06:26:34 +08:00
|
|
|
from django.test import TransactionTestCase, TestCase, signals
|
2011-05-18 20:08:53 +08:00
|
|
|
from django.test.utils import override_settings
|
|
|
|
|
|
|
|
|
2012-03-30 17:08:29 +08:00
|
|
|
@override_settings(TEST='override')
|
2011-08-11 06:26:34 +08:00
|
|
|
class FullyDecoratedTranTestCase(TransactionTestCase):
|
|
|
|
|
|
|
|
def test_override(self):
|
|
|
|
self.assertEqual(settings.TEST, 'override')
|
|
|
|
|
|
|
|
@override_settings(TEST='override2')
|
|
|
|
def test_method_override(self):
|
|
|
|
self.assertEqual(settings.TEST, 'override2')
|
|
|
|
|
2011-08-23 08:32:35 +08:00
|
|
|
def test_decorated_testcase_name(self):
|
|
|
|
self.assertEquals(FullyDecoratedTranTestCase.__name__, 'FullyDecoratedTranTestCase')
|
|
|
|
|
2011-09-05 06:51:53 +08:00
|
|
|
def test_decorated_testcase_module(self):
|
|
|
|
self.assertEquals(FullyDecoratedTranTestCase.__module__, __name__)
|
|
|
|
|
2011-08-11 06:26:34 +08:00
|
|
|
|
2012-03-30 17:08:29 +08:00
|
|
|
@override_settings(TEST='override')
|
2011-06-12 04:40:02 +08:00
|
|
|
class FullyDecoratedTestCase(TestCase):
|
|
|
|
|
|
|
|
def test_override(self):
|
|
|
|
self.assertEqual(settings.TEST, 'override')
|
|
|
|
|
|
|
|
@override_settings(TEST='override2')
|
|
|
|
def test_method_override(self):
|
|
|
|
self.assertEqual(settings.TEST, 'override2')
|
|
|
|
|
2011-10-08 16:16:17 +08:00
|
|
|
|
|
|
|
class ClassDecoratedTestCaseSuper(TestCase):
|
|
|
|
"""
|
|
|
|
Dummy class for testing max recursion error in child class call to
|
|
|
|
super(). Refs #17011.
|
|
|
|
|
|
|
|
"""
|
|
|
|
def test_max_recursion_error(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2012-03-30 17:08:29 +08:00
|
|
|
@override_settings(TEST='override')
|
2011-10-08 16:16:17 +08:00
|
|
|
class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper):
|
|
|
|
def test_override(self):
|
|
|
|
self.assertEqual(settings.TEST, 'override')
|
|
|
|
|
|
|
|
@override_settings(TEST='override2')
|
|
|
|
def test_method_override(self):
|
|
|
|
self.assertEqual(settings.TEST, 'override2')
|
|
|
|
|
|
|
|
def test_max_recursion_error(self):
|
|
|
|
"""
|
|
|
|
Overriding a method on a super class and then calling that method on
|
|
|
|
the super class should not trigger infinite recursion. See #17011.
|
|
|
|
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
super(ClassDecoratedTestCase, self).test_max_recursion_error()
|
2012-04-29 00:09:37 +08:00
|
|
|
except RuntimeError:
|
2011-10-08 16:16:17 +08:00
|
|
|
self.fail()
|
|
|
|
|
|
|
|
|
2011-05-18 20:08:53 +08:00
|
|
|
class SettingGetter(object):
|
|
|
|
def __init__(self):
|
|
|
|
self.test = getattr(settings, 'TEST', 'undefined')
|
|
|
|
|
|
|
|
testvalue = None
|
|
|
|
|
|
|
|
def signal_callback(sender, setting, value, **kwargs):
|
2011-07-11 03:35:05 +08:00
|
|
|
if setting == 'TEST':
|
|
|
|
global testvalue
|
|
|
|
testvalue = value
|
2011-05-18 20:08:53 +08:00
|
|
|
|
2011-07-11 03:35:05 +08:00
|
|
|
signals.setting_changed.connect(signal_callback)
|
2011-01-02 09:33:11 +08:00
|
|
|
|
2011-05-06 21:29:24 +08:00
|
|
|
class SettingsTests(TestCase):
|
2009-12-13 01:51:51 +08:00
|
|
|
|
2011-05-06 21:29:24 +08:00
|
|
|
def test_override(self):
|
|
|
|
settings.TEST = 'test'
|
|
|
|
self.assertEqual('test', settings.TEST)
|
|
|
|
with self.settings(TEST='override'):
|
|
|
|
self.assertEqual('override', settings.TEST)
|
|
|
|
self.assertEqual('test', settings.TEST)
|
|
|
|
del settings.TEST
|
|
|
|
|
|
|
|
def test_override_change(self):
|
|
|
|
settings.TEST = 'test'
|
|
|
|
self.assertEqual('test', settings.TEST)
|
|
|
|
with self.settings(TEST='override'):
|
|
|
|
self.assertEqual('override', settings.TEST)
|
|
|
|
settings.TEST = 'test2'
|
|
|
|
self.assertEqual('test', settings.TEST)
|
|
|
|
del settings.TEST
|
|
|
|
|
|
|
|
def test_override_doesnt_leak(self):
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
with self.settings(TEST='override'):
|
|
|
|
self.assertEqual('override', settings.TEST)
|
|
|
|
settings.TEST = 'test'
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
2009-12-13 01:51:51 +08:00
|
|
|
|
2011-05-18 20:08:53 +08:00
|
|
|
@override_settings(TEST='override')
|
|
|
|
def test_decorator(self):
|
|
|
|
self.assertEqual('override', settings.TEST)
|
|
|
|
|
|
|
|
def test_context_manager(self):
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
override = override_settings(TEST='override')
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
override.enable()
|
|
|
|
self.assertEqual('override', settings.TEST)
|
|
|
|
override.disable()
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
|
|
|
|
def test_class_decorator(self):
|
|
|
|
self.assertEqual(SettingGetter().test, 'undefined')
|
|
|
|
DecoratedSettingGetter = override_settings(TEST='override')(SettingGetter)
|
|
|
|
self.assertEqual(DecoratedSettingGetter().test, 'override')
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
|
|
|
|
def test_signal_callback_context_manager(self):
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
with self.settings(TEST='override'):
|
|
|
|
self.assertEqual(testvalue, 'override')
|
2012-03-14 07:02:31 +08:00
|
|
|
self.assertEqual(testvalue, None)
|
2011-05-18 20:08:53 +08:00
|
|
|
|
|
|
|
@override_settings(TEST='override')
|
|
|
|
def test_signal_callback_decorator(self):
|
|
|
|
self.assertEqual(testvalue, 'override')
|
|
|
|
|
2009-12-13 01:51:51 +08:00
|
|
|
#
|
|
|
|
# Regression tests for #10130: deleting settings.
|
|
|
|
#
|
|
|
|
|
|
|
|
def test_settings_delete(self):
|
|
|
|
settings.TEST = 'test'
|
|
|
|
self.assertEqual('test', settings.TEST)
|
|
|
|
del settings.TEST
|
|
|
|
self.assertRaises(AttributeError, getattr, settings, 'TEST')
|
|
|
|
|
|
|
|
def test_settings_delete_wrapped(self):
|
|
|
|
self.assertRaises(TypeError, delattr, settings, '_wrapped')
|
2011-01-02 09:33:11 +08:00
|
|
|
|
2012-02-22 08:42:19 +08:00
|
|
|
def test_allowed_include_roots_string(self):
|
|
|
|
"""
|
|
|
|
ALLOWED_INCLUDE_ROOTS is not allowed to be incorrectly set to a string
|
|
|
|
rather than a tuple.
|
|
|
|
"""
|
|
|
|
self.assertRaises(ValueError, setattr, settings,
|
|
|
|
'ALLOWED_INCLUDE_ROOTS', '/var/www/ssi/')
|
2011-01-02 09:33:11 +08:00
|
|
|
|
2011-05-06 21:29:24 +08:00
|
|
|
|
|
|
|
class TrailingSlashURLTests(TestCase):
|
2012-03-31 21:11:02 +08:00
|
|
|
"""
|
|
|
|
Tests for the MEDIA_URL and STATIC_URL settings.
|
|
|
|
|
|
|
|
They must end with a slash to ensure there's a deterministic way to build
|
|
|
|
paths in templates.
|
|
|
|
"""
|
2011-01-02 09:33:11 +08:00
|
|
|
settings_module = settings
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self._original_media_url = self.settings_module.MEDIA_URL
|
2012-03-31 21:11:02 +08:00
|
|
|
self._original_static_url = self.settings_module.STATIC_URL
|
2011-01-02 09:33:11 +08:00
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
self.settings_module.MEDIA_URL = self._original_media_url
|
2012-03-31 21:11:02 +08:00
|
|
|
self.settings_module.STATIC_URL = self._original_static_url
|
2011-01-02 09:33:11 +08:00
|
|
|
|
|
|
|
def test_blank(self):
|
|
|
|
"""
|
2012-03-31 21:11:02 +08:00
|
|
|
The empty string is accepted, even though it doesn't end in a slash.
|
2011-01-02 09:33:11 +08:00
|
|
|
"""
|
|
|
|
self.settings_module.MEDIA_URL = ''
|
|
|
|
self.assertEqual('', self.settings_module.MEDIA_URL)
|
|
|
|
|
2012-03-31 21:11:02 +08:00
|
|
|
self.settings_module.STATIC_URL = ''
|
|
|
|
self.assertEqual('', self.settings_module.STATIC_URL)
|
|
|
|
|
2011-01-02 09:33:11 +08:00
|
|
|
def test_end_slash(self):
|
|
|
|
"""
|
2012-03-31 21:11:02 +08:00
|
|
|
It works if the value ends in a slash.
|
2011-01-02 09:33:11 +08:00
|
|
|
"""
|
|
|
|
self.settings_module.MEDIA_URL = '/foo/'
|
|
|
|
self.assertEqual('/foo/', self.settings_module.MEDIA_URL)
|
|
|
|
|
|
|
|
self.settings_module.MEDIA_URL = 'http://media.foo.com/'
|
|
|
|
self.assertEqual('http://media.foo.com/',
|
|
|
|
self.settings_module.MEDIA_URL)
|
|
|
|
|
2012-03-31 21:11:02 +08:00
|
|
|
self.settings_module.STATIC_URL = '/foo/'
|
|
|
|
self.assertEqual('/foo/', self.settings_module.STATIC_URL)
|
|
|
|
|
|
|
|
self.settings_module.STATIC_URL = 'http://static.foo.com/'
|
|
|
|
self.assertEqual('http://static.foo.com/',
|
|
|
|
self.settings_module.STATIC_URL)
|
|
|
|
|
2011-01-02 09:33:11 +08:00
|
|
|
def test_no_end_slash(self):
|
|
|
|
"""
|
2012-03-31 21:11:02 +08:00
|
|
|
An ImproperlyConfigured exception is raised if the value doesn't end
|
|
|
|
in a slash.
|
2011-01-02 09:33:11 +08:00
|
|
|
"""
|
2012-03-31 21:11:02 +08:00
|
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
|
|
self.settings_module.MEDIA_URL = '/foo'
|
2011-01-02 09:33:11 +08:00
|
|
|
|
2012-03-31 21:11:02 +08:00
|
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
|
|
self.settings_module.MEDIA_URL = 'http://media.foo.com'
|
2011-01-02 09:33:11 +08:00
|
|
|
|
2012-03-31 21:11:02 +08:00
|
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
|
|
self.settings_module.STATIC_URL = '/foo'
|
2012-03-31 21:01:59 +08:00
|
|
|
|
2012-03-31 21:11:02 +08:00
|
|
|
with self.assertRaises(ImproperlyConfigured):
|
|
|
|
self.settings_module.STATIC_URL = 'http://static.foo.com'
|
2012-03-31 21:01:59 +08:00
|
|
|
|
2011-01-02 09:33:11 +08:00
|
|
|
def test_double_slash(self):
|
|
|
|
"""
|
2012-03-31 21:11:02 +08:00
|
|
|
If the value ends in more than one slash, presume they know what
|
2011-01-02 09:33:11 +08:00
|
|
|
they're doing.
|
|
|
|
"""
|
|
|
|
self.settings_module.MEDIA_URL = '/stupid//'
|
|
|
|
self.assertEqual('/stupid//', self.settings_module.MEDIA_URL)
|
|
|
|
|
|
|
|
self.settings_module.MEDIA_URL = 'http://media.foo.com/stupid//'
|
|
|
|
self.assertEqual('http://media.foo.com/stupid//',
|
|
|
|
self.settings_module.MEDIA_URL)
|
2011-05-13 20:15:52 +08:00
|
|
|
|
2012-03-31 21:11:02 +08:00
|
|
|
self.settings_module.STATIC_URL = '/stupid//'
|
|
|
|
self.assertEqual('/stupid//', self.settings_module.STATIC_URL)
|
|
|
|
|
|
|
|
self.settings_module.STATIC_URL = 'http://static.foo.com/stupid//'
|
|
|
|
self.assertEqual('http://static.foo.com/stupid//',
|
|
|
|
self.settings_module.STATIC_URL)
|
|
|
|
|
|
|
|
|
2011-12-17 06:06:06 +08:00
|
|
|
class SecureProxySslHeaderTest(TestCase):
|
|
|
|
settings_module = settings
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self._original_setting = self.settings_module.SECURE_PROXY_SSL_HEADER
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
self.settings_module.SECURE_PROXY_SSL_HEADER = self._original_setting
|
|
|
|
|
|
|
|
def test_none(self):
|
|
|
|
self.settings_module.SECURE_PROXY_SSL_HEADER = None
|
|
|
|
req = HttpRequest()
|
|
|
|
self.assertEqual(req.is_secure(), False)
|
|
|
|
|
|
|
|
def test_set_without_xheader(self):
|
|
|
|
self.settings_module.SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
|
|
|
|
req = HttpRequest()
|
|
|
|
self.assertEqual(req.is_secure(), False)
|
|
|
|
|
|
|
|
def test_set_with_xheader_wrong(self):
|
|
|
|
self.settings_module.SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
|
|
|
|
req = HttpRequest()
|
|
|
|
req.META['HTTP_X_FORWARDED_PROTOCOL'] = 'wrongvalue'
|
|
|
|
self.assertEqual(req.is_secure(), False)
|
|
|
|
|
|
|
|
def test_set_with_xheader_right(self):
|
|
|
|
self.settings_module.SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
|
|
|
|
req = HttpRequest()
|
|
|
|
req.META['HTTP_X_FORWARDED_PROTOCOL'] = 'https'
|
|
|
|
self.assertEqual(req.is_secure(), True)
|
2011-05-13 20:15:52 +08:00
|
|
|
|
|
|
|
class EnvironmentVariableTest(TestCase):
|
|
|
|
"""
|
|
|
|
Ensures proper settings file is used in setup_environ if
|
|
|
|
DJANGO_SETTINGS_MODULE is set in the environment.
|
|
|
|
"""
|
|
|
|
def setUp(self):
|
|
|
|
self.original_value = os.environ.get('DJANGO_SETTINGS_MODULE')
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
if self.original_value:
|
|
|
|
os.environ['DJANGO_SETTINGS_MODULE'] = self.original_value
|
|
|
|
elif 'DJANGO_SETTINGS_MODULE' in os.environ:
|
|
|
|
del(os.environ['DJANGO_SETTINGS_MODULE'])
|
|
|
|
|
|
|
|
def test_env_var_used(self):
|
|
|
|
"""
|
|
|
|
If the environment variable is set, do not ignore it. However, the
|
|
|
|
kwarg original_settings_path takes precedence.
|
|
|
|
|
|
|
|
This tests both plus the default (neither set).
|
|
|
|
"""
|
|
|
|
from django.core.management import setup_environ
|
|
|
|
|
|
|
|
# whatever was already there
|
|
|
|
original_module = os.environ.get(
|
|
|
|
'DJANGO_SETTINGS_MODULE',
|
|
|
|
'the default'
|
|
|
|
)
|
|
|
|
|
|
|
|
# environment variable set by user
|
|
|
|
user_override = 'custom.settings'
|
|
|
|
|
|
|
|
# optional argument to setup_environ
|
|
|
|
orig_path = 'original.path'
|
|
|
|
|
|
|
|
# expect default
|
|
|
|
setup_environ(global_settings)
|
2011-06-14 18:35:13 +08:00
|
|
|
self.assertEqual(
|
2011-05-13 20:15:52 +08:00
|
|
|
os.environ.get('DJANGO_SETTINGS_MODULE'),
|
|
|
|
original_module
|
|
|
|
)
|
|
|
|
|
|
|
|
# override with environment variable
|
|
|
|
os.environ['DJANGO_SETTINGS_MODULE'] = user_override
|
|
|
|
setup_environ(global_settings)
|
|
|
|
|
2011-06-14 18:35:13 +08:00
|
|
|
self.assertEqual(
|
2011-05-13 20:15:52 +08:00
|
|
|
os.environ.get('DJANGO_SETTINGS_MODULE'),
|
|
|
|
user_override
|
|
|
|
)
|
|
|
|
|
|
|
|
# pass in original_settings_path (should take precedence)
|
|
|
|
os.environ['DJANGO_SETTINGS_MODULE'] = user_override
|
|
|
|
setup_environ(global_settings, original_settings_path = orig_path)
|
|
|
|
|
2011-06-14 18:35:13 +08:00
|
|
|
self.assertEqual(
|
2011-05-13 20:15:52 +08:00
|
|
|
os.environ.get('DJANGO_SETTINGS_MODULE'),
|
|
|
|
orig_path
|
|
|
|
)
|