1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

[1.2.X] 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.

Backport of [14526] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@14527 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Luke Plant 2010-11-11 15:30:13 +00:00
parent 79ab8cad03
commit d7b8d07cf2
4 changed files with 48 additions and 13 deletions

View File

@ -11,6 +11,7 @@ from django.db import transaction, connections, DEFAULT_DB_ALIAS
from django.http import QueryDict from django.http import QueryDict
from django.test import _doctest as doctest from django.test import _doctest as doctest
from django.test.client import Client from django.test.client import Client
from django.test.utils import get_warnings_state, restore_warnings_state
from django.utils import simplejson from django.utils import simplejson
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
@ -286,6 +287,19 @@ class TransactionTestCase(unittest.TestCase):
settings.ROOT_URLCONF = self._old_root_urlconf settings.ROOT_URLCONF = self._old_root_urlconf
clear_url_caches() 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, def assertRedirects(self, response, expected_url, status_code=302,
target_status_code=200, host=None, msg_prefix=''): target_status_code=200, host=None, msg_prefix=''):
"""Asserts that a response redirected to a specific URL, and that the """Asserts that a response redirected to a specific URL, and that the

View File

@ -1,6 +1,7 @@
import sys import sys
import time import time
import os import os
import warnings
from django.conf import settings from django.conf import settings
from django.core import mail from django.core import mail
from django.core.mail.backends import locmem from django.core.mail.backends import locmem
@ -43,6 +44,7 @@ class ContextList(list):
return False return False
return True return True
def instrumented_test_render(self, context): def instrumented_test_render(self, context):
""" """
An instrumented Template render method, providing a signal An instrumented Template render method, providing a signal
@ -72,6 +74,7 @@ def setup_test_environment():
deactivate() deactivate()
def teardown_test_environment(): def teardown_test_environment():
"""Perform any global post-test teardown. This involves: """Perform any global post-test teardown. This involves:
@ -90,6 +93,25 @@ def teardown_test_environment():
del mail.outbox 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): def get_runner(settings):
test_path = settings.TEST_RUNNER.split('.') test_path = settings.TEST_RUNNER.split('.')
# Allow for Python 2.5 relative paths # Allow for Python 2.5 relative paths

View File

@ -16,6 +16,7 @@ from django.core.cache import get_cache
from django.core.cache.backends.base import InvalidCacheBackendError, CacheKeyWarning from django.core.cache.backends.base import InvalidCacheBackendError, CacheKeyWarning
from django.http import HttpResponse, HttpRequest from django.http import HttpResponse, HttpRequest
from django.middleware.cache import FetchFromCacheMiddleware, UpdateCacheMiddleware 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 translation
from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key
from django.utils.hashcompat import md5_constructor from django.utils.hashcompat import md5_constructor
@ -379,20 +380,16 @@ class BaseCacheTests(object):
# manager to test this warning nicely. Since we can't do that # manager to test this warning nicely. Since we can't do that
# yet, the cleanest option is to temporarily ask for # yet, the cleanest option is to temporarily ask for
# CacheKeyWarning to be raised as an exception. # CacheKeyWarning to be raised as an exception.
_warnings_state = get_warnings_state()
warnings.simplefilter("error", CacheKeyWarning) warnings.simplefilter("error", CacheKeyWarning)
# memcached does not allow whitespace or control characters in keys try:
self.assertRaises(CacheKeyWarning, self.cache.set, 'key with spaces', 'value') # memcached does not allow whitespace or control characters in keys
# memcached limits key length to 250 self.assertRaises(CacheKeyWarning, self.cache.set, 'key with spaces', 'value')
self.assertRaises(CacheKeyWarning, self.cache.set, 'a' * 251, '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 finally:
# current list of warning filters, so we can't save that off restore_warnings_state(_warnings_state)
# 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()
class DBCacheTests(unittest.TestCase, BaseCacheTests): class DBCacheTests(unittest.TestCase, BaseCacheTests):
def setUp(self): def setUp(self):

View File

@ -21,6 +21,7 @@ from django.template import TemplateDoesNotExist, Context
from django.template.loaders.eggs import load_template_source as lts_egg from django.template.loaders.eggs import load_template_source as lts_egg
from django.template.loaders.eggs import Loader as EggLoader from django.template.loaders.eggs import Loader as EggLoader
from django.template import loader from django.template import loader
from django.test.utils import get_warnings_state, restore_warnings_state
# Mock classes and objects for pkg_resources functions. # Mock classes and objects for pkg_resources functions.
class MockProvider(pkg_resources.NullProvider): class MockProvider(pkg_resources.NullProvider):
@ -67,11 +68,12 @@ class DeprecatedEggLoaderTest(unittest.TestCase):
}) })
self._old_installed_apps = settings.INSTALLED_APPS self._old_installed_apps = settings.INSTALLED_APPS
settings.INSTALLED_APPS = [] settings.INSTALLED_APPS = []
self._warnings_state = get_warnings_state()
warnings.simplefilter("ignore", PendingDeprecationWarning) warnings.simplefilter("ignore", PendingDeprecationWarning)
def tearDown(self): def tearDown(self):
settings.INSTALLED_APPS = self._old_installed_apps settings.INSTALLED_APPS = self._old_installed_apps
warnings.resetwarnings() restore_warnings_state(self._warnings_state)
def test_existing(self): def test_existing(self):
"A template can be loaded from an egg" "A template can be loaded from an egg"