From a76bb3a3a64618f83549aa63ee61106b901fdbca Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 28 Jun 2011 10:57:58 -0700 Subject: [PATCH 1/3] Drop django.contrib.sites from INSTALLED_APPS before the test even runs An attempt at resolving https://github.com/jcassee/django-analytical/issues/2 --- analytical/tests/test_tag_chartbeat.py | 15 +++++----- analytical/tests/utils.py | 38 +++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 9 deletions(-) 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=()): """ From 5d0e7226ad68bc21d3c3655f8dd187bd6ef144b9 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 28 Jun 2011 11:42:42 -0700 Subject: [PATCH 2/3] Use override_settings with Chartbeat's test_rendering_setup_site too --- analytical/tests/test_tag_chartbeat.py | 28 +++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/analytical/tests/test_tag_chartbeat.py b/analytical/tests/test_tag_chartbeat.py index fc7c245..337ca3f 100644 --- a/analytical/tests/test_tag_chartbeat.py +++ b/analytical/tests/test_tag_chartbeat.py @@ -21,6 +21,22 @@ class ChartbeatTagTestCaseNoSites(TagTestCase): r = ChartbeatBottomNode().render(Context()) self.assertTrue('var _sf_async_config={"uid": "12345"};' in r, r) +class ChartbeatTagTestCaseWithSites(TagTestCase): + def test_rendering_setup_site(self): + site = Site.objects.create(domain="test.com", name="test") + with override_settings(SITE_ID=site.id, CHARTBEAT_USER_ID="12345"): + r = ChartbeatBottomNode().render(Context()) + self.assertTrue(re.search( + 'var _sf_async_config={.*"uid": "12345".*};', r), r) + self.assertTrue(re.search( + 'var _sf_async_config={.*"domain": "test.com".*};', r), r) + +# Ensure django.contrib.sites is in INSTALLED_APPS +if "django.contrib.sites" not in settings.INSTALLED_APPS: + installed_apps = list(settings.INSTALLED_APPS) + installed_apps.append("django.contrib.sites") + ChartbeatTagTestCaseWithSites = override_settings(INSTALLED_APPS=installed_apps)(ChartbeatTagTestCaseWithSites) + class ChartbeatTagTestCase(TagTestCase): """ Tests for the ``chartbeat`` template tag. @@ -64,18 +80,6 @@ class ChartbeatTagTestCase(TagTestCase): self.settings_manager.set(CHARTBEAT_USER_ID='123abc') self.assertRaises(AnalyticalException, ChartbeatBottomNode) - def test_rendering_setup_site(self): - installed_apps = list(settings.INSTALLED_APPS) - installed_apps.append('django.contrib.sites') - self.settings_manager.set(INSTALLED_APPS=installed_apps) - site = Site.objects.create(domain="test.com", name="test") - self.settings_manager.set(SITE_ID=site.id) - r = ChartbeatBottomNode().render(Context()) - self.assertTrue(re.search( - 'var _sf_async_config={.*"uid": "12345".*};', r), r) - self.assertTrue(re.search( - 'var _sf_async_config={.*"domain": "test.com".*};', r), r) - def test_render_internal_ip(self): self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) req = HttpRequest() From 2efd00dfbe418563cfbc2dc768b10e49ecce91aa Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 28 Jun 2011 11:47:55 -0700 Subject: [PATCH 3/3] Update tests to reflect changes in 70ff4f6 --- analytical/tests/test_tag_clicky.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/analytical/tests/test_tag_clicky.py b/analytical/tests/test_tag_clicky.py index 646f495..905bbd4 100644 --- a/analytical/tests/test_tag_clicky.py +++ b/analytical/tests/test_tag_clicky.py @@ -24,13 +24,13 @@ class ClickyTagTestCase(TagTestCase): def test_tag(self): r = self.render_tag('clicky', 'clicky') - self.assertTrue('var clicky_site_id = 12345678;' in r, r) + self.assertTrue('clicky_site_ids.push(12345678);' in r, r) self.assertTrue('src="//in.getclicky.com/12345678ns.gif"' in r, r) def test_node(self): r = ClickyNode().render(Context({})) - self.assertTrue('var clicky_site_id = 12345678;' in r, r) + self.assertTrue('clicky_site_ids.push(12345678);' in r, r) self.assertTrue('src="//in.getclicky.com/12345678ns.gif"' in r, r)