tests/offer_integrated.py
author Sandro Knauß <knauss@netzguerilla.net>
Mon, 05 Mar 2012 23:52:29 +0100
branchdevel
changeset 218 91f87ad13540
parent 216 ab8e2f26718e
permissions -rw-r--r--
integration tests for smtp

from twisted.internet.defer import inlineCallbacks

from datetime import datetime
from decimal import Decimal 
from mock import patch, Mock

from iro.model.job import exJobs
from iro.model.pool import data
from iro.model.schema import User, Offer as DBOffer, Userright
from iro.model.message import SMS, Mail
from iro.model import offer

from iro.controller.task import Task, taskPool
from iro.telnumber import Telnumber

from iro.offer import Smstrade, SMTP, Offer
from iro.offer.smstrade import SmstradeException, StatusCode

from .dbtestcase import DBTestCase

class DummyPool():
    def run(self, f,*a,**k):
        return f(*a,**k)

def run( f,*a,**k):
    return f(*a,**k)

from twisted.python import log

class DummyObserver(object):
    def __init__(self):
        self.e=[]    

    def start(self):
        log.addObserver(self.emit)

    def stop(self):
        log.removeObserver(self.emit)
    
    def emit(self, eventDict):
        self.e.append(eventDict)



class IntegratedOfferTests(DBTestCase):
    def setUp(self):
        DBTestCase.setUp(self)
        self.pool = data.pool
        data.pool = DummyPool()
        
        self.taskPool = taskPool.run
        taskPool.run = run 

        self.log = DummyObserver()
        self.log.start()

    def tearDown(self):
        self.log.stop()
        exJobs.clear()
        data.pool = self.pool
        self.pool = None
        taskPool.run = self.taskPool
        self.taskPool = None
        DBTestCase.tearDown(self)


    @patch("iro.model.job.datetime")
    @patch("urllib.urlopen")
    @inlineCallbacks
    def testSmstrade(self, p_u, p_dt):
        f = Mock()
        f.readlines.return_value = ["100","12345678","0.055","1"]
        p_u.return_value = f

        p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5)

        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)
            o=DBOffer(name="s", provider="bla", route="basic", typ="sms")
            u.rights.append(Userright(o))

        
        offer.providers["bla"] = Smstrade("bla")
        offer.providers["bla"].key = "XXXXXX"
        offer.offers["s"] = Offer("s",offer.providers["bla"],"basic","sms")

        j = yield exJobs.create(u,[Telnumber("0123456789")],SMS("bla"),['s'],'tesched')
        t = Task(Telnumber("0123456789"),j)
        yield t.start()

        self.assertEqual(self.log.e[0]['message'], ("Job(%s) to '0049123456789' ended sucecessfully via bla:basic."%j.dbjob,))
        
        with self.session() as session:
            u = session.merge(u)
            o = session.merge(o)
            job = u.job(j.dbjob)
            self.assertEqual(job.status,"sended")
            self.assertEqual(job.info,"tesched")
            self.assertEqual(len(job.messages),1)
            
            msg = job.messages[0]
            self.assertEqual(msg.price,Decimal('0.0550'))
            self.assertEqual(msg.isBilled,False)
            self.assertEqual(msg.recipient,str(Telnumber('123456789')))
            self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5))
            self.assertEqual(msg.offer,o)
            self.assertEqual(msg.exID,"12345678")
            self.assertEqual(msg.count,1)


    @patch("urllib.urlopen")
    @inlineCallbacks
    def testSmstradeException(self, mock_urlopen):
        f = Mock()
        f.readlines.return_value = ["703"]
        mock_urlopen.return_value = f

        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)
            o=DBOffer(name="s", provider="bla", route="basic", typ="sms")
            u.rights.append(Userright(o)) 

        offer.providers["bla"] = Smstrade("bla")
        offer.providers["bla"].key = "XXXXXX"
        offer.offers["s"] = Offer("s",offer.providers["bla"],"basic","sms")

        j = yield exJobs.create(u,[Telnumber("0123456789")],SMS("bla"),['s'],'tesched')
        t = Task(Telnumber("0123456789"),j)
        yield t.start()

        errors = self.flushLoggedErrors(SmstradeException)
        self.assertEqual(len(errors), 1)
        self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to '0049123456789' failed."%j.dbjob)
        
        self.assertEqual(t.error, True)
        self.assertEqual(str(t.status.value),str(SmstradeException(StatusCode(703))))
        
        with self.session() as session:
            u = session.merge(u)
            o = session.merge(o)
            job = u.job(j.dbjob)
            self.assertEqual(job.status,"error")
            self.assertEqual(len(job.messages),0)

    @patch("smtplib.SMTP")
    @inlineCallbacks
    def testSmtp(self, p_s ):
        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)
            o=DBOffer(name="s", provider="bla", route=None, typ="mail")
            u.rights.append(Userright(o)) 

        offer.providers["bla"] = SMTP("bla")
        offer.providers["bla"].SSL = False
        offer.providers["bla"].TLS = False
        offer.providers["bla"].host = "localhost"
        offer.providers["bla"].port = 12345
        offer.providers["bla"].user = ""
        offer.providers["bla"].send_from = "frm@test.de"
        offer.offers["s"] = Offer("s",offer.providers["bla"],None,"mail")

        j = yield exJobs.create(u,["t@test.de"],Mail("bla",'msg',None),['s'],'tesched')
        t = Task("t@test.de",j)
        yield t.start()
        
        self.assertEqual(self.log.e[0]['message'], ("Job(%s) to 't@test.de' ended sucecessfully via bla:None."%j.dbjob,))
        
        with self.session() as session:
            u = session.merge(u)
            o = session.merge(o)
            job = u.job(j.dbjob)
            self.assertEqual(job.status,"sended")
            self.assertEqual(job.info,"tesched")
            self.assertEqual(len(job.messages),0)
    
    @patch("smtplib.SMTP")
    @inlineCallbacks
    def testSmtpException(self, p_s):
        p_s.side_effect = IOError(111,"Connection refused")
        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)
            o=DBOffer(name="s", provider="bla", route=None, typ="mail")
            u.rights.append(Userright(o)) 

        offer.providers["bla"] = SMTP("bla")
        offer.providers["bla"].SSL = False
        offer.providers["bla"].TLS = False
        offer.providers["bla"].host = "localhost"
        offer.providers["bla"].port = 12345
        offer.providers["bla"].user = ""
        offer.providers["bla"].send_from = "frm@test.de"
        offer.offers["s"] = Offer("s",offer.providers["bla"],None,"mail")

        j = yield exJobs.create(u,["t@test.de"],Mail("bla",'msg',None),['s'],'tesched')
        t = Task("t@test.de",j)
        yield t.start()

        errors = self.flushLoggedErrors(IOError)
        self.assertEqual(len(errors), 1)
        self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to 't@test.de' failed."%j.dbjob
)
        self.assertEqual(t.error, True)
        self.assertEqual(str(t.status.value),str(IOError(111,"Connection refused")))

        with self.session() as session:
            u = session.merge(u)
            o = session.merge(o)
            job = u.job(j.dbjob)
            self.assertEqual(job.status,"error")
            self.assertEqual(len(job.messages),0)