iro/tests/offer_integrated.py
branchdevel
changeset 231 3929338fd17f
parent 218 91f87ad13540
child 236 63662db5ff25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/tests/offer_integrated.py	Sun Mar 18 14:06:27 2012 +0100
@@ -0,0 +1,215 @@
+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)
+