Commit 9f7cefd5 authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #18417 -- Raised exception when unittest.TestCase is decorated with override_settings

parent f3a0ecc9
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -188,7 +188,11 @@ class override_settings(object):

    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

+15 −9
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ from django.core.exceptions import ImproperlyConfigured
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')
@@ -67,11 +68,6 @@ class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper):
            self.fail()


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


class SettingsTests(TestCase):
    def setUp(self):
        self.testvalue = None
@@ -122,10 +118,20 @@ class SettingsTests(TestCase):
        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')