iro/tests/offer_integrated.py
author Sandro Knauß <knauss@netzguerilla.net>
Wed, 21 Mar 2012 17:32:14 +0100
branchdevel
changeset 236 63662db5ff25
parent 231 3929338fd17f
child 241 546316b0b09c
permissions -rw-r--r--
tests for utf-8 have to be created

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 ..test_helpers.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)
       
    def testUnicode(self):
        '''tests unicode spefiica'''
        pass
    testUnicode.todo="to implement"