iro/tests/job.py
branchdevel
changeset 231 3929338fd17f
parent 216 ab8e2f26718e
child 241 546316b0b09c
equal deleted inserted replaced
230:448dd8d36839 231:3929338fd17f
       
     1 from datetime import datetime
       
     2 from decimal import Decimal
       
     3 from mock import patch
       
     4 
       
     5 from iro.model.job import exJobs, ExJob
       
     6 from iro.model.pool import data
       
     7 from iro.model.message import SMS
       
     8 from iro.model.status import Status
       
     9 from iro.model.schema import Job, User, Offer as DBOffer, Userright
       
    10 
       
    11 from iro.controller.task import Task
       
    12 
       
    13 from iro.offer.provider import Provider
       
    14 
       
    15 from iro.telnumber import Telnumber
       
    16 from iro.validate import vInteger
       
    17 
       
    18 from ..test_helpers.dbtestcase import DBTestCase
       
    19 
       
    20 class DummyPool():
       
    21     def run(self, f,*a,**k):
       
    22         return f(*a,**k)
       
    23 
       
    24 from twisted.python import log
       
    25 
       
    26 class DummyObserver(object):
       
    27     def __init__(self):
       
    28         self.e=[]    
       
    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):
       
    40     def setUp(self):
       
    41         DBTestCase.setUp(self)
       
    42         self.pool = data.pool
       
    43         data.pool = DummyPool()
       
    44 
       
    45     def tearDown(self):
       
    46         exJobs.clear()
       
    47         data.pool = self.pool
       
    48         self.pool = None
       
    49         DBTestCase.tearDown(self)
       
    50 
       
    51 
       
    52 class exJobsTest(JobTestCase):
       
    53     '''tests for exJobs'''
       
    54 
       
    55     def testCreate(self):
       
    56         with self.session() as session:
       
    57             u = User(name='test',apikey='abcdef123456789')
       
    58             session.add(u)
       
    59 
       
    60         job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test'])
       
    61         self.assertIsInstance(job, ExJob)
       
    62         self.assertTrue(vInteger(job.dbjob, None, minv=0 ))
       
    63         self.assertEqual(job.message, SMS('test'))
       
    64         self.assertEqual(job.recipients,  [Telnumber('123456789')])
       
    65         self.assertEqual(job.offers,[])
       
    66         self.assertEqual(job.tasks,{})
       
    67 
       
    68         with self.session() as session:
       
    69             j = session.query(Job.id).all()
       
    70             self.assertEqual(j,[(job.dbjob,)])
       
    71 
       
    72         self.assertEqual(exJobs[job.dbjob],job)
       
    73 
       
    74     def testCreate2(self):
       
    75         with self.session() as session:
       
    76             u = User(name='test',apikey='abcdef123456789')
       
    77             session.add(u)
       
    78             o=DBOffer(name="test", provider="bla", route="basic", typ="sms")
       
    79             u.rights.append(Userright(o)) 
       
    80 
       
    81         job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test'])
       
    82         self.assertEqual(job.offers,['test'])
       
    83 
       
    84     def testGet(self):
       
    85         with self.session() as session:
       
    86             u = User(name='test',apikey='abcdef123456789')
       
    87             session.add(u)
       
    88 
       
    89         job = ExJob(None, [Telnumber('123456789')], SMS('test'), ['test'])
       
    90         exJobs[1] = job
       
    91 
       
    92         self.assertEqual(len(exJobs), 1)
       
    93         self.assertEqual(job, exJobs[1])
       
    94 
       
    95     def testGetFromDB(self):
       
    96         with self.session() as session:
       
    97             u = User(name='test',apikey='abcdef123456789')
       
    98             job = Job( info="info", status="started")
       
    99             u.jobs.append(job)
       
   100             session.add(u)
       
   101 
       
   102         with self.session() as session:
       
   103             job = session.merge(job)
       
   104             u = session.merge(u)
       
   105             ejob= ExJob(job.id, [Telnumber('123456789')], SMS('test'), ['test'])
       
   106             exJobs[job.id]=ejob
       
   107             self.assertEqual(job.extend, ejob)
       
   108             self.assertEqual(u.jobs[0].extend,ejob)
       
   109 
       
   110     def testUnknownExJob(self):
       
   111         self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890')
       
   112 
       
   113 
       
   114 class StatiTest(JobTestCase):
       
   115     def setUp(self):
       
   116         JobTestCase.setUp(self)
       
   117         self.log = DummyObserver()
       
   118         self.log.start()
       
   119 
       
   120         with self.session() as session:
       
   121             u = User(name='test',apikey='abcdef123456789')
       
   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
       
   128         
       
   129         self.provider=Provider("bla", {"sms":["a","b","c"]})
       
   130         self.job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), [])
       
   131 
       
   132     def tearDown(self):
       
   133         self.log.stop()
       
   134         JobTestCase.tearDown(self)
       
   135 
       
   136 
       
   137     def testSetError(self):
       
   138         self.job.setError(Task(Telnumber('123456789'),self),Exception("muhaha"))
       
   139         errors = self.flushLoggedErrors(Exception)
       
   140         self.assertEqual(len(errors), 1)
       
   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")
       
   147 
       
   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)
       
   160 
       
   161     def testMultipleRecipients(self):
       
   162         self.job.recipients.append(Telnumber("01234567890"))
       
   163         task = Task(Telnumber('123456789'),self.job)
       
   164         status = Status(self.provider,"a")
       
   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     @patch("iro.model.job.datetime")
       
   173     def testCosts(self,p_dt):
       
   174         p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5)
       
   175         task = Task(Telnumber('123456789'),self.job)
       
   176         status = Status(self.provider,"a",costs=0.055,exID="12345678",count=1)
       
   177         
       
   178         self.job.setStatus(task, status)
       
   179         
       
   180         with self.session() as session:
       
   181             u = session.merge(self.user)
       
   182             o = session.merge(self.offer)
       
   183             job = u.job(self.job.dbjob)
       
   184             self.assertEqual(job.status,"sended")
       
   185             self.assertEqual(len(job.messages),1)
       
   186             
       
   187             msg = job.messages[0]
       
   188             self.assertEqual(msg.price,Decimal('0.0550'))
       
   189             self.assertEqual(msg.isBilled,False)
       
   190             self.assertEqual(msg.recipient,str(Telnumber('123456789')))
       
   191             self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5))
       
   192             self.assertEqual(msg.offer,o)
       
   193             self.assertEqual(msg.exID,"12345678")
       
   194             self.assertEqual(msg.count,1)