Decorator for overriding settings while testing
Usage: ``` from tests.utils import set_settings @set_settings(FOO='bar') def test_something(): ... ```remotes/origin/enhancement/email-actions
parent
0e414267db
commit
24e9d92af1
|
@ -14,7 +14,9 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
import functools
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.db.models import signals
|
from django.db.models import signals
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,3 +36,53 @@ def signals_switch():
|
||||||
|
|
||||||
|
|
||||||
disconnect_signals, reconnect_signals = signals_switch()
|
disconnect_signals, reconnect_signals = signals_switch()
|
||||||
|
|
||||||
|
|
||||||
|
def set_settings(**new_settings):
|
||||||
|
"""Decorator for set django settings that will be only available during the
|
||||||
|
wrapped-function execution.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
@set_settings(FOO='bar')
|
||||||
|
def myfunc():
|
||||||
|
...
|
||||||
|
|
||||||
|
@set_settings(FOO='bar')
|
||||||
|
class TestCase:
|
||||||
|
...
|
||||||
|
"""
|
||||||
|
def decorator(testcase):
|
||||||
|
if type(testcase) is type:
|
||||||
|
namespace = {"OVERRIDE_SETTINGS": new_settings, "ORIGINAL_SETTINGS": {}}
|
||||||
|
wrapper = type(testcase.__name__, (SettingsTestCase, testcase), namespace)
|
||||||
|
else:
|
||||||
|
@functools.wraps(testcase)
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
old_settings = override_settings(new_settings)
|
||||||
|
try:
|
||||||
|
testcase(*args, **kwargs)
|
||||||
|
finally:
|
||||||
|
override_settings(old_settings)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
def override_settings(new_settings):
|
||||||
|
old_settings = {}
|
||||||
|
for name, new_value in new_settings.items():
|
||||||
|
old_settings[name] = getattr(settings, name, None)
|
||||||
|
setattr(settings, name, new_value)
|
||||||
|
return old_settings
|
||||||
|
|
||||||
|
|
||||||
|
class SettingsTestCase(object):
|
||||||
|
@classmethod
|
||||||
|
def setup_class(cls):
|
||||||
|
cls.ORIGINAL_SETTINGS = override_settings(cls.OVERRIDE_SETTINGS)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def teardown_class(cls):
|
||||||
|
override_settings(cls.ORIGINAL_SETTINGS)
|
||||||
|
cls.OVERRIDE_SETTINGS.clear()
|
||||||
|
|
Loading…
Reference in New Issue