diff options
| author | Sławek Ehlert <slafs@op.pl> | 2018-06-19 23:10:55 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-07-30 15:59:37 -0400 |
| commit | c6238bf02b7ca5cf0f31f893a951f257dc557600 (patch) | |
| tree | c02d11f07f188a9dad211d469a159206dca9320e /django | |
| parent | cebbcaa1baa6eb7f9ec3e223abdc496a983ea482 (diff) | |
Fixed #29467 -- Made override_settings handle errors in setting_changed signal receivers.
Diffstat (limited to 'django')
| -rw-r--r-- | django/test/utils.py | 27 |
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: |
