Commit 02fc6276 authored by Luke Plant's avatar Luke Plant
Browse files

Fixed #14508 - test suite silences warnings.

Utility functions get_warnings_state and save_warnings_state have been added
to django.test.utils, and methods to django.test.TestCase for convenience.

The implementation is based on the catch_warnings context manager from
Python 2.6.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14526 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 7beca4d3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -154,13 +154,13 @@ class RowlevelBackendTest(TestCase):
        self.user1 = User.objects.create_user('test', 'test@example.com', 'test')
        self.user2 = User.objects.create_user('test2', 'test2@example.com', 'test')
        self.user3 = User.objects.create_user('test3', 'test3@example.com', 'test')
        self.save_warnings_state()
        warnings.filterwarnings('ignore', category=DeprecationWarning,
                                module='django.contrib.auth')

    def tearDown(self):
        settings.AUTHENTICATION_BACKENDS = self.curr_auth
        warnings.resetwarnings()
        warnings.simplefilter('ignore', PendingDeprecationWarning)
        self.restore_warnings_state()

    def test_has_perm(self):
        self.assertEqual(self.user1.has_perm('perm', TestObj()), False)
+2 −2
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ class BaseTest(TestCase):
        self._message_storage = settings.MESSAGE_STORAGE
        settings.MESSAGE_STORAGE = '%s.%s' % (self.storage_class.__module__,
                                              self.storage_class.__name__)
        self.save_warnings_state()
        warnings.filterwarnings('ignore', category=DeprecationWarning,
                                module='django.contrib.auth.models')

@@ -63,8 +64,7 @@ class BaseTest(TestCase):
           self._template_context_processors
        settings.INSTALLED_APPS = self._installed_apps
        settings.MESSAGE_STORAGE = self._message_storage
        warnings.resetwarnings()
        warnings.simplefilter('ignore', PendingDeprecationWarning)
        self.restore_warnings_state()

    def restore_setting(self, setting):
        if setting in self._remembered_settings:
+14 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ from django.db import transaction, connection, connections, DEFAULT_DB_ALIAS
from django.http import QueryDict
from django.test import _doctest as doctest
from django.test.client import Client
from django.test.utils import get_warnings_state, restore_warnings_state
from django.utils import simplejson, unittest as ut2
from django.utils.encoding import smart_str
from django.utils.functional import wraps
@@ -328,6 +329,19 @@ class TransactionTestCase(ut2.TestCase):
            settings.ROOT_URLCONF = self._old_root_urlconf
            clear_url_caches()

    def save_warnings_state(self):
        """
        Saves the state of the warnings module
        """
        self._warnings_state = get_warnings_state()

    def restore_warnings_state(self):
        """
        Restores the sate of the warnings module to the state
        saved by save_warnings_state()
        """
        restore_warnings_state(self._warnings_state)

    def assertRedirects(self, response, expected_url, status_code=302,
                        target_status_code=200, host=None, msg_prefix=''):
        """Asserts that a response redirected to a specific URL, and that the
+22 −0
Original line number Diff line number Diff line
import sys
import time
import os
import warnings
from django.conf import settings
from django.core import mail
from django.core.mail.backends import locmem
@@ -46,6 +47,7 @@ class ContextList(list):
            return False
        return True


def instrumented_test_render(self, context):
    """
    An instrumented Template render method, providing a signal
@@ -75,6 +77,7 @@ def setup_test_environment():

    deactivate()


def teardown_test_environment():
    """Perform any global post-test teardown. This involves:

@@ -93,6 +96,25 @@ def teardown_test_environment():

    del mail.outbox


def get_warnings_state():
    """
    Returns an object containing the state of the warnings module
    """
    # There is no public interface for doing this, but this implementation of
    # get_warnings_state and restore_warnings_state appears to work on Python
    # 2.4 to 2.7.
    return warnings.filters[:]


def restore_warnings_state(state):
    """
    Restores the state of the warnings module when passed an object that was
    returned by get_warnings_state()
    """
    warnings.filters = state[:]


def get_runner(settings):
    test_path = settings.TEST_RUNNER.split('.')
    # Allow for Python 2.5 relative paths
+9 −13
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ from django.core.cache import get_cache
from django.core.cache.backends.base import InvalidCacheBackendError, CacheKeyWarning
from django.http import HttpResponse, HttpRequest
from django.middleware.cache import FetchFromCacheMiddleware, UpdateCacheMiddleware
from django.test.utils import get_warnings_state, restore_warnings_state
from django.utils import translation
from django.utils import unittest
from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key
@@ -379,21 +380,16 @@ class BaseCacheTests(object):
        # manager to test this warning nicely. Since we can't do that
        # yet, the cleanest option is to temporarily ask for
        # CacheKeyWarning to be raised as an exception.
        _warnings_state = get_warnings_state()
        warnings.simplefilter("error", CacheKeyWarning)

        try:
            # memcached does not allow whitespace or control characters in keys
            self.assertRaises(CacheKeyWarning, self.cache.set, 'key with spaces', 'value')
            # memcached limits key length to 250
            self.assertRaises(CacheKeyWarning, self.cache.set, 'a' * 251, 'value')

        # The warnings module has no public API for getting the
        # current list of warning filters, so we can't save that off
        # and reset to the previous value, we have to globally reset
        # it. The effect will be the same, as long as the Django test
        # runner doesn't add any global warning filters (it currently
        # does not).
        warnings.resetwarnings()
        warnings.simplefilter("ignore", PendingDeprecationWarning)
        finally:
            restore_warnings_state(_warnings_state)

class DBCacheTests(unittest.TestCase, BaseCacheTests):
    def setUp(self):
Loading