| 1 | from django.conf import settings
|
|---|
| 2 | from django.core.urlresolvers import reverse
|
|---|
| 3 | from django.test import TestCase
|
|---|
| 4 | from django.conf import urls as url_handlers
|
|---|
| 5 | from django.template import Context, Template
|
|---|
| 6 | from django.contrib.messages.tests import urls
|
|---|
| 7 | from django import http
|
|---|
| 8 | from django.test.utils import override_settings
|
|---|
| 9 | from django.contrib.messages import constants
|
|---|
| 10 | from django.contrib.messages.api import MessageFailure
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 | class Test500(TestCase):
|
|---|
| 14 |
|
|---|
| 15 | def render_error(self, *args, **kw):
|
|---|
| 16 | error_template = Template("{% url about-site %}")
|
|---|
| 17 | # This template will work, because it doesn't do a reverse match on
|
|---|
| 18 | # on something on the destroyed ROOT_URLCONF.
|
|---|
| 19 | #error_template = Template("works")
|
|---|
| 20 | return http.HttpResponse(error_template.render(Context({})))
|
|---|
| 21 |
|
|---|
| 22 | # These are the override_settings defined in the contrib/messages/tests/base.py,
|
|---|
| 23 | # copied here so you don't get lead astray
|
|---|
| 24 | @override_settings(
|
|---|
| 25 | INSTALLED_APPS=filter(
|
|---|
| 26 | lambda app:app!='django.contrib.messages', settings.INSTALLED_APPS),
|
|---|
| 27 | MIDDLEWARE_CLASSES=filter(
|
|---|
| 28 | lambda m:'MessageMiddleware' not in m, settings.MIDDLEWARE_CLASSES),
|
|---|
| 29 | TEMPLATE_CONTEXT_PROCESSORS=filter(
|
|---|
| 30 | lambda p:'context_processors.messages' not in p,
|
|---|
| 31 | settings.TEMPLATE_CONTEXT_PROCESSORS),
|
|---|
| 32 | MESSAGE_LEVEL=constants.DEBUG
|
|---|
| 33 | )
|
|---|
| 34 | def test_error_handling_page(self):
|
|---|
| 35 | # This is the key here. This is done in django/test/testcases.py _urlconf_setup.
|
|---|
| 36 | # Where the url conf is overridden in the test.
|
|---|
| 37 | settings.ROOT_URLCONF = urls
|
|---|
| 38 | # When the client has a problem and raises the 500 message down below, it will
|
|---|
| 39 | # propogate up the handler 500 specified here.
|
|---|
| 40 | url_handlers.handler500 = self.render_error
|
|---|
| 41 | show_url = reverse('django.contrib.messages.tests.urls.show')
|
|---|
| 42 | add_url = reverse('django.contrib.messages.tests.urls.add', args=('warning',))
|
|---|
| 43 | data = {
|
|---|
| 44 | 'messages': ['Test message %d' % x for x in xrange(10)],
|
|---|
| 45 | }
|
|---|
| 46 | # This is copied from contrib/messages/tests/base.py and will raise a MessageFailure error
|
|---|
| 47 | #
|
|---|
| 48 | # So really the problem is that we are testing the propogation into the 500 handler
|
|---|
| 49 | # as well. We shouldn't be doing all that, what we should be doing is the following.
|
|---|
| 50 | # Then render_error never gets called.
|
|---|
| 51 | #settings.DEBUG = True
|
|---|
| 52 | #settings.DEBUG_PROPAGATE_EXCEPTION = True
|
|---|
| 53 | self.assertRaises(MessageFailure, self.client.post, add_url, data, follow=True)
|
|---|