diff --git a/analytical/tests/test_tag_chartbeat.py b/analytical/tests/test_tag_chartbeat.py index 0a503e7..fc7c245 100644 --- a/analytical/tests/test_tag_chartbeat.py +++ b/analytical/tests/test_tag_chartbeat.py @@ -11,9 +11,15 @@ from django.template import Context from analytical.templatetags.chartbeat import ChartbeatTopNode, \ ChartbeatBottomNode -from analytical.tests.utils import TagTestCase +from analytical.tests.utils import TagTestCase, override_settings from analytical.utils import AnalyticalException +@override_settings(INSTALLED_APPS=[ + a for a in settings.INSTALLED_APPS if a != 'django.contrib.sites']) +class ChartbeatTagTestCaseNoSites(TagTestCase): + def test_rendering_setup_no_site(self): + r = ChartbeatBottomNode().render(Context()) + self.assertTrue('var _sf_async_config={"uid": "12345"};' in r, r) class ChartbeatTagTestCase(TagTestCase): """ @@ -58,13 +64,6 @@ class ChartbeatTagTestCase(TagTestCase): self.settings_manager.set(CHARTBEAT_USER_ID='123abc') self.assertRaises(AnalyticalException, ChartbeatBottomNode) - def test_rendering_setup_no_site(self): - installed_apps = [a for a in settings.INSTALLED_APPS - if a != 'django.contrib.sites'] - self.settings_manager.set(INSTALLED_APPS=installed_apps) - r = ChartbeatBottomNode().render(Context()) - self.assertTrue('var _sf_async_config={"uid": "12345"};' in r, r) - def test_rendering_setup_site(self): installed_apps = list(settings.INSTALLED_APPS) installed_apps.append('django.contrib.sites') diff --git a/analytical/tests/utils.py b/analytical/tests/utils.py index 0304145..ff2b09c 100644 --- a/analytical/tests/utils.py +++ b/analytical/tests/utils.py @@ -2,13 +2,49 @@ Testing utilities. """ -from django.conf import settings +from __future__ import with_statement +from django.conf import settings, UserSettingsHolder from django.core.management import call_command from django.db.models import loading from django.template import Template, Context, RequestContext from django.test.simple import run_tests as django_run_tests from django.test.testcases import TestCase as DjangoTestCase +from django.utils.functional import wraps +class override_settings(object): + """ + Acts as either a decorator, or a context manager. If it's a decorator it + takes a function and returns a wrapped function. If it's a contextmanager + it's used with the ``with`` statement. In either event entering/exiting + are called before and after, respectively, the function/block is executed. + + Via: http://djangosnippets.org/snippets/2437/ + """ + def __init__(self, **kwargs): + self.options = kwargs + self.wrapped = settings._wrapped + + def __enter__(self): + self.enable() + + def __exit__(self, exc_type, exc_value, traceback): + self.disable() + + def __call__(self, func): + @wraps(func) + def inner(*args, **kwargs): + with self: + return func(*args, **kwargs) + return inner + + def enable(self): + override = UserSettingsHolder(settings._wrapped) + for key, new_value in self.options.items(): + setattr(override, key, new_value) + settings._wrapped = override + + def disable(self): + settings._wrapped = self.wrapped def run_tests(labels=()): """