diff options
| -rw-r--r-- | tests/auth_tests/test_forms.py | 3 | ||||
| -rw-r--r-- | tests/logging_tests/logconfig.py | 6 | ||||
| -rw-r--r-- | tests/logging_tests/tests.py | 102 | ||||
| -rw-r--r-- | tests/middleware/tests.py | 9 |
4 files changed, 44 insertions, 76 deletions
diff --git a/tests/auth_tests/test_forms.py b/tests/auth_tests/test_forms.py index 983fe8c39e..167722c617 100644 --- a/tests/auth_tests/test_forms.py +++ b/tests/auth_tests/test_forms.py @@ -4,6 +4,8 @@ import sys import urllib.parse from unittest import mock +from mail.custombackend import FailingEmailBackend + from django import forms from django.contrib.auth.forms import ( AdminPasswordChangeForm, @@ -1382,6 +1384,7 @@ class PasswordResetFormTest(TestDataMixin, TestCase): @override_settings(EMAIL_BACKEND="mail.custombackend.FailingEmailBackend") def test_save_send_email_exceptions_are_catched_and_logged(self): + self.addCleanup(FailingEmailBackend.reset) user, username, email = self.create_dummy_user() form = PasswordResetForm({"email": email}) self.assertTrue(form.is_valid()) diff --git a/tests/logging_tests/logconfig.py b/tests/logging_tests/logconfig.py index 35999989fb..4d9a73f1b4 100644 --- a/tests/logging_tests/logconfig.py +++ b/tests/logging_tests/logconfig.py @@ -1,7 +1,6 @@ import logging from django.conf import settings -from django.core.mail.backends.base import BaseEmailBackend from django.views.debug import ExceptionReporter @@ -11,11 +10,6 @@ class MyHandler(logging.Handler): self.config = settings.LOGGING -class MyEmailBackend(BaseEmailBackend): - def send_messages(self, email_messages): - pass - - class CustomExceptionReporter(ExceptionReporter): def get_traceback_text(self): return "custom traceback text" diff --git a/tests/logging_tests/tests.py b/tests/logging_tests/tests.py index 9690147e81..d4cdbe7dd9 100644 --- a/tests/logging_tests/tests.py +++ b/tests/logging_tests/tests.py @@ -4,6 +4,7 @@ from io import StringIO from unittest import TestCase, mock from admin_scripts.tests import AdminScriptTestCase +from mail.custombackend import FailingEmailBackend, OptionsCapturingBackend from django.conf import settings from django.core import mail @@ -26,7 +27,6 @@ from django.utils.log import ( from django.views.debug import ExceptionReporter from . import views -from .logconfig import MyEmailBackend class LoggingFiltersTest(SimpleTestCase): @@ -286,9 +286,22 @@ class AdminEmailHandlerTest(SimpleTestCase): h for h in logger.handlers if h.__class__.__name__ == "AdminEmailHandler" ][0] - def test_fail_silently(self): - admin_email_handler = self.get_admin_email_handler(self.logger) - self.assertTrue(admin_email_handler.connection().fail_silently) + def make_log_record(self, url_path=None, *args, **kwargs): + record = self.logger.makeRecord( + "name", logging.ERROR, "function", "lno", "message", None, None + ) + if url_path is not None: + record.request = self.request_factory.get(url_path, *args, **kwargs) + return record + + @override_settings( + ADMINS=["admin@example.com"], + EMAIL_BACKEND="mail.custombackend.FailingEmailBackend", + ) + def test_sends_using_fail_silently(self): + self.addCleanup(FailingEmailBackend.reset) + self.logger.error("All work and no play makes Jack a dull boy") + self.assertIs(FailingEmailBackend.init_kwargs[0]["fail_silently"], True) @override_settings( ADMINS=["admin@example.com"], @@ -383,36 +396,16 @@ class AdminEmailHandlerTest(SimpleTestCase): self.assertNotIn("\r", mail.outbox[0].subject) self.assertEqual(mail.outbox[0].subject, expected_subject) - @override_settings( - ADMINS=["admin@example.com"], - DEBUG=False, - ) + @override_settings(ADMINS=["admin@example.com"]) def test_uses_custom_email_backend(self): - """ - Refs #19325 - """ - message = "All work and no play makes Jack a dull boy" - admin_email_handler = self.get_admin_email_handler(self.logger) - mail_admins_called = {"called": False} - - def my_mail_admins(*args, **kwargs): - connection = kwargs["connection"] - self.assertIsInstance(connection, MyEmailBackend) - mail_admins_called["called"] = True - - # Monkeypatches - orig_mail_admins = mail.mail_admins - orig_email_backend = admin_email_handler.email_backend - mail.mail_admins = my_mail_admins - admin_email_handler.email_backend = "logging_tests.logconfig.MyEmailBackend" - - try: - self.logger.error(message) - self.assertTrue(mail_admins_called["called"]) - finally: - # Revert Monkeypatches - mail.mail_admins = orig_mail_admins - admin_email_handler.email_backend = orig_email_backend + self.addCleanup(OptionsCapturingBackend.reset) + handler = AdminEmailHandler( + email_backend="mail.custombackend.OptionsCapturingBackend" + ) + handler.emit(self.make_log_record("/")) + self.assertEqual(len(mail.outbox), 0) + self.assertIs(OptionsCapturingBackend.init_kwargs[0]["fail_silently"], True) + self.assertEqual(len(OptionsCapturingBackend.sent_messages), 1) @override_settings( ADMINS=["admin@example.com"], @@ -423,12 +416,8 @@ class AdminEmailHandlerTest(SimpleTestCase): request. """ handler = self.get_admin_email_handler(self.logger) - record = self.logger.makeRecord( - "name", logging.ERROR, "function", "lno", "message", None, None - ) url_path = "/ยบ" - record.request = self.request_factory.get(url_path) - handler.emit(record) + handler.emit(self.make_log_record(url_path)) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual(msg.to, ["admin@example.com"]) @@ -442,16 +431,10 @@ class AdminEmailHandlerTest(SimpleTestCase): def test_customize_send_mail_method(self): class ManagerEmailHandler(AdminEmailHandler): def send_mail(self, subject, message, *args, **kwargs): - mail.mail_managers( - subject, message, *args, connection=self.connection(), **kwargs - ) + mail.mail_managers(subject, message, *args, **kwargs) handler = ManagerEmailHandler() - record = self.logger.makeRecord( - "name", logging.ERROR, "function", "lno", "message", None, None - ) - self.assertEqual(len(mail.outbox), 0) - handler.emit(record) + handler.emit(self.make_log_record()) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["manager@example.com"]) @@ -480,14 +463,10 @@ class AdminEmailHandlerTest(SimpleTestCase): @override_settings(ADMINS=["admin@example.com"]) def test_custom_exception_reporter_is_used(self): - record = self.logger.makeRecord( - "name", logging.ERROR, "function", "lno", "message", None, None - ) - record.request = self.request_factory.get("/") handler = AdminEmailHandler( reporter_class="logging_tests.logconfig.CustomExceptionReporter" ) - handler.emit(record) + handler.emit(self.make_log_record("/")) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual(msg.body, "message\n\ncustom traceback text") @@ -496,16 +475,7 @@ class AdminEmailHandlerTest(SimpleTestCase): def test_emit_no_form_tag(self): """HTML email doesn't contain forms.""" handler = AdminEmailHandler(include_html=True) - record = self.logger.makeRecord( - "name", - logging.ERROR, - "function", - "lno", - "message", - None, - None, - ) - handler.emit(record) + handler.emit(self.make_log_record()) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual(msg.subject, "[Django] ERROR: message") @@ -517,15 +487,7 @@ class AdminEmailHandlerTest(SimpleTestCase): @override_settings(ADMINS=[]) def test_emit_no_admins(self): handler = AdminEmailHandler() - record = self.logger.makeRecord( - "name", - logging.ERROR, - "function", - "lno", - "message", - None, - None, - ) + record = self.make_log_record() with mock.patch.object( handler, "format_subject", diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py index a61c4b147f..a79fcf4577 100644 --- a/tests/middleware/tests.py +++ b/tests/middleware/tests.py @@ -7,6 +7,8 @@ from io import BytesIO from unittest import mock from urllib.parse import quote +from mail.custombackend import FailingEmailBackend + from django.conf import settings from django.core import mail from django.core.exceptions import PermissionDenied @@ -499,6 +501,13 @@ class BrokenLinkEmailsMiddlewareTest(SimpleTestCase): BrokenLinkEmailsMiddleware(self.get_response)(self.req) self.assertEqual(len(mail.outbox), 1) + @override_settings(EMAIL_BACKEND="mail.custombackend.FailingEmailBackend") + def test_sends_using_fail_silently(self): + self.addCleanup(FailingEmailBackend.reset) + self.req.META["HTTP_REFERER"] = "/another/url/" + BrokenLinkEmailsMiddleware(self.get_response)(self.req) + self.assertIs(FailingEmailBackend.init_kwargs[0]["fail_silently"], True) + @override_settings(ROOT_URLCONF="middleware.cond_get_urls") class ConditionalGetMiddlewareTest(SimpleTestCase): |
