django-analytical/analytical/tests/utils.py
2011-01-30 10:06:01 +01:00

98 lines
2.7 KiB
Python

"""
Testing utilities.
"""
from django.conf import settings
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
def run_tests(labels=()):
"""
Use the Django test runner to run the tests.
"""
django_run_tests(labels, verbosity=1, interactive=True)
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.
"""
def render_tag(self, library, tag, vars=None, request=None):
if vars is None:
vars = {}
t = Template("{%% load %s %%}{%% %s %%}" % (library, tag))
if request is not None:
context = RequestContext(request, vars)
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 = {}