dynamicweb/cms/tests/test_mail.py

109 lines
4.1 KiB
Python

from smtplib import SMTPException
from unittest import skipUnless
from unittest.mock import patch
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.sites.models import Site
from django.core import mail
from django.test import SimpleTestCase, override_settings
from cms.api import create_page_user
from cms.test_utils.mail import MAILERS_SUPPORTED
from cms.test_utils.testcases import CMSTestCase
from cms.utils.mail import mail_page_user_change, send_mail
class MailTestCase(CMSTestCase):
def setUp(self):
mail.outbox = [] # reset outbox
def test_mail_page_user_change(self):
user = get_user_model().objects.create_superuser("username", "username@django-cms.org", "username")
user = create_page_user(user, user, grant_all=True)
mail_page_user_change(user)
self.assertEqual(len(mail.outbox), 1)
@skipUnless(MAILERS_SUPPORTED, "Django < 6.1 has no MAILERS setting")
def test_mailers_only_project(self):
self.assertEqual(
settings.MAILERS["default"]["BACKEND"],
"django.core.mail.backends.locmem.EmailBackend",
)
# MAILERS must work without falling back to legacy email settings.
for name in ("EMAIL_BACKEND", "EMAIL_HOST", "EMAIL_HOST_USER"):
with self.subTest(setting=name), self.assertRaises(AttributeError):
getattr(settings, name)
user = get_user_model()(email="username@django-cms.org")
mail_page_user_change(user, site=Site(domain="example.com"))
self.assertEqual(len(mail.outbox), 1)
message = mail.outbox[0]
self.assertEqual(message.to, [user.email])
self.assertIn("https://example.com/en/admin/", message.body)
self.assertEqual(message.alternatives[0][1], "text/html")
@override_settings(
TEMPLATES=[
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"OPTIONS": {
"loaders": [
(
"django.template.loaders.locmem.Loader",
{
"mail.txt": "{{ title }}: {{ login_url }}",
"mail.html": "<p>{{ title }}</p>",
},
)
]
},
}
]
)
class MailDeliveryTests(SimpleTestCase):
def send_message(self, **kwargs):
return send_mail(
"Account updated",
"mail.txt",
["user@example.com"],
site=Site(domain="example.com"),
**kwargs,
)
def test_text_mail(self):
self.send_message()
message = mail.outbox[0]
self.assertEqual(message.to, ["user@example.com"])
self.assertIn("Account updated: https://example.com/", message.body)
self.assertEqual(message.alternatives, [])
def test_multipart_mail(self):
self.send_message(html_template="mail.html")
self.assertEqual(mail.outbox[0].alternatives, [("<p>Account updated</p>", "text/html")])
def test_suppress_delivery_errors(self):
for error in (ConnectionError, SMTPException):
with self.subTest(error=error), patch("cms.utils.mail.EmailMultiAlternatives.send", side_effect=error):
self.send_message()
def test_raise_delivery_errors(self):
for error in (ConnectionError, SMTPException):
with self.subTest(error=error), patch("cms.utils.mail.EmailMultiAlternatives.send", side_effect=error):
with self.assertRaises(error):
self.send_message(fail_silently=False)
def test_raise_programming_errors(self):
with patch("cms.utils.mail.EmailMultiAlternatives.send", side_effect=ValueError):
with self.assertRaises(ValueError):
self.send_message()
@skipUnless(MAILERS_SUPPORTED, "Django < 6.1 has no MAILERS setting")
@override_settings(MAILERS={})
def test_unconfigured_mailer(self):
self.send_message()
with self.assertRaises(mail.MailerDoesNotExist):
self.send_message(fail_silently=False)