tests/job.py
branchdevel
changeset 175 c29acd5fb841
parent 170 2a16943f1d05
child 186 b381eaa774ab
equal deleted inserted replaced
174:762981cada07 175:c29acd5fb841
     1 from twisted.internet import reactor
     1 from datetime import datetime
     2 from twisted.internet.defer import inlineCallbacks
     2 from decimal import Decimal
     3 
     3 from mock import patch
     4 from Queue import deque
       
     5 
       
     6 from iro.controller.task import createJob, Task
       
     7 from iro.controller.pool  import taskPool, dbPool
       
     8 
     4 
     9 from iro.model.job import exJobs, ExJob
     5 from iro.model.job import exJobs, ExJob
       
     6 from iro.model.pool import data
       
     7 from iro.model.message import SMS
    10 from iro.model.status import Status
     8 from iro.model.status import Status
    11 from iro.model.offer import offers
     9 from iro.model.schema import Job, User, Offer as DBOffer, Userright
    12 from iro.model.pool import data
       
    13 
    10 
    14 from iro.model.message import SMS, Fax, Mail
    11 from iro.controller.task import Task
    15 from iro.model.schema import Job, User, Offer as DBOffer, Userright
    12 
       
    13 from iro.offer.provider import Provider
       
    14 
    16 from iro.telnumber import Telnumber
    15 from iro.telnumber import Telnumber
    17 
       
    18 
       
    19 from iro.offer import Offer, Provider
       
    20 from iro.validate import vInteger
    16 from iro.validate import vInteger
    21 from iro.error import NoRouteForTask
       
    22 
    17 
    23 from .dbtestcase import DBTestCase
    18 from .dbtestcase import DBTestCase
    24 
    19 
    25 class DummyPool():
    20 class DummyPool():
    26     def run(self, f,*a,**k):
    21     def run(self, f,*a,**k):
    27         return f(*a,**k)
    22         return f(*a,**k)
    28 
    23 
       
    24 from twisted.python import log
    29 
    25 
    30 class exJobsTest(DBTestCase):
    26 class DummyObserver(object):
    31     '''tests for exJobs'''
    27     def __init__(self):
       
    28         self.e=[]    
    32 
    29 
       
    30     def start(self):
       
    31         log.addObserver(self.emit)
       
    32 
       
    33     def stop(self):
       
    34         log.removeObserver(self.emit)
       
    35     
       
    36     def emit(self, eventDict):
       
    37         self.e.append(eventDict)
       
    38 
       
    39 class JobTestCase(DBTestCase):
    33     def setUp(self):
    40     def setUp(self):
    34         DBTestCase.setUp(self)
    41         DBTestCase.setUp(self)
    35         self.pool = data.pool
    42         self.pool = data.pool
    36         data.pool = DummyPool()
    43         data.pool = DummyPool()
    37 
    44 
    38     def tearDown(self):
    45     def tearDown(self):
    39         exJobs.clear()
    46         exJobs.clear()
    40         data.pool = self.pool
    47         data.pool = self.pool
    41         self.pool = None
    48         self.pool = None
    42         DBTestCase.tearDown(self)
    49         DBTestCase.tearDown(self)
       
    50 
       
    51 
       
    52 class exJobsTest(JobTestCase):
       
    53     '''tests for exJobs'''
    43 
    54 
    44     def testCreate(self):
    55     def testCreate(self):
    45         with self.session() as session:
    56         with self.session() as session:
    46             u = User(name='test',apikey='abcdef123456789')
    57             u = User(name='test',apikey='abcdef123456789')
    47             session.add(u)
    58             session.add(u)
    97             self.assertEqual(u.jobs[0].extend,ejob)
   108             self.assertEqual(u.jobs[0].extend,ejob)
    98 
   109 
    99     def testUnknownExJob(self):
   110     def testUnknownExJob(self):
   100         self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890')
   111         self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890')
   101 
   112 
   102 class TestTasks(DBTestCase):
   113 
   103    
   114 class StatiTest(JobTestCase):
   104     def setUp(self):
   115     def setUp(self):
   105         DBTestCase.setUp(self)
   116         JobTestCase.setUp(self)
   106         dbPool.start(reactor)
   117         self.log = DummyObserver()
       
   118         self.log.start()
   107 
   119 
   108     def tearDown(self):
       
   109         exJobs.clear()
       
   110         offers.clear()
       
   111         dbPool.pool.stop()
       
   112         taskPool.pool.q.queue = deque()
       
   113         DBTestCase.tearDown(self)
       
   114     
       
   115     @inlineCallbacks
       
   116     def testCreateSMS(self):
       
   117         with self.session() as session:
   120         with self.session() as session:
   118             u = User(name='test',apikey='abcdef123456789')
   121             u = User(name='test',apikey='abcdef123456789')
   119             session.add(u)
   122             session.add(u)
       
   123             o=DBOffer(name="test", provider="bla", route="a", typ="sms")
       
   124             u.rights.append(Userright(o)) 
       
   125 
       
   126         self.user = u
       
   127         self.offer = o
   120         
   128         
   121         job = yield createJob(u,[Telnumber('0123325456')],SMS('sms'),[])
   129         self.provider=Provider("bla", [], {"sms":["a","b","c"]})
   122         
   130         self.job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), [])
   123         self.assertEqual(taskPool.pool.q.qsize(),1)
       
   124         
       
   125         self.assertEqual(job.tasks.keys(),[Telnumber('0123325456')])
       
   126         self.assertIsInstance(job.tasks[Telnumber('0123325456')], Task)
       
   127 
   131 
   128     @inlineCallbacks
   132     def tearDown(self):
   129     def testRun(self):
   133         self.log.stop()
   130         with self.session() as session:
   134         JobTestCase.tearDown(self)
   131             u = User(name='test',apikey='abcdef123456789')
       
   132             session.add(u)
       
   133             o=DBOffer(name="test", provider="bla", route="basic", typ="sms")
       
   134             u.rights.append(Userright(o)) 
       
   135         
       
   136         p=Provider(name="p", config={}, typs={"sms":["test",]})
       
   137         def send(typ,route,recipient,message):
       
   138             return Status(provider=p, route=route, error="Error: Test")
       
   139         p.send=send
       
   140         offers["test"] = Offer("test",provider=p, route="test", typ="sms")
       
   141 
       
   142         exjob = yield exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test'])
       
   143         
       
   144         task=Task(Telnumber('123456789'), exjob)
       
   145         ret = yield task._run()
       
   146         self.assertIsInstance(ret, Status)
       
   147         self.assertEqual(ret.provider, p)
       
   148         self.assertEqual(ret.route, "test")
       
   149         self.assertEqual(ret.status, Status.ERROR)
       
   150         self.assertEqual(ret.error, "Error: Test")
       
   151 
       
   152     @inlineCallbacks
       
   153     def testNoRoute(self):
       
   154         with self.session() as session:
       
   155             u = User(name='test',apikey='abcdef123456789')
       
   156             session.add(u)
       
   157 
       
   158         exjob = yield exJobs.create(u, [Telnumber('123456789')], SMS('test'), [])
       
   159         
       
   160         task=Task(Telnumber('123456789'), exjob)
       
   161         d = task._run()
       
   162         self.assertFailure(d, NoRouteForTask)
       
   163 
   135 
   164 
   136 
   165     #def testCreateFax(self):
   137     def testSetError(self):
   166     #    with self.session() as session:
   138         self.job.setError(Task(Telnumber('123456789'),self),Exception("muhaha"))
   167     #        u = User(name='test',apikey='abcdef123456789')
   139         errors = self.flushLoggedErrors(Exception)
   168     #        session.add(u)
   140         self.assertEqual(len(errors), 1)
   169     #    job = createJob(u,[Telnumber('0123325456')],Fax('header','fax',[]),[])
   141         self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to '0049123456789' failed."%self.job.dbjob)
       
   142         
       
   143         with self.session() as session:
       
   144             u = session.merge(self.user)
       
   145             job = u.job(self.job.dbjob)
       
   146             self.assertEqual(job.status,"error")
   170 
   147 
   171     #    self.assertEqual(taskPool.pool.q.qsize(),1)
   148     def testSetStatus(self):
       
   149         task = Task(Telnumber('123456789'),self.job)
       
   150         status = Status(self.provider,"a")
       
   151         self.job.setStatus(task, status)
       
   152         
       
   153         self.assertEqual(self.log.e[0]['message'], ("Job(%s) to '0049123456789' ended sucecessfully via bla:a."%self.job.dbjob,))
       
   154         
       
   155         with self.session() as session:
       
   156             u = session.merge(self.user)
       
   157             job = u.job(self.job.dbjob)
       
   158             self.assertEqual(job.status,"sended")
       
   159             self.assertEqual(len(job.messages),0)
   172 
   160 
   173     #def testCreateMail(self):
   161     def testMultipleRecipients(self):
   174     #    with self.session() as session:
   162         self.job.recipients.append(Telnumber("01234567890"))
   175     #        u = User(name='test',apikey='abcdef123456789')
   163         task = Task(Telnumber('123456789'),self.job)
   176     #        session.add(u)
   164         status = Status(self.provider,"a")
   177     #    job = createJob(u,[],Mail('sub','body','t@t.de'),[])
   165         self.job.setStatus(task, status)
       
   166         
       
   167         with self.session() as session:
       
   168             u = session.merge(self.user)
       
   169             job = u.job(self.job.dbjob)
       
   170             self.assertEqual(job.status,"sending")
       
   171 
       
   172 
       
   173 
       
   174     @patch("iro.model.job.datetime")
       
   175     def testCosts(self,p_dt):
       
   176         p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5)
       
   177         task = Task(Telnumber('123456789'),self.job)
       
   178         status = Status(self.provider,"a")
       
   179         status.costs = 0.055
       
   180         
       
   181         self.job.setStatus(task, status)
       
   182         
       
   183         with self.session() as session:
       
   184             u = session.merge(self.user)
       
   185             o = session.merge(self.offer)
       
   186             job = u.job(self.job.dbjob)
       
   187             self.assertEqual(job.status,"sended")
       
   188             self.assertEqual(len(job.messages),1)
       
   189             
       
   190             msg = job.messages[0]
       
   191             self.assertEqual(msg.price,Decimal('0.0550'))
       
   192             self.assertEqual(msg.isBilled,False)
       
   193             self.assertEqual(msg.recipient,str(Telnumber('123456789')))
       
   194             self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5))
       
   195             self.assertEqual(msg.offer,o)