Skip to content

Commit

Permalink
[1.5.x] Fixed #18417 -- Raised exception when unittest.TestCase is de…
Browse files Browse the repository at this point in the history
…corated with override_settings

Backport of 9f7cefd from master.
  • Loading branch information
claudep committed Nov 25, 2012
1 parent 2e5b725 commit 4389b51
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 10 deletions.
6 changes: 5 additions & 1 deletion django/test/utils.py
Expand Up @@ -188,7 +188,11 @@ def __exit__(self, exc_type, exc_value, traceback):

def __call__(self, test_func):
from django.test import TransactionTestCase
if isinstance(test_func, type) and issubclass(test_func, TransactionTestCase):
if isinstance(test_func, type):
if not issubclass(test_func, TransactionTestCase):
raise Exception(
"Only subclasses of Django TransactionTestCase can be decorated "
"with override_settings")
original_pre_setup = test_func._pre_setup
original_post_teardown = test_func._post_teardown

Expand Down
24 changes: 15 additions & 9 deletions tests/regressiontests/settings_tests/tests.py
Expand Up @@ -6,6 +6,7 @@
from django.http import HttpRequest
from django.test import TransactionTestCase, TestCase, signals
from django.test.utils import override_settings
from django.utils import unittest, six


@override_settings(TEST='override')
Expand Down Expand Up @@ -67,11 +68,6 @@ def test_max_recursion_error(self):
self.fail()


class SettingGetter(object):
def __init__(self):
self.test = getattr(settings, 'TEST', 'undefined')


class SettingsTests(TestCase):
def setUp(self):
self.testvalue = None
Expand Down Expand Up @@ -122,10 +118,20 @@ def test_context_manager(self):
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')
# TransactionTestCase can be decorated by override_settings, but not ut.TestCase
class TransactionTestCaseSubclass(TransactionTestCase):
pass

class UnittestTestCaseSubclass(unittest.TestCase):
pass

decorated = override_settings(TEST='override')(TransactionTestCaseSubclass)
self.assertIsInstance(decorated, type)
self.assertTrue(issubclass(decorated, TransactionTestCase))

with six.assertRaisesRegex(self, Exception,
"Only subclasses of Django TransactionTestCase*"):
decorated = override_settings(TEST='override')(UnittestTestCaseSubclass)

def test_signal_callback_context_manager(self):
self.assertRaises(AttributeError, getattr, settings, 'TEST')
Expand Down

0 comments on commit 4389b51

Please sign in to comment.