diff -r eb04ac3a8327 -r 3f4bdea2abbf iro/test_helpers/smtp_helper.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/test_helpers/smtp_helper.py Thu Sep 27 17:15:46 2012 +0200 @@ -0,0 +1,49 @@ +# Copyright (c) 2012 netzguerilla.net +# +# This file is part of Iro. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# #Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +""" +A helper class which allows test code to intercept and store sent email. +(from: http://lakin.weckers.net/thoughts/twisted/part1/threaded/) +""" +import smtpd +import asyncore + +class TestSMTPServer(smtpd.SMTPServer): + """ + An SMTP Server used to allow integration tests which ensure email is sent. + """ + + def __init__(self, localaddr): + self.rcvd = [] + smtpd.SMTPServer.__init__(self, localaddr, None) + + def start(self): + import threading + self.poller = threading.Thread(target=asyncore.loop, + kwargs={'timeout':0.1, 'use_poll':True}) + self.poller.start() + + def process_message(self, peer, mailfrom, rcpttos, data): + self.rcvd.append((mailfrom, rcpttos, data)) + + def close(self): + smtpd.SMTPServer.close(self) + self.poller.join()