diff options
| author | Carl Meyer <carl@oddbird.net> | 2016-06-14 00:41:58 -0700 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2016-06-17 10:00:39 -0700 |
| commit | 7d1b69dbe7f72ac04d2513f0468fe2146231b286 (patch) | |
| tree | 31478358078d603fb54c02f22792d47707b9aed5 /tests/middleware_exceptions/tests.py | |
| parent | 104ee2fdae7fcd402396c709c91f5c84de6e4165 (diff) | |
Refs #26601 -- Improved backwards-compatibility of DEP 5 middleware exception handling.
Diffstat (limited to 'tests/middleware_exceptions/tests.py')
| -rw-r--r-- | tests/middleware_exceptions/tests.py | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/tests/middleware_exceptions/tests.py b/tests/middleware_exceptions/tests.py new file mode 100644 index 0000000000..f6a7e24e59 --- /dev/null +++ b/tests/middleware_exceptions/tests.py @@ -0,0 +1,133 @@ +from django.conf import settings +from django.core.exceptions import MiddlewareNotUsed +from django.test import RequestFactory, SimpleTestCase, override_settings +from django.test.utils import patch_logger + +from . import middleware as mw + + +@override_settings(ROOT_URLCONF='middleware_exceptions.urls') +class MiddlewareTests(SimpleTestCase): + def tearDown(self): + mw.log = [] + + @override_settings(MIDDLEWARE=['middleware_exceptions.middleware.ProcessViewNoneMiddleware']) + def test_process_view_return_none(self): + response = self.client.get('/middleware_exceptions/view/') + self.assertEqual(mw.log, ['processed view normal_view']) + self.assertEqual(response.content, b'OK') + + @override_settings(MIDDLEWARE=['middleware_exceptions.middleware.ProcessViewMiddleware']) + def test_process_view_return_response(self): + response = self.client.get('/middleware_exceptions/view/') + self.assertEqual(response.content, b'Processed view normal_view') + + @override_settings(MIDDLEWARE=['middleware_exceptions.middleware.TemplateResponseMiddleware']) + def test_process_template_response(self): + response = self.client.get('/middleware_exceptions/template_response/') + self.assertEqual(response.content, b'template-response middleware') + + @override_settings(MIDDLEWARE=['middleware_exceptions.middleware.LogMiddleware']) + def test_view_exception_converted_before_middleware(self): + response = self.client.get('/middleware_exceptions/permission_denied/') + self.assertEqual(mw.log, [(response.status_code, response.content)]) + self.assertEqual(response.status_code, 403) + + @override_settings(MIDDLEWARE=['middleware_exceptions.middleware.ProcessExceptionMiddleware']) + def test_view_exception_handled_by_process_exception(self): + response = self.client.get('/middleware_exceptions/error/') + self.assertEqual(response.content, b'Exception caught') + + @override_settings(MIDDLEWARE=[ + 'middleware_exceptions.middleware.ProcessExceptionLogMiddleware', + 'middleware_exceptions.middleware.ProcessExceptionMiddleware', + ]) + def test_response_from_process_exception_short_circuits_remainder(self): + response = self.client.get('/middleware_exceptions/error/') + self.assertEqual(mw.log, []) + self.assertEqual(response.content, b'Exception caught') + + @override_settings(MIDDLEWARE=[ + 'middleware_exceptions.middleware.LogMiddleware', + 'middleware_exceptions.middleware.NotFoundMiddleware', + ]) + def test_exception_in_middleware_converted_before_prior_middleware(self): + response = self.client.get('/middleware_exceptions/view/') + self.assertEqual(mw.log, [(404, response.content)]) + self.assertEqual(response.status_code, 404) + + @override_settings(MIDDLEWARE=['middleware_exceptions.middleware.ProcessExceptionMiddleware']) + def test_exception_in_render_passed_to_process_exception(self): + response = self.client.get('/middleware_exceptions/exception_in_render/') + self.assertEqual(response.content, b'Exception caught') + + +@override_settings(ROOT_URLCONF='middleware_exceptions.urls') +class RootUrlconfTests(SimpleTestCase): + + @override_settings(ROOT_URLCONF=None) + def test_missing_root_urlconf(self): + # Removing ROOT_URLCONF is safe, as override_settings will restore + # the previously defined settings. + del settings.ROOT_URLCONF + with self.assertRaises(AttributeError): + self.client.get("/middleware_exceptions/view/") + + +class MyMiddleware(object): + + def __init__(self, get_response=None): + raise MiddlewareNotUsed + + def process_request(self, request): + pass + + +class MyMiddlewareWithExceptionMessage(object): + + def __init__(self, get_response=None): + raise MiddlewareNotUsed('spam eggs') + + def process_request(self, request): + pass + + +@override_settings( + DEBUG=True, + ROOT_URLCONF='middleware_exceptions.urls', + MIDDLEWARE=['django.middleware.common.CommonMiddleware'], +) +class MiddlewareNotUsedTests(SimpleTestCase): + + rf = RequestFactory() + + def test_raise_exception(self): + request = self.rf.get('middleware_exceptions/view/') + with self.assertRaises(MiddlewareNotUsed): + MyMiddleware().process_request(request) + + @override_settings(MIDDLEWARE=['middleware_exceptions.tests.MyMiddleware']) + def test_log(self): + with patch_logger('django.request', 'debug') as calls: + self.client.get('/middleware_exceptions/view/') + self.assertEqual(len(calls), 1) + self.assertEqual( + calls[0], + "MiddlewareNotUsed: 'middleware_exceptions.tests.MyMiddleware'" + ) + + @override_settings(MIDDLEWARE=['middleware_exceptions.tests.MyMiddlewareWithExceptionMessage']) + def test_log_custom_message(self): + with patch_logger('django.request', 'debug') as calls: + self.client.get('/middleware_exceptions/view/') + self.assertEqual(len(calls), 1) + self.assertEqual( + calls[0], + "MiddlewareNotUsed('middleware_exceptions.tests.MyMiddlewareWithExceptionMessage'): spam eggs" + ) + + @override_settings(DEBUG=False) + def test_do_not_log_when_debug_is_false(self): + with patch_logger('django.request', 'debug') as calls: + self.client.get('/middleware_exceptions/view/') + self.assertEqual(len(calls), 0) |
