diff --git a/zerver/tests/test_email_mirror.py b/zerver/tests/test_email_mirror.py index ead470e067..bedb28003b 100644 --- a/zerver/tests/test_email_mirror.py +++ b/zerver/tests/test_email_mirror.py @@ -17,6 +17,7 @@ from zerver.models import ( get_display_recipient, get_realm, get_stream, + get_system_bot, Recipient, ) @@ -307,6 +308,65 @@ class TestStreamEmailMessagesSuccess(ZulipTestCase): self.assertEqual(get_display_recipient(message.recipient), stream.name) self.assertEqual(message.topic_name(), incoming_valid_message['Subject']) +class TestEmailMirrorMessagesWithAttachments(ZulipTestCase): + def test_message_with_valid_attachment(self) -> None: + user_profile = self.example_user('hamlet') + self.login(user_profile.email) + self.subscribe(user_profile, "Denmark") + stream = get_stream("Denmark", user_profile.realm) + stream_to_address = encode_email_address(stream) + + incoming_valid_message = MIMEMultipart() + text_msg = MIMEText("Test body") + incoming_valid_message.attach(text_msg) + with open(os.path.join(settings.DEPLOY_ROOT, "static/images/default-avatar.png"), 'rb') as f: + image_bytes = f.read() + + attachment_msg = MIMEImage(image_bytes) + attachment_msg.add_header('Content-Disposition', 'attachment', filename="image.png") + incoming_valid_message.attach(attachment_msg) + + incoming_valid_message['Subject'] = 'TestStreamEmailMessages Subject' + incoming_valid_message['From'] = self.example_email('hamlet') + incoming_valid_message['To'] = stream_to_address + incoming_valid_message['Reply-to'] = self.example_email('othello') + + with mock.patch('zerver.lib.email_mirror.upload_message_file', + return_value='https://test_url') as upload_message_file: + process_message(incoming_valid_message) + upload_message_file.assert_called_with('image.png', len(image_bytes), + 'image/png', image_bytes, + get_system_bot(settings.EMAIL_GATEWAY_BOT), + target_realm=user_profile.realm) + + message = most_recent_message(user_profile) + self.assertEqual(message.content, "Test body[image.png](https://test_url)") + + def test_message_with_invalid_attachment(self) -> None: + user_profile = self.example_user('hamlet') + self.login(user_profile.email) + self.subscribe(user_profile, "Denmark") + stream = get_stream("Denmark", user_profile.realm) + stream_to_address = encode_email_address(stream) + + incoming_valid_message = MIMEMultipart() + text_msg = MIMEText("Test body") + incoming_valid_message.attach(text_msg) + # Create an invalid attachment: + attachment_msg = MIMEMultipart() + attachment_msg.add_header('Content-Disposition', 'attachment', filename="some_attachment") + incoming_valid_message.attach(attachment_msg) + + incoming_valid_message['Subject'] = 'TestStreamEmailMessages Subject' + incoming_valid_message['From'] = self.example_email('hamlet') + incoming_valid_message['To'] = stream_to_address + incoming_valid_message['Reply-to'] = self.example_email('othello') + + with mock.patch('zerver.lib.email_mirror.logger.warning') as mock_warn: + process_message(incoming_valid_message) + mock_warn.assert_called_with("Payload is not bytes (invalid attachment %s in message from %s)." % + ('some_attachment', self.example_email('hamlet'))) + class TestStreamEmailMessagesEmptyBody(ZulipTestCase): def test_receive_stream_email_messages_empty_body(self) -> None: