iro/tests/offer_integrated.py
branchdevel
changeset 231 3929338fd17f
parent 218 91f87ad13540
child 236 63662db5ff25
equal deleted inserted replaced
230:448dd8d36839 231:3929338fd17f
       
     1 from twisted.internet.defer import inlineCallbacks
       
     2 
       
     3 from datetime import datetime
       
     4 from decimal import Decimal 
       
     5 from mock import patch, Mock
       
     6 
       
     7 from iro.model.job import exJobs
       
     8 from iro.model.pool import data
       
     9 from iro.model.schema import User, Offer as DBOffer, Userright
       
    10 from iro.model.message import SMS, Mail
       
    11 from iro.model import offer
       
    12 
       
    13 from iro.controller.task import Task, taskPool
       
    14 from iro.telnumber import Telnumber
       
    15 
       
    16 from iro.offer import Smstrade, SMTP, Offer
       
    17 from iro.offer.smstrade import SmstradeException, StatusCode
       
    18 
       
    19 from ..test_helpers.dbtestcase import DBTestCase
       
    20 
       
    21 class DummyPool():
       
    22     def run(self, f,*a,**k):
       
    23         return f(*a,**k)
       
    24 
       
    25 def run( f,*a,**k):
       
    26     return f(*a,**k)
       
    27 
       
    28 from twisted.python import log
       
    29 
       
    30 class DummyObserver(object):
       
    31     def __init__(self):
       
    32         self.e=[]    
       
    33 
       
    34     def start(self):
       
    35         log.addObserver(self.emit)
       
    36 
       
    37     def stop(self):
       
    38         log.removeObserver(self.emit)
       
    39     
       
    40     def emit(self, eventDict):
       
    41         self.e.append(eventDict)
       
    42 
       
    43 
       
    44 
       
    45 class IntegratedOfferTests(DBTestCase):
       
    46     def setUp(self):
       
    47         DBTestCase.setUp(self)
       
    48         self.pool = data.pool
       
    49         data.pool = DummyPool()
       
    50         
       
    51         self.taskPool = taskPool.run
       
    52         taskPool.run = run 
       
    53 
       
    54         self.log = DummyObserver()
       
    55         self.log.start()
       
    56 
       
    57     def tearDown(self):
       
    58         self.log.stop()
       
    59         exJobs.clear()
       
    60         data.pool = self.pool
       
    61         self.pool = None
       
    62         taskPool.run = self.taskPool
       
    63         self.taskPool = None
       
    64         DBTestCase.tearDown(self)
       
    65 
       
    66 
       
    67     @patch("iro.model.job.datetime")
       
    68     @patch("urllib.urlopen")
       
    69     @inlineCallbacks
       
    70     def testSmstrade(self, p_u, p_dt):
       
    71         f = Mock()
       
    72         f.readlines.return_value = ["100","12345678","0.055","1"]
       
    73         p_u.return_value = f
       
    74 
       
    75         p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5)
       
    76 
       
    77         with self.session() as session:
       
    78             u = User(name='test',apikey='abcdef123456789')
       
    79             session.add(u)
       
    80             o=DBOffer(name="s", provider="bla", route="basic", typ="sms")
       
    81             u.rights.append(Userright(o))
       
    82 
       
    83         
       
    84         offer.providers["bla"] = Smstrade("bla")
       
    85         offer.providers["bla"].key = "XXXXXX"
       
    86         offer.offers["s"] = Offer("s",offer.providers["bla"],"basic","sms")
       
    87 
       
    88         j = yield exJobs.create(u,[Telnumber("0123456789")],SMS("bla"),['s'],'tesched')
       
    89         t = Task(Telnumber("0123456789"),j)
       
    90         yield t.start()
       
    91 
       
    92         self.assertEqual(self.log.e[0]['message'], ("Job(%s) to '0049123456789' ended sucecessfully via bla:basic."%j.dbjob,))
       
    93         
       
    94         with self.session() as session:
       
    95             u = session.merge(u)
       
    96             o = session.merge(o)
       
    97             job = u.job(j.dbjob)
       
    98             self.assertEqual(job.status,"sended")
       
    99             self.assertEqual(job.info,"tesched")
       
   100             self.assertEqual(len(job.messages),1)
       
   101             
       
   102             msg = job.messages[0]
       
   103             self.assertEqual(msg.price,Decimal('0.0550'))
       
   104             self.assertEqual(msg.isBilled,False)
       
   105             self.assertEqual(msg.recipient,str(Telnumber('123456789')))
       
   106             self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5))
       
   107             self.assertEqual(msg.offer,o)
       
   108             self.assertEqual(msg.exID,"12345678")
       
   109             self.assertEqual(msg.count,1)
       
   110 
       
   111 
       
   112     @patch("urllib.urlopen")
       
   113     @inlineCallbacks
       
   114     def testSmstradeException(self, mock_urlopen):
       
   115         f = Mock()
       
   116         f.readlines.return_value = ["703"]
       
   117         mock_urlopen.return_value = f
       
   118 
       
   119         with self.session() as session:
       
   120             u = User(name='test',apikey='abcdef123456789')
       
   121             session.add(u)
       
   122             o=DBOffer(name="s", provider="bla", route="basic", typ="sms")
       
   123             u.rights.append(Userright(o)) 
       
   124 
       
   125         offer.providers["bla"] = Smstrade("bla")
       
   126         offer.providers["bla"].key = "XXXXXX"
       
   127         offer.offers["s"] = Offer("s",offer.providers["bla"],"basic","sms")
       
   128 
       
   129         j = yield exJobs.create(u,[Telnumber("0123456789")],SMS("bla"),['s'],'tesched')
       
   130         t = Task(Telnumber("0123456789"),j)
       
   131         yield t.start()
       
   132 
       
   133         errors = self.flushLoggedErrors(SmstradeException)
       
   134         self.assertEqual(len(errors), 1)
       
   135         self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to '0049123456789' failed."%j.dbjob)
       
   136         
       
   137         self.assertEqual(t.error, True)
       
   138         self.assertEqual(str(t.status.value),str(SmstradeException(StatusCode(703))))
       
   139         
       
   140         with self.session() as session:
       
   141             u = session.merge(u)
       
   142             o = session.merge(o)
       
   143             job = u.job(j.dbjob)
       
   144             self.assertEqual(job.status,"error")
       
   145             self.assertEqual(len(job.messages),0)
       
   146 
       
   147     @patch("smtplib.SMTP")
       
   148     @inlineCallbacks
       
   149     def testSmtp(self, p_s ):
       
   150         with self.session() as session:
       
   151             u = User(name='test',apikey='abcdef123456789')
       
   152             session.add(u)
       
   153             o=DBOffer(name="s", provider="bla", route=None, typ="mail")
       
   154             u.rights.append(Userright(o)) 
       
   155 
       
   156         offer.providers["bla"] = SMTP("bla")
       
   157         offer.providers["bla"].SSL = False
       
   158         offer.providers["bla"].TLS = False
       
   159         offer.providers["bla"].host = "localhost"
       
   160         offer.providers["bla"].port = 12345
       
   161         offer.providers["bla"].user = ""
       
   162         offer.providers["bla"].send_from = "frm@test.de"
       
   163         offer.offers["s"] = Offer("s",offer.providers["bla"],None,"mail")
       
   164 
       
   165         j = yield exJobs.create(u,["t@test.de"],Mail("bla",'msg',None),['s'],'tesched')
       
   166         t = Task("t@test.de",j)
       
   167         yield t.start()
       
   168         
       
   169         self.assertEqual(self.log.e[0]['message'], ("Job(%s) to 't@test.de' ended sucecessfully via bla:None."%j.dbjob,))
       
   170         
       
   171         with self.session() as session:
       
   172             u = session.merge(u)
       
   173             o = session.merge(o)
       
   174             job = u.job(j.dbjob)
       
   175             self.assertEqual(job.status,"sended")
       
   176             self.assertEqual(job.info,"tesched")
       
   177             self.assertEqual(len(job.messages),0)
       
   178     
       
   179     @patch("smtplib.SMTP")
       
   180     @inlineCallbacks
       
   181     def testSmtpException(self, p_s):
       
   182         p_s.side_effect = IOError(111,"Connection refused")
       
   183         with self.session() as session:
       
   184             u = User(name='test',apikey='abcdef123456789')
       
   185             session.add(u)
       
   186             o=DBOffer(name="s", provider="bla", route=None, typ="mail")
       
   187             u.rights.append(Userright(o)) 
       
   188 
       
   189         offer.providers["bla"] = SMTP("bla")
       
   190         offer.providers["bla"].SSL = False
       
   191         offer.providers["bla"].TLS = False
       
   192         offer.providers["bla"].host = "localhost"
       
   193         offer.providers["bla"].port = 12345
       
   194         offer.providers["bla"].user = ""
       
   195         offer.providers["bla"].send_from = "frm@test.de"
       
   196         offer.offers["s"] = Offer("s",offer.providers["bla"],None,"mail")
       
   197 
       
   198         j = yield exJobs.create(u,["t@test.de"],Mail("bla",'msg',None),['s'],'tesched')
       
   199         t = Task("t@test.de",j)
       
   200         yield t.start()
       
   201 
       
   202         errors = self.flushLoggedErrors(IOError)
       
   203         self.assertEqual(len(errors), 1)
       
   204         self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to 't@test.de' failed."%j.dbjob
       
   205 )
       
   206         self.assertEqual(t.error, True)
       
   207         self.assertEqual(str(t.status.value),str(IOError(111,"Connection refused")))
       
   208 
       
   209         with self.session() as session:
       
   210             u = session.merge(u)
       
   211             o = session.merge(o)
       
   212             job = u.job(j.dbjob)
       
   213             self.assertEqual(job.status,"error")
       
   214             self.assertEqual(len(job.messages),0)
       
   215