From 4311820494ddf682d4122df0b02f55af7afdeeb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Sun, 20 Mar 2016 12:33:38 +0000 Subject: [PATCH] tests for basic Mail functionality --- gluon/tests/test_tools.py | 144 +++++++++++++++++++++++++++++++++++++- 1 file changed, 142 insertions(+), 2 deletions(-) diff --git a/gluon/tests/test_tools.py b/gluon/tests/test_tools.py index 3554af1a..8ae91fe8 100644 --- a/gluon/tests/test_tools.py +++ b/gluon/tests/test_tools.py @@ -6,6 +6,7 @@ """ import os import sys +import smtplib if sys.version < "2.7": import unittest2 as unittest else: @@ -19,7 +20,7 @@ DEFAULT_URI = os.getenv('DB', 'sqlite:memory') from gluon.dal import DAL, Field from pydal.objects import Table -from tools import Auth +from tools import Auth, Mail from gluon.globals import Request, Response, Session from storage import Storage from languages import translator @@ -29,7 +30,7 @@ python_version = sys.version[:3] IS_IMAP = "imap" in DEFAULT_URI @unittest.skipIf(IS_IMAP, "TODO: Imap raises 'Connection refused'") -class testAuth(unittest.TestCase): +class TestAuth(unittest.TestCase): def testRun(self): # setup @@ -79,5 +80,144 @@ class testAuth(unittest.TestCase): pass return + +class TestMail(unittest.TestCase): + """ + Test the Mail class. + """ + + class Message(object): + def __init__(self,sender, to, payload): + self.sender = sender + self.to = to + self.payload = payload + + class DummySMTP(object): + """ + Dummy smtp server + + NOTE: Test methods should take care of always leaving inbox and users empty when they finish. + """ + inbox = [] + users = {} + + def __init__(self,address, port, **kwargs): + self.address=address + self.port = port + self.has_quit = False + self.tls = False + + def login(self,username,password): + if username not in self.users or self.users[username] != password: + raise smtplib.SMTPAuthenticationError + self.username=username + self.password=password + + def sendmail(self,from_address,to_address,fullmessage): + self.inbox.append(TestMail.Message(from_address,to_address,fullmessage)) + return [] + + def quit(self): + self.has_quit=True + + def ehlo(self, hostname=None): + pass + + def starttls(self): + self.tls = True + + + def setUp(self): + self.original_SMTP = smtplib.SMTP + self.original_SMTP_SSL = smtplib.SMTP_SSL + smtplib.SMTP = TestMail.DummySMTP + smtplib.SMTP_SSL = TestMail.DummySMTP + + def tearDown(self): + smtplib.SMTP = self.original_SMTP + smtplib.SMTP_SSL = self.original_SMTP_SSL + + def test_hello_world(self): + mail = Mail() + mail.settings.server = 'smtp.example.com:25' + mail.settings.sender = 'you@example.com' + self.assertTrue(mail.send(to=['somebody@example.com'], + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) + message = TestMail.DummySMTP.inbox.pop() + self.assertEqual(message.sender, mail.settings.sender) + self.assertEqual(message.to, ['somebody@example.com']) + header = "To: somebody@example.com\nReply-To: us@example.com\nSubject: hello\n" + self.assertTrue(header in message.payload) + self.assertTrue(message.payload.endswith('world')) + + def test_failed_login(self): + mail = Mail() + mail.settings.server = 'smtp.example.com:25' + mail.settings.sender = 'you@example.com' + mail.settings.login = 'username:password' + self.assertFalse(mail.send(to=['somebody@example.com'], + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) + + def test_login(self): + TestMail.DummySMTP.users['username'] = 'password' + mail = Mail() + mail.settings.server = 'smtp.example.com:25' + mail.settings.sender = 'you@example.com' + mail.settings.login = 'username:password' + self.assertTrue(mail.send(to=['somebody@example.com'], + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) + del TestMail.DummySMTP.users['username'] + TestMail.DummySMTP.inbox.pop() + + def test_html(self): + mail = Mail() + mail.settings.server = 'smtp.example.com:25' + mail.settings.sender = 'you@example.com' + self.assertTrue(mail.send(to=['somebody@example.com'], + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='')) + message = TestMail.DummySMTP.inbox.pop() + self.assertTrue('Content-Type: text/html' in message.payload) + + def test_ssl(self): + mail = Mail() + mail.settings.server = 'smtp.example.com:25' + mail.settings.sender = 'you@example.com' + mail.settings.ssl = True + self.assertTrue(mail.send(to=['somebody@example.com'], + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) + TestMail.DummySMTP.inbox.pop() + + def test_tls(self): + mail = Mail() + mail.settings.server = 'smtp.example.com:25' + mail.settings.sender = 'you@example.com' + mail.settings.tls = True + self.assertTrue(mail.send(to=['somebody@example.com'], + subject='hello', + # If reply_to is omitted, then mail.settings.sender is used + reply_to='us@example.com', + message='world')) + TestMail.DummySMTP.inbox.pop() + + + + + + if __name__ == '__main__': unittest.main()