Skip to content

Commit

Permalink
Test updates for override_settings decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
jcassee committed Jul 4, 2011
1 parent 60fc527 commit f0d4a41
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 93 deletions.
14 changes: 6 additions & 8 deletions analytical/tests/test_tag_chartbeat.py
Expand Up @@ -11,7 +11,8 @@

from analytical.templatetags.chartbeat import ChartbeatTopNode, \
ChartbeatBottomNode
from analytical.tests.utils import TagTestCase, with_apps, without_apps
from analytical.tests.utils import TagTestCase, with_apps, without_apps, \
override_settings, SETTING_DELETED
from analytical.utils import AnalyticalException


Expand All @@ -34,15 +35,12 @@ def test_rendering_setup_site(self):
'var _sf_async_config={.*"domain": "test.com".*};', r), r)


@override_settings(CHARTBEAT_USER_ID='12345')
class ChartbeatTagTestCase(TagTestCase):
"""
Tests for the ``chartbeat`` template tag.
"""

def setUp(self):
super(ChartbeatTagTestCase, self).setUp()
self.settings_manager.set(CHARTBEAT_USER_ID='12345')

def test_top_tag(self):
r = self.render_tag('chartbeat', 'chartbeat_top',
{'chartbeat_domain': "test.com"})
Expand All @@ -69,16 +67,16 @@ def test_bottom_node(self):
self.assertTrue(re.search(
'var _sf_async_config={.*"domain": "test.com".*};', r), r)

@override_settings(CHARTBEAT_USER_ID=SETTING_DELETED)
def test_no_user_id(self):
self.settings_manager.delete('CHARTBEAT_USER_ID')
self.assertRaises(AnalyticalException, ChartbeatBottomNode)

@override_settings(CHARTBEAT_USER_ID='123abc')
def test_wrong_user_id(self):
self.settings_manager.set(CHARTBEAT_USER_ID='123abc')
self.assertRaises(AnalyticalException, ChartbeatBottomNode)

@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip(self):
self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
Expand Down
16 changes: 7 additions & 9 deletions analytical/tests/test_tag_reinvigorate.py
Expand Up @@ -9,19 +9,17 @@
from django.template import Context

from analytical.templatetags.reinvigorate import ReinvigorateNode
from analytical.tests.utils import TagTestCase
from analytical.tests.utils import TagTestCase, override_settings, \
SETTING_DELETED
from analytical.utils import AnalyticalException


@override_settings(REINVIGORATE_TRACKING_ID='12345-abcdefghij')
class ReinvigorateTagTestCase(TagTestCase):
"""
Tests for the ``reinvigorate`` template tag.
"""

def setUp(self):
super(ReinvigorateTagTestCase, self).setUp()
self.settings_manager.set(REINVIGORATE_TRACKING_ID='12345-abcdefghij')

def test_tag(self):
r = self.render_tag('reinvigorate', 'reinvigorate')
self.assertTrue('reinvigorate.track("12345-abcdefghij");' in r, r)
Expand All @@ -30,16 +28,16 @@ def test_node(self):
r = ReinvigorateNode().render(Context({}))
self.assertTrue('reinvigorate.track("12345-abcdefghij");' in r, r)

@override_settings(REINVIGORATE_TRACKING_ID=SETTING_DELETED)
def test_no_tracking_id(self):
self.settings_manager.delete('REINVIGORATE_TRACKING_ID')
self.assertRaises(AnalyticalException, ReinvigorateNode)

@override_settings(REINVIGORATE_TRACKING_ID='123abc')
def test_wrong_tracking_id(self):
self.settings_manager.set(REINVIGORATE_TRACKING_ID='123abc')
self.assertRaises(AnalyticalException, ReinvigorateNode)

@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
def test_identify(self):
self.settings_manager.set(ANALYTICAL_AUTO_IDENTIFY=True)
r = ReinvigorateNode().render(Context({'user':
User(username='test', first_name='Test', last_name='User',
email='test@example.com')}))
Expand All @@ -52,8 +50,8 @@ def test_tags(self):
self.assertTrue(re.search('var re_var1_tag = "val1";', r), r)
self.assertTrue(re.search('var re_var2_tag = 2;', r), r)

@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip(self):
self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
Expand Down
21 changes: 11 additions & 10 deletions analytical/tests/test_tag_woopra.py
Expand Up @@ -7,18 +7,19 @@
from django.template import Context

from analytical.templatetags.woopra import WoopraNode
from analytical.tests.utils import TagTestCase
from analytical.tests.utils import TagTestCase, override_settings, \
SETTING_DELETED
from analytical.utils import AnalyticalException


@override_settings(WOOPRA_DOMAIN='example.com')
class WoopraTagTestCase(TagTestCase):
"""
Tests for the ``woopra`` template tag.
"""

def setUp(self):
super(WoopraTagTestCase, self).setUp()
self.settings_manager.set(WOOPRA_DOMAIN='example.com')

def test_tag(self):
r = self.render_tag('woopra', 'woopra')
Expand All @@ -28,16 +29,16 @@ def test_node(self):
r = WoopraNode().render(Context({}))
self.assertTrue('var woo_settings = {"domain": "example.com"};' in r, r)

@override_settings(WOOPRA_DOMAIN=SETTING_DELETED)
def test_no_domain(self):
self.settings_manager.delete('WOOPRA_DOMAIN')
self.assertRaises(AnalyticalException, WoopraNode)

@override_settings(WOOPRA_DOMAIN='this is not a domain')
def test_wrong_domain(self):
self.settings_manager.set(WOOPRA_DOMAIN='this is not a domain')
self.assertRaises(AnalyticalException, WoopraNode)

@override_settings(WOOPRA_IDLE_TIMEOUT=1234)
def test_idle_timeout(self):
self.settings_manager.set(WOOPRA_IDLE_TIMEOUT=1234)
r = WoopraNode().render(Context({}))
self.assertTrue('var woo_settings = {"domain": "example.com", '
'"idle_timeout": "1234"};' in r, r)
Expand All @@ -48,33 +49,33 @@ def test_custom(self):
self.assertTrue('var woo_visitor = {"var1": "val1", "var2": "val2"};'
in r, r)

@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
def test_identify_name_and_email(self):
self.settings_manager.set(ANALYTICAL_AUTO_IDENTIFY=True)
r = WoopraNode().render(Context({'user': User(username='test',
first_name='Firstname', last_name='Lastname',
email="test@example.com")}))
self.assertTrue('var woo_visitor = {"name": "Firstname Lastname", '
'"email": "test@example.com"};' in r, r)

@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
def test_identify_username_no_email(self):
self.settings_manager.set(ANALYTICAL_AUTO_IDENTIFY=True)
r = WoopraNode().render(Context({'user': User(username='test')}))
self.assertTrue('var woo_visitor = {"name": "test"};' in r, r)

@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
def test_no_identify_when_explicit_name(self):
self.settings_manager.set(ANALYTICAL_AUTO_IDENTIFY=True)
r = WoopraNode().render(Context({'woopra_name': 'explicit',
'user': User(username='implicit')}))
self.assertTrue('var woo_visitor = {"name": "explicit"};' in r, r)

@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
def test_no_identify_when_explicit_email(self):
self.settings_manager.set(ANALYTICAL_AUTO_IDENTIFY=True)
r = WoopraNode().render(Context({'woopra_email': 'explicit',
'user': User(username='implicit')}))
self.assertTrue('var woo_visitor = {"email": "explicit"};' in r, r)

@override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
def test_render_internal_ip(self):
self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
req = HttpRequest()
req.META['REMOTE_ADDR'] = '1.1.1.1'
context = Context({'request': req})
Expand Down
81 changes: 15 additions & 66 deletions analytical/tests/utils.py
Expand Up @@ -8,9 +8,18 @@
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.test.testcases import TestCase
from django.utils.functional import wraps


SETTING_DELETED = object()


class DeletedSettingDescriptor(object):
def __get__(self, instance, owner):
raise AttributeError("attribute not set")


class override_settings(object):
"""
Temporarily override Django settings.
Expand Down Expand Up @@ -42,7 +51,10 @@ def inner(*args, **kwargs):
def enable(self):
override = UserSettingsHolder(settings._wrapped)
for key, new_value in self.options.items():
setattr(override, key, new_value)
if new_value is SETTING_DELETED:
setattr(override, key, DeletedSettingDescriptor())
else:
setattr(override, key, new_value)
settings._wrapped = override

def disable(self):
Expand Down Expand Up @@ -75,25 +87,11 @@ def without_apps(*apps):
return override_settings(INSTALLED_APPS=apps_list)


class TestCase(DjangoTestCase):
"""
Base test case for the django-analytical tests.
Includes the settings manager.
"""

def setUp(self):
self.settings_manager = TestSettingsManager()

def tearDown(self):
self.settings_manager.revert()


class TagTestCase(TestCase):
"""
Tests for a template tag.
Includes the settings manager.
Adds support methods for testing template tags.
"""

def render_tag(self, library, tag, vars=None, request=None):
Expand All @@ -105,52 +103,3 @@ def render_tag(self, library, tag, vars=None, request=None):
else:
context = Context(vars)
return t.render(context)


class TestSettingsManager(object):
"""
From: http://www.djangosnippets.org/snippets/1011/
A class which can modify some Django settings temporarily for a
test and then revert them to their original values later.
Automatically handles resyncing the DB if INSTALLED_APPS is
modified.
"""

NO_SETTING = ('!', None)

def __init__(self):
self._original_settings = {}

def set(self, **kwargs):
for k, v in kwargs.iteritems():
self._original_settings.setdefault(k, getattr(settings, k,
self.NO_SETTING))
setattr(settings, k, v)
if 'INSTALLED_APPS' in kwargs:
self.syncdb()

def delete(self, *args):
for k in args:
try:
self._original_settings.setdefault(k, getattr(settings, k,
self.NO_SETTING))
delattr(settings, k)
except AttributeError:
pass # setting did not exist

def syncdb(self):
loading.cache.loaded = False
call_command('syncdb', verbosity=0, interactive=False)

def revert(self):
for k,v in self._original_settings.iteritems():
if v == self.NO_SETTING:
if hasattr(settings, k):
delattr(settings, k)
else:
setattr(settings, k, v)
if 'INSTALLED_APPS' in self._original_settings:
self.syncdb()
self._original_settings = {}

0 comments on commit f0d4a41

Please sign in to comment.