From 949076eb11011736f9e827adfde03c842bc1f1dd Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Mon, 14 Oct 2013 10:44:55 +0200 Subject: [PATCH] Fixed #21263 -- Fixed issue with override_settings in inherited classes When both parent and child classes are decorated with override_settings, child class settings should take precedence. Thanks Sephi for the report and Marc Tamlyn for the review. --- django/test/testcases.py | 6 ++++++ django/test/utils.py | 17 +++++------------ tests/settings_tests/tests.py | 10 ++++++++++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/django/test/testcases.py b/django/test/testcases.py index 3f0046314e..3ce96b09b9 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -157,6 +157,7 @@ class SimpleTestCase(unittest.TestCase): # The class we'll use for the test client self.client. # Can be overridden in derived classes. client_class = Client + _custom_settings = None def __call__(self, result=None): """ @@ -193,6 +194,9 @@ class SimpleTestCase(unittest.TestCase): * If the class has a 'urls' attribute, replace ROOT_URLCONF with it. * Clearing the mail test outbox. """ + if self._custom_settings: + self._overridden = override_settings(**self._custom_settings) + self._overridden.enable() self.client = self.client_class() self._urlconf_setup() mail.outbox = [] @@ -210,6 +214,8 @@ class SimpleTestCase(unittest.TestCase): * Putting back the original ROOT_URLCONF if it was changed. """ self._urlconf_teardown() + if self._custom_settings: + self._overridden.disable() def _urlconf_teardown(self): set_urlconf(None) diff --git a/django/test/utils.py b/django/test/utils.py index cd3e99d58b..ae045a5283 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -203,18 +203,11 @@ class override_settings(object): raise Exception( "Only subclasses of Django SimpleTestCase can be decorated " "with override_settings") - original_pre_setup = test_func._pre_setup - original_post_teardown = test_func._post_teardown - - def _pre_setup(innerself): - self.enable() - original_pre_setup(innerself) - - def _post_teardown(innerself): - original_post_teardown(innerself) - self.disable() - test_func._pre_setup = _pre_setup - test_func._post_teardown = _post_teardown + if test_func._custom_settings: + test_func._custom_settings = dict( + test_func._custom_settings, **self.options) + else: + test_func._custom_settings = self.options return test_func else: @wraps(test_func) diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py index a9503358a2..4a0c363c39 100644 --- a/tests/settings_tests/tests.py +++ b/tests/settings_tests/tests.py @@ -73,6 +73,16 @@ class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper): self.fail() +@override_settings(TEST='override-parent') +class ParentDecoratedTestCase(TestCase): + pass + +@override_settings(TEST='override-child') +class ChildDecoratedTestCase(ParentDecoratedTestCase): + def test_override_settings_inheritance(self): + self.assertEqual(settings.TEST, 'override-child') + + class SettingsTests(TestCase): def setUp(self): self.testvalue = None