2018-10-16 20:59:34 -04:00
|
|
|
# -*- coding: utf-8 -*-
|
2017-01-13 22:30:17 -05:00
|
|
|
"""Unit tests for email service in Superset"""
|
2017-11-07 23:23:40 -05:00
|
|
|
from email.mime.application import MIMEApplication
|
2018-12-11 01:29:29 -05:00
|
|
|
from email.mime.image import MIMEImage
|
2017-11-07 23:23:40 -05:00
|
|
|
from email.mime.multipart import MIMEMultipart
|
2017-01-13 22:30:17 -05:00
|
|
|
import logging
|
|
|
|
import tempfile
|
|
|
|
import unittest
|
|
|
|
|
2017-11-07 23:23:40 -05:00
|
|
|
import mock
|
2017-01-13 22:30:17 -05:00
|
|
|
|
2018-10-16 20:59:34 -04:00
|
|
|
from superset import app
|
|
|
|
from superset.utils import core as utils
|
2018-12-11 01:29:29 -05:00
|
|
|
from .utils import read_fixture
|
2017-01-13 22:30:17 -05:00
|
|
|
|
|
|
|
send_email_test = mock.Mock()
|
|
|
|
|
|
|
|
|
|
|
|
class EmailSmtpTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
|
|
app.config['smtp_ssl'] = False
|
|
|
|
|
2018-10-16 20:59:34 -04:00
|
|
|
@mock.patch('superset.utils.core.send_MIME_email')
|
2017-01-13 22:30:17 -05:00
|
|
|
def test_send_smtp(self, mock_send_mime):
|
|
|
|
attachment = tempfile.NamedTemporaryFile()
|
|
|
|
attachment.write(b'attachment')
|
|
|
|
attachment.seek(0)
|
|
|
|
utils.send_email_smtp(
|
|
|
|
'to', 'subject', 'content', app.config, files=[attachment.name])
|
|
|
|
assert mock_send_mime.called
|
|
|
|
call_args = mock_send_mime.call_args[0]
|
|
|
|
logging.debug(call_args)
|
|
|
|
assert call_args[0] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert call_args[1] == ['to']
|
|
|
|
msg = call_args[2]
|
|
|
|
assert msg['Subject'] == 'subject'
|
|
|
|
assert msg['From'] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert len(msg.get_payload()) == 2
|
|
|
|
mimeapp = MIMEApplication('attachment')
|
|
|
|
assert msg.get_payload()[-1].get_payload() == mimeapp.get_payload()
|
|
|
|
|
2018-12-11 01:29:29 -05:00
|
|
|
@mock.patch('superset.utils.core.send_MIME_email')
|
|
|
|
def test_send_smtp_data(self, mock_send_mime):
|
|
|
|
utils.send_email_smtp(
|
|
|
|
'to', 'subject', 'content', app.config, data={'1.txt': b'data'})
|
|
|
|
assert mock_send_mime.called
|
|
|
|
call_args = mock_send_mime.call_args[0]
|
|
|
|
logging.debug(call_args)
|
|
|
|
assert call_args[0] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert call_args[1] == ['to']
|
|
|
|
msg = call_args[2]
|
|
|
|
assert msg['Subject'] == 'subject'
|
|
|
|
assert msg['From'] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert len(msg.get_payload()) == 2
|
|
|
|
mimeapp = MIMEApplication('data')
|
|
|
|
assert msg.get_payload()[-1].get_payload() == mimeapp.get_payload()
|
|
|
|
|
|
|
|
@mock.patch('superset.utils.core.send_MIME_email')
|
|
|
|
def test_send_smtp_inline_images(self, mock_send_mime):
|
|
|
|
image = read_fixture('sample.png')
|
|
|
|
utils.send_email_smtp(
|
|
|
|
'to', 'subject', 'content', app.config, images=dict(blah=image))
|
|
|
|
assert mock_send_mime.called
|
|
|
|
call_args = mock_send_mime.call_args[0]
|
|
|
|
logging.debug(call_args)
|
|
|
|
assert call_args[0] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert call_args[1] == ['to']
|
|
|
|
msg = call_args[2]
|
|
|
|
assert msg['Subject'] == 'subject'
|
|
|
|
assert msg['From'] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert len(msg.get_payload()) == 2
|
|
|
|
mimeapp = MIMEImage(image)
|
|
|
|
assert msg.get_payload()[-1].get_payload() == mimeapp.get_payload()
|
|
|
|
|
2018-10-16 20:59:34 -04:00
|
|
|
@mock.patch('superset.utils.core.send_MIME_email')
|
2017-01-13 22:30:17 -05:00
|
|
|
def test_send_bcc_smtp(self, mock_send_mime):
|
|
|
|
attachment = tempfile.NamedTemporaryFile()
|
|
|
|
attachment.write(b'attachment')
|
|
|
|
attachment.seek(0)
|
|
|
|
utils.send_email_smtp(
|
|
|
|
'to', 'subject', 'content', app.config, files=[attachment.name],
|
|
|
|
cc='cc', bcc='bcc')
|
|
|
|
assert mock_send_mime.called
|
|
|
|
call_args = mock_send_mime.call_args[0]
|
|
|
|
assert call_args[0] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert call_args[1] == ['to', 'cc', 'bcc']
|
|
|
|
msg = call_args[2]
|
|
|
|
assert msg['Subject'] == 'subject'
|
|
|
|
assert msg['From'] == app.config.get('SMTP_MAIL_FROM')
|
|
|
|
assert len(msg.get_payload()) == 2
|
|
|
|
mimeapp = MIMEApplication('attachment')
|
|
|
|
assert msg.get_payload()[-1].get_payload() == mimeapp.get_payload()
|
|
|
|
|
|
|
|
@mock.patch('smtplib.SMTP_SSL')
|
|
|
|
@mock.patch('smtplib.SMTP')
|
|
|
|
def test_send_mime(self, mock_smtp, mock_smtp_ssl):
|
|
|
|
mock_smtp.return_value = mock.Mock()
|
|
|
|
mock_smtp_ssl.return_value = mock.Mock()
|
|
|
|
msg = MIMEMultipart()
|
|
|
|
utils.send_MIME_email('from', 'to', msg, app.config, dryrun=False)
|
|
|
|
mock_smtp.assert_called_with(
|
|
|
|
app.config.get('SMTP_HOST'),
|
|
|
|
app.config.get('SMTP_PORT'),
|
|
|
|
)
|
|
|
|
assert mock_smtp.return_value.starttls.called
|
|
|
|
mock_smtp.return_value.login.assert_called_with(
|
|
|
|
app.config.get('SMTP_USER'),
|
|
|
|
app.config.get('SMTP_PASSWORD'),
|
|
|
|
)
|
|
|
|
mock_smtp.return_value.sendmail.assert_called_with(
|
|
|
|
'from', 'to', msg.as_string())
|
|
|
|
assert mock_smtp.return_value.quit.called
|
|
|
|
|
|
|
|
@mock.patch('smtplib.SMTP_SSL')
|
|
|
|
@mock.patch('smtplib.SMTP')
|
|
|
|
def test_send_mime_ssl(self, mock_smtp, mock_smtp_ssl):
|
|
|
|
app.config['SMTP_SSL'] = True
|
|
|
|
mock_smtp.return_value = mock.Mock()
|
|
|
|
mock_smtp_ssl.return_value = mock.Mock()
|
|
|
|
utils.send_MIME_email(
|
|
|
|
'from', 'to', MIMEMultipart(), app.config, dryrun=False)
|
|
|
|
assert not mock_smtp.called
|
|
|
|
mock_smtp_ssl.assert_called_with(
|
2017-11-10 15:06:22 -05:00
|
|
|
app.config.get('SMTP_HOST'),
|
|
|
|
app.config.get('SMTP_PORT'),
|
2017-01-13 22:30:17 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
@mock.patch('smtplib.SMTP_SSL')
|
|
|
|
@mock.patch('smtplib.SMTP')
|
|
|
|
def test_send_mime_noauth(self, mock_smtp, mock_smtp_ssl):
|
|
|
|
app.config['SMTP_USER'] = None
|
|
|
|
app.config['SMTP_PASSWORD'] = None
|
|
|
|
mock_smtp.return_value = mock.Mock()
|
|
|
|
mock_smtp_ssl.return_value = mock.Mock()
|
|
|
|
utils.send_MIME_email(
|
|
|
|
'from', 'to', MIMEMultipart(), app.config, dryrun=False)
|
|
|
|
assert not mock_smtp_ssl.called
|
|
|
|
mock_smtp.assert_called_with(
|
2017-11-10 15:06:22 -05:00
|
|
|
app.config.get('SMTP_HOST'),
|
|
|
|
app.config.get('SMTP_PORT'),
|
2017-01-13 22:30:17 -05:00
|
|
|
)
|
|
|
|
assert not mock_smtp.login.called
|
|
|
|
|
|
|
|
@mock.patch('smtplib.SMTP_SSL')
|
|
|
|
@mock.patch('smtplib.SMTP')
|
|
|
|
def test_send_mime_dryrun(self, mock_smtp, mock_smtp_ssl):
|
|
|
|
utils.send_MIME_email(
|
|
|
|
'from', 'to', MIMEMultipart(), app.config, dryrun=True)
|
|
|
|
assert not mock_smtp.called
|
|
|
|
assert not mock_smtp_ssl.called
|
|
|
|
|
2017-11-10 20:52:34 -05:00
|
|
|
|
2017-01-13 22:30:17 -05:00
|
|
|
if __name__ == '__main__':
|
2017-11-07 23:23:40 -05:00
|
|
|
unittest.main()
|