web/lib/django/test/utils.py
changeset 38 77b6da96e6f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/test/utils.py	Wed Jun 02 18:57:35 2010 +0200
@@ -0,0 +1,79 @@
+import sys, time, os
+from django.conf import settings
+from django.core import mail
+from django.core.mail.backends import locmem
+from django.test import signals
+from django.template import Template
+from django.utils.translation import deactivate
+
+class ContextList(list):
+    """A wrapper that provides direct key access to context items contained
+    in a list of context objects.
+    """
+    def __getitem__(self, key):
+        if isinstance(key, basestring):
+            for subcontext in self:
+                if key in subcontext:
+                    return subcontext[key]
+            raise KeyError(key)
+        else:
+            return super(ContextList, self).__getitem__(key)
+
+
+def instrumented_test_render(self, context):
+    """
+    An instrumented Template render method, providing a signal
+    that can be intercepted by the test system Client
+    """
+    signals.template_rendered.send(sender=self, template=self, context=context)
+    return self.nodelist.render(context)
+
+
+def setup_test_environment():
+    """Perform any global pre-test setup. This involves:
+
+        - Installing the instrumented test renderer
+        - Set the email backend to the locmem email backend.
+        - Setting the active locale to match the LANGUAGE_CODE setting.
+    """
+    Template.original_render = Template._render
+    Template._render = instrumented_test_render
+
+    mail.original_SMTPConnection = mail.SMTPConnection
+    mail.SMTPConnection = locmem.EmailBackend
+
+    mail.original_email_backend = settings.EMAIL_BACKEND
+    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
+
+    mail.outbox = []
+
+    deactivate()
+
+def teardown_test_environment():
+    """Perform any global post-test teardown. This involves:
+
+        - Restoring the original test renderer
+        - Restoring the email sending functions
+
+    """
+    Template._render = Template.original_render
+    del Template.original_render
+
+    mail.SMTPConnection = mail.original_SMTPConnection
+    del mail.original_SMTPConnection
+
+    settings.EMAIL_BACKEND = mail.original_email_backend
+    del mail.original_email_backend
+
+    del mail.outbox
+
+def get_runner(settings):
+    test_path = settings.TEST_RUNNER.split('.')
+    # Allow for Python 2.5 relative paths
+    if len(test_path) > 1:
+        test_module_name = '.'.join(test_path[:-1])
+    else:
+        test_module_name = '.'
+    test_module = __import__(test_module_name, {}, {}, test_path[-1])
+    test_runner = getattr(test_module, test_path[-1])
+    return test_runner