summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSławek Ehlert <slafs@op.pl>2018-06-19 23:10:55 +0200
committerTim Graham <timograham@gmail.com>2018-07-30 15:59:37 -0400
commitc6238bf02b7ca5cf0f31f893a951f257dc557600 (patch)
treec02d11f07f188a9dad211d469a159206dca9320e /django
parentcebbcaa1baa6eb7f9ec3e223abdc496a983ea482 (diff)
Fixed #29467 -- Made override_settings handle errors in setting_changed signal receivers.
Diffstat (limited to 'django')
-rw-r--r--django/test/utils.py27
1 files changed, 23 insertions, 4 deletions
diff --git a/django/test/utils.py b/django/test/utils.py
index 0e04e54964..825c6b6d3b 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -382,6 +382,8 @@ class override_settings(TestContextDecorator):
with the ``with`` statement. In either event, entering/exiting are called
before and after, respectively, the function/block is executed.
"""
+ enable_exception = None
+
def __init__(self, **kwargs):
self.options = kwargs
super().__init__()
@@ -401,18 +403,35 @@ class override_settings(TestContextDecorator):
self.wrapped = settings._wrapped
settings._wrapped = override
for key, new_value in self.options.items():
- setting_changed.send(sender=settings._wrapped.__class__,
- setting=key, value=new_value, enter=True)
+ try:
+ setting_changed.send(
+ sender=settings._wrapped.__class__,
+ setting=key, value=new_value, enter=True,
+ )
+ except Exception as exc:
+ self.enable_exception = exc
+ self.disable()
def disable(self):
if 'INSTALLED_APPS' in self.options:
apps.unset_installed_apps()
settings._wrapped = self.wrapped
del self.wrapped
+ responses = []
for key in self.options:
new_value = getattr(settings, key, None)
- setting_changed.send(sender=settings._wrapped.__class__,
- setting=key, value=new_value, enter=False)
+ responses_for_setting = setting_changed.send_robust(
+ sender=settings._wrapped.__class__,
+ setting=key, value=new_value, enter=False,
+ )
+ responses.extend(responses_for_setting)
+ if self.enable_exception is not None:
+ exc = self.enable_exception
+ self.enable_exception = None
+ raise exc
+ for _, response in responses:
+ if isinstance(response, Exception):
+ raise response
def save_options(self, test_func):
if test_func._overridden_settings is None: