aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mediagoblin/tests/test_util.py29
-rw-r--r--mediagoblin/tools/mail.py32
2 files changed, 57 insertions, 4 deletions
diff --git a/mediagoblin/tests/test_util.py b/mediagoblin/tests/test_util.py
index 8193233f..02976405 100644
--- a/mediagoblin/tests/test_util.py
+++ b/mediagoblin/tests/test_util.py
@@ -19,6 +19,7 @@ try:
except ImportError:
import unittest.mock as mock
import email
+import socket
import pytest
import smtplib
import pkg_resources
@@ -26,6 +27,7 @@ import pkg_resources
import six
from mediagoblin.tests.tools import get_app
+from mediagoblin import mg_globals
from mediagoblin.tools import common, url, translate, mail, text, testing
testing._activate_testing()
@@ -181,3 +183,30 @@ def test_html_cleaner():
'<p><a href="javascript:nasty_surprise">innocent link!</a></p>')
assert result == (
'<p><a href="">innocent link!</a></p>')
+
+
+class TestMail(object):
+ """ Test mediagoblin's mail tool """
+ def test_no_mail_server(self):
+ """ Tests that no smtp server is available """
+ with pytest.raises(mail.NoSMTPServerError), mock.patch("smtplib.SMTP") as smtp_mock:
+ smtp_mock.side_effect = socket.error
+ mg_globals.app_config = {
+ "email_debug_mode": False,
+ "email_smtp_use_ssl": False,
+ "email_smtp_host": "127.0.0.1",
+ "email_smtp_port": 0}
+ common.TESTS_ENABLED = False
+ mail.send_email("", "", "", "")
+
+ def test_no_smtp_host(self):
+ """ Empty email_smtp_host """
+ with pytest.raises(mail.NoSMTPServerError), mock.patch("smtplib.SMTP") as smtp_mock:
+ smtp_mock.return_value.connect.side_effect = socket.error
+ mg_globals.app_config = {
+ "email_debug_mode": False,
+ "email_smtp_use_ssl": False,
+ "email_smtp_host": "",
+ "email_smtp_port": 0}
+ common.TESTS_ENABLED = False
+ mail.send_email("", "", "", "")
diff --git a/mediagoblin/tools/mail.py b/mediagoblin/tools/mail.py
index c11e392b..3dc180d8 100644
--- a/mediagoblin/tools/mail.py
+++ b/mediagoblin/tools/mail.py
@@ -16,6 +16,8 @@
from __future__ import print_function, unicode_literals
+import socket
+import logging
import six
import smtplib
import sys
@@ -54,6 +56,14 @@ EMAIL_TEST_INBOX = []
EMAIL_TEST_MBOX_INBOX = []
+class MailError(Exception):
+ """ General exception for mail errors """
+
+
+class NoSMTPServerError(MailError):
+ pass
+
+
class FakeMhost(object):
"""
Just a fake mail host so we can capture and test messages
@@ -101,13 +111,27 @@ def send_email(from_addr, to_addrs, subject, message_body):
else:
smtp_init = smtplib.SMTP
- mhost = smtp_init(
- mg_globals.app_config['email_smtp_host'],
- mg_globals.app_config['email_smtp_port'])
+ try:
+ mhost = smtp_init(
+ mg_globals.app_config['email_smtp_host'],
+ mg_globals.app_config['email_smtp_port'])
+ except socket.error as original_error:
+ error_message = "Couldn't contact mail server on <{}>:<{}>".format(
+ mg_globals.app_config['email_smtp_host'],
+ mg_globals.app_config['email_smtp_port'])
+ logging.debug(original_error)
+ raise NoSMTPServerError(error_message)
# SMTP.__init__ Issues SMTP.connect implicitly if host
if not mg_globals.app_config['email_smtp_host']: # e.g. host = ''
- mhost.connect() # We SMTP.connect explicitly
+ try:
+ mhost.connect() # We SMTP.connect explicitly
+ except socket.error as original_error:
+ error_message = "Couldn't contact mail server on <{}>:<{}>".format(
+ mg_globals.app_config['email_smtp_host'],
+ mg_globals.app_config['email_smtp_port'])
+ logging.debug(original_error)
+ raise NoSMTPServerError(error_message)
try:
mhost.starttls()