Author: julien
Date: 2011-10-22 16:39:09 -0700 (Sat, 22 Oct 2011)
New Revision: 17027

Modified:
   django/trunk/django/contrib/messages/tests/base.py
Log:
Fixed #16574 -- Strengthened the `contrib.messages` tests' isolation to avoid 
failures under certain project setting environments. Thanks to Boldewyn for the 
report and to Claude Paroz for the patch.

Modified: django/trunk/django/contrib/messages/tests/base.py
===================================================================
--- django/trunk/django/contrib/messages/tests/base.py  2011-10-22 17:17:57 UTC 
(rev 17026)
+++ django/trunk/django/contrib/messages/tests/base.py  2011-10-22 23:39:09 UTC 
(rev 17027)
@@ -1,13 +1,14 @@
 from django import http
-from django.test import TestCase
 from django.conf import settings
-from django.utils.translation import ugettext_lazy
-from django.utils.unittest import skipIf
 from django.contrib.messages import constants, utils, get_level, set_level
 from django.contrib.messages.api import MessageFailure
 from django.contrib.messages.storage import default_storage, base
 from django.contrib.messages.storage.base import Message
 from django.core.urlresolvers import reverse
+from django.test import TestCase
+from django.test.utils import override_settings
+from django.utils.translation import ugettext_lazy
+from django.utils.unittest import skipIf
 
 
 def skipUnlessAuthIsInstalled(func):
@@ -29,9 +30,21 @@
     storage.add(constants.SUCCESS, 'This was a triumph.')
 
 
+class override_settings_tags(override_settings):
+     def enable(self):
+        super(override_settings_tags, self).enable()
+        # LEVEL_TAGS is a constant defined in the
+        # django.contrib.messages.storage.base module, so after changing
+        # settings.MESSAGE_TAGS, we need to update that constant too.
+        self.old_level_tags = base.LEVEL_TAGS
+        base.LEVEL_TAGS = utils.get_level_tags()
+     def disable(self):
+        super(override_settings_tags, self).disable()
+        base.LEVEL_TAGS = self.old_level_tags
+
+
 class BaseTest(TestCase):
     storage_class = default_storage
-    restore_settings = ['MESSAGE_LEVEL', 'MESSAGE_TAGS']
     urls = 'django.contrib.messages.tests.urls'
     levels = {
         'debug': constants.DEBUG,
@@ -42,40 +55,17 @@
     }
 
     def setUp(self):
-        self._remembered_settings = {}
-        for setting in self.restore_settings:
-            if hasattr(settings, setting):
-                self._remembered_settings[setting] = getattr(settings, setting)
-                delattr(settings._wrapped, setting)
-        # Backup these manually because we do not want them deleted.
-        self._middleware_classes = settings.MIDDLEWARE_CLASSES
-        self._template_context_processors = \
-           settings.TEMPLATE_CONTEXT_PROCESSORS
-        self._installed_apps = settings.INSTALLED_APPS
-        self._message_storage = settings.MESSAGE_STORAGE
-        settings.MESSAGE_STORAGE = '%s.%s' % (self.storage_class.__module__,
-                                              self.storage_class.__name__)
-        self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
-        settings.TEMPLATE_DIRS = ()
+        self.settings_override = override_settings_tags(
+            TEMPLATE_DIRS   = (),
+            MESSAGE_TAGS    = '',
+            MESSAGE_STORAGE = '%s.%s' % (self.storage_class.__module__,
+                                         self.storage_class.__name__),
+        )
+        self.settings_override.enable()
 
     def tearDown(self):
-        for setting in self.restore_settings:
-            self.restore_setting(setting)
-        # Restore these manually (see above).
-        settings.MIDDLEWARE_CLASSES = self._middleware_classes
-        settings.TEMPLATE_CONTEXT_PROCESSORS = \
-           self._template_context_processors
-        settings.INSTALLED_APPS = self._installed_apps
-        settings.MESSAGE_STORAGE = self._message_storage
-        settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
+        self.settings_override.disable()
 
-    def restore_setting(self, setting):
-        if setting in self._remembered_settings:
-            value = self._remembered_settings.pop(setting)
-            setattr(settings, setting, value)
-        elif hasattr(settings, setting):
-            delattr(settings._wrapped, setting)
-
     def get_request(self):
         return http.HttpRequest()
 
@@ -153,13 +143,13 @@
         storing = self.stored_messages_count(storage, response)
         self.assertEqual(storing, 1)
 
+    @override_settings(MESSAGE_LEVEL=constants.DEBUG)
     def test_full_request_response_cycle(self):
         """
         With the message middleware enabled, tests that messages are properly
         stored and then retrieved across the full request/redirect/response
         cycle.
         """
-        settings.MESSAGE_LEVEL = constants.DEBUG
         data = {
             'messages': ['Test message %d' % x for x in xrange(10)],
         }
@@ -176,8 +166,8 @@
             for msg in data['messages']:
                 self.assertContains(response, msg)
 
+    @override_settings(MESSAGE_LEVEL=constants.DEBUG)
     def test_with_template_response(self):
-        settings.MESSAGE_LEVEL = constants.DEBUG
         data = {
             'messages': ['Test message %d' % x for x in xrange(10)],
         }
@@ -196,12 +186,12 @@
             for msg in data['messages']:
                 self.assertNotContains(response, msg)
 
+    @override_settings(MESSAGE_LEVEL=constants.DEBUG)
     def test_multiple_posts(self):
         """
         Tests that messages persist properly when multiple POSTs are made
         before a GET.
         """
-        settings.MESSAGE_LEVEL = constants.DEBUG
         data = {
             'messages': ['Test message %d' % x for x in xrange(10)],
         }
@@ -219,25 +209,21 @@
         for msg in data['messages']:
             self.assertContains(response, msg)
 
+    @override_settings(
+        INSTALLED_APPS=filter(
+            lambda app:app!='django.contrib.messages', 
settings.INSTALLED_APPS),
+        MIDDLEWARE_CLASSES=filter(
+            lambda m:'MessageMiddleware' not in m, 
settings.MIDDLEWARE_CLASSES),
+        TEMPLATE_CONTEXT_PROCESSORS=filter(
+            lambda p:'context_processors.messages' not in p,
+                 settings.TEMPLATE_CONTEXT_PROCESSORS),
+        MESSAGE_LEVEL=constants.DEBUG
+    )
     def test_middleware_disabled(self):
         """
         Tests that, when the middleware is disabled, an exception is raised
         when one attempts to store a message.
         """
-        settings.MESSAGE_LEVEL = constants.DEBUG
-        settings.INSTALLED_APPS = list(settings.INSTALLED_APPS)
-        settings.INSTALLED_APPS.remove(
-            'django.contrib.messages',
-        )
-        settings.MIDDLEWARE_CLASSES = list(settings.MIDDLEWARE_CLASSES)
-        settings.MIDDLEWARE_CLASSES.remove(
-            'django.contrib.messages.middleware.MessageMiddleware',
-        )
-        settings.TEMPLATE_CONTEXT_PROCESSORS = \
-          list(settings.TEMPLATE_CONTEXT_PROCESSORS)
-        settings.TEMPLATE_CONTEXT_PROCESSORS.remove(
-            'django.contrib.messages.context_processors.messages',
-        )
         data = {
             'messages': ['Test message %d' % x for x in xrange(10)],
         }
@@ -248,25 +234,21 @@
             self.assertRaises(MessageFailure, self.client.post, add_url,
                               data, follow=True)
 
+    @override_settings(
+        INSTALLED_APPS=filter(
+            lambda app:app!='django.contrib.messages', 
settings.INSTALLED_APPS),
+        MIDDLEWARE_CLASSES=filter(
+            lambda m:'MessageMiddleware' not in m, 
settings.MIDDLEWARE_CLASSES),
+        TEMPLATE_CONTEXT_PROCESSORS=filter(
+            lambda p:'context_processors.messages' not in p,
+                 settings.TEMPLATE_CONTEXT_PROCESSORS),
+        MESSAGE_LEVEL=constants.DEBUG
+    )
     def test_middleware_disabled_fail_silently(self):
         """
         Tests that, when the middleware is disabled, an exception is not
         raised if 'fail_silently' = True
         """
-        settings.MESSAGE_LEVEL = constants.DEBUG
-        settings.INSTALLED_APPS = list(settings.INSTALLED_APPS)
-        settings.INSTALLED_APPS.remove(
-            'django.contrib.messages',
-        )
-        settings.MIDDLEWARE_CLASSES = list(settings.MIDDLEWARE_CLASSES)
-        settings.MIDDLEWARE_CLASSES.remove(
-            'django.contrib.messages.middleware.MessageMiddleware',
-        )
-        settings.TEMPLATE_CONTEXT_PROCESSORS = \
-          list(settings.TEMPLATE_CONTEXT_PROCESSORS)
-        settings.TEMPLATE_CONTEXT_PROCESSORS.remove(
-            'django.contrib.messages.context_processors.messages',
-        )
         data = {
             'messages': ['Test message %d' % x for x in xrange(10)],
             'fail_silently': True,
@@ -350,11 +332,11 @@
         add_level_messages(storage)
         self.assertEqual(len(storage), 2)
 
+    @override_settings(MESSAGE_LEVEL=29)
     def test_settings_level(self):
         request = self.get_request()
         storage = self.storage_class(request)
 
-        settings.MESSAGE_LEVEL = 29
         self.assertEqual(get_level(request), 29)
 
         add_level_messages(storage)
@@ -369,26 +351,18 @@
                          ['info', '', 'extra-tag debug', 'warning', 'error',
                           'success'])
 
-    def test_custom_tags(self):
-        settings.MESSAGE_TAGS = {
+    @override_settings_tags(MESSAGE_TAGS={
             constants.INFO: 'info',
             constants.DEBUG: '',
             constants.WARNING: '',
             constants.ERROR: 'bad',
             29: 'custom',
         }
-        # LEVEL_TAGS is a constant defined in the
-        # django.contrib.messages.storage.base module, so after changing
-        # settings.MESSAGE_TAGS, we need to update that constant too.
-        base.LEVEL_TAGS = utils.get_level_tags()
-        try:
-            storage = self.get_storage()
-            storage.level = 0
-            add_level_messages(storage)
-            tags = [msg.tags for msg in storage]
-            self.assertEqual(tags,
-                         ['info', 'custom', 'extra-tag', '', 'bad', 'success'])
-        finally:
-            # Ensure the level tags constant is put back like we found it.
-            self.restore_setting('MESSAGE_TAGS')
-            base.LEVEL_TAGS = utils.get_level_tags()
+    )
+    def test_custom_tags(self):
+        storage = self.get_storage()
+        storage.level = 0
+        add_level_messages(storage)
+        tags = [msg.tags for msg in storage]
+        self.assertEqual(tags,
+                     ['info', 'custom', 'extra-tag', '', 'bad', 'success'])

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to