From cc4cc9d14fd3e635ade9f16182e4dbea423658e6 Mon Sep 17 00:00:00 2001 From: pletinckxc Date: Wed, 28 Apr 2021 14:58:51 +0200 Subject: [PATCH] test_send_email: Shorten tests about build_email. Commit b7fa41601de25d7386b5861614f7302827f0354c introduced some tests to verify the implemented changes. These tests were longer than necessary. See https://github.com/zulip/zulip/pull/17799 for the whole discussion. --- zerver/tests/test_send_email.py | 59 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/zerver/tests/test_send_email.py b/zerver/tests/test_send_email.py index fda4e43529..d86ecd7329 100644 --- a/zerver/tests/test_send_email.py +++ b/zerver/tests/test_send_email.py @@ -1,4 +1,4 @@ -from smtplib import SMTP, SMTPException +from smtplib import SMTP, SMTPDataError, SMTPException from unittest import mock from django.core.mail.backends.locmem import EmailBackend @@ -15,24 +15,8 @@ from zerver.lib.send_email import ( ) from zerver.lib.test_classes import ZulipTestCase -OVERLY_LONG_NAME = "Z̷̧̙̯͙̠͇̰̲̞̙͆́͐̅̌͐̔͑̚u̷̼͎̹̻̻̣̞͈̙͛͑̽̉̾̀̅̌͜͠͞ļ̛̫̻̫̰̪̩̠̣̼̏̅́͌̊͞į̴̛̛̩̜̜͕̘̂̑̀̈p̡̛͈͖͓̟͍̿͒̍̽͐͆͂̀ͅ A̰͉̹̅̽̑̕͜͟͡c̷͚̙̘̦̞̫̭͗̋͋̾̑͆̒͟͞c̵̗̹̣̲͚̳̳̮͋̈́̾̉̂͝ͅo̠̣̻̭̰͐́͛̄̂̿̏͊u̴̱̜̯̭̞̠͋͛͐̍̄n̸̡̘̦͕͓̬͌̂̎͊͐̎͌̕ť̮͎̯͎̣̙̺͚̱̌̀́̔͢͝ S͇̯̯̙̳̝͆̊̀͒͛̕ę̛̘̬̺͎͎́̔̊̀͂̓̆̕͢ͅc̨͎̼̯̩̽͒̀̏̄̌̚u̷͉̗͕̼̮͎̬͓͋̃̀͂̈̂̈͊͛ř̶̡͔̺̱̹͓̺́̃̑̉͡͞ͅi̶̺̭͈̬̞̓̒̃͆̅̿̀̄́t͔̹̪͔̥̣̙̍̍̍̉̑̏͑́̌ͅŷ̧̗͈͚̥̗͚͊͑̀͢͜͡" - class TestBuildEmail(ZulipTestCase): - def test_build_SES_compatible_From_field(self) -> None: - hamlet = self.example_user("hamlet") - from_name = FromAddress.security_email_from_name(language="en") - mail = build_email( - "zerver/emails/password_reset", - to_emails=[hamlet], - from_name=from_name, - from_address=FromAddress.NOREPLY, - language="en", - ) - self.assertEqual( - mail.extra_headers["From"], "{} <{}>".format(from_name, FromAddress.NOREPLY) - ) - def test_build_SES_compatible_From_field_limit(self) -> None: hamlet = self.example_user("hamlet") limit_length_name = "a" * (320 - len(sanitize_address(FromAddress.NOREPLY, "utf-8")) - 3) @@ -47,28 +31,41 @@ class TestBuildEmail(ZulipTestCase): mail.extra_headers["From"], "{} <{}>".format(limit_length_name, FromAddress.NOREPLY) ) - def test_build_SES_incompatible_From_field(self) -> None: + def test_build_and_send_SES_incompatible_From_address(self) -> None: hamlet = self.example_user("hamlet") + from_name = "Zulip" + # Address by itself is > 320 bytes even without the name. Should trigger exception. + overly_long_address = "a" * 320 + "@zulip.com" mail = build_email( "zerver/emails/password_reset", to_emails=[hamlet], - from_name=OVERLY_LONG_NAME, - from_address=FromAddress.NOREPLY, + from_name=from_name, + from_address=overly_long_address, language="en", ) - self.assertEqual(mail.extra_headers["From"], FromAddress.NOREPLY) + self.assertEqual(mail.extra_headers["From"], overly_long_address) + self.assertTrue(len(sanitize_address(mail.extra_headers["From"], "utf-8")) > 320) - def test_build_SES_incompatible_From_field_limit(self) -> None: - hamlet = self.example_user("hamlet") - limit_length_name = "a" * (321 - len(sanitize_address(FromAddress.NOREPLY, "utf-8")) - 3) - mail = build_email( - "zerver/emails/password_reset", - to_emails=[hamlet], - from_name=limit_length_name, - from_address=FromAddress.NOREPLY, - language="en", + with mock.patch.object( + EmailBackend, "send_messages", side_effect=SMTPDataError(242, "From field too long.") + ): + with self.assertLogs(logger=logger) as info_log: + with self.assertRaises(EmailNotDeliveredException): + send_email( + "zerver/emails/password_reset", + to_emails=[hamlet], + from_name=from_name, + from_address=overly_long_address, + language="en", + ) + self.assertEqual(len(info_log.records), 2) + self.assertEqual( + info_log.output, + [ + f"INFO:{logger.name}:Sending password_reset email to {mail.to}", + f"ERROR:{logger.name}:Error sending password_reset email to {mail.to}", + ], ) - self.assertEqual(mail.extra_headers["From"], FromAddress.NOREPLY) class TestSendEmail(ZulipTestCase):