tests/job.py
author Sandro Knauß <knauss@netzguerilla.net>
Mon, 05 Mar 2012 21:37:44 +0100
branchdevel
changeset 216 ab8e2f26718e
parent 186 b381eaa774ab
permissions -rw-r--r--
tests for Task.start -> ExJob->setError/setStatus

from datetime import datetime
from decimal import Decimal
from mock import patch

from iro.model.job import exJobs, ExJob
from iro.model.pool import data
from iro.model.message import SMS
from iro.model.status import Status
from iro.model.schema import Job, User, Offer as DBOffer, Userright

from iro.controller.task import Task

from iro.offer.provider import Provider

from iro.telnumber import Telnumber
from iro.validate import vInteger

from .dbtestcase import DBTestCase

class DummyPool():
    def run(self, 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 JobTestCase(DBTestCase):
    def setUp(self):
        DBTestCase.setUp(self)
        self.pool = data.pool
        data.pool = DummyPool()

    def tearDown(self):
        exJobs.clear()
        data.pool = self.pool
        self.pool = None
        DBTestCase.tearDown(self)


class exJobsTest(JobTestCase):
    '''tests for exJobs'''

    def testCreate(self):
        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)

        job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test'])
        self.assertIsInstance(job, ExJob)
        self.assertTrue(vInteger(job.dbjob, None, minv=0 ))
        self.assertEqual(job.message, SMS('test'))
        self.assertEqual(job.recipients,  [Telnumber('123456789')])
        self.assertEqual(job.offers,[])
        self.assertEqual(job.tasks,{})

        with self.session() as session:
            j = session.query(Job.id).all()
            self.assertEqual(j,[(job.dbjob,)])

        self.assertEqual(exJobs[job.dbjob],job)

    def testCreate2(self):
        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)
            o=DBOffer(name="test", provider="bla", route="basic", typ="sms")
            u.rights.append(Userright(o)) 

        job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test'])
        self.assertEqual(job.offers,['test'])

    def testGet(self):
        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)

        job = ExJob(None, [Telnumber('123456789')], SMS('test'), ['test'])
        exJobs[1] = job

        self.assertEqual(len(exJobs), 1)
        self.assertEqual(job, exJobs[1])

    def testGetFromDB(self):
        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            job = Job( info="info", status="started")
            u.jobs.append(job)
            session.add(u)

        with self.session() as session:
            job = session.merge(job)
            u = session.merge(u)
            ejob= ExJob(job.id, [Telnumber('123456789')], SMS('test'), ['test'])
            exJobs[job.id]=ejob
            self.assertEqual(job.extend, ejob)
            self.assertEqual(u.jobs[0].extend,ejob)

    def testUnknownExJob(self):
        self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890')


class StatiTest(JobTestCase):
    def setUp(self):
        JobTestCase.setUp(self)
        self.log = DummyObserver()
        self.log.start()

        with self.session() as session:
            u = User(name='test',apikey='abcdef123456789')
            session.add(u)
            o=DBOffer(name="test", provider="bla", route="a", typ="sms")
            u.rights.append(Userright(o)) 

        self.user = u
        self.offer = o
        
        self.provider=Provider("bla", {"sms":["a","b","c"]})
        self.job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), [])

    def tearDown(self):
        self.log.stop()
        JobTestCase.tearDown(self)


    def testSetError(self):
        self.job.setError(Task(Telnumber('123456789'),self),Exception("muhaha"))
        errors = self.flushLoggedErrors(Exception)
        self.assertEqual(len(errors), 1)
        self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to '0049123456789' failed."%self.job.dbjob)
        
        with self.session() as session:
            u = session.merge(self.user)
            job = u.job(self.job.dbjob)
            self.assertEqual(job.status,"error")

    def testSetStatus(self):
        task = Task(Telnumber('123456789'),self.job)
        status = Status(self.provider,"a")
        self.job.setStatus(task, status)
        
        self.assertEqual(self.log.e[0]['message'], ("Job(%s) to '0049123456789' ended sucecessfully via bla:a."%self.job.dbjob,))
        
        with self.session() as session:
            u = session.merge(self.user)
            job = u.job(self.job.dbjob)
            self.assertEqual(job.status,"sended")
            self.assertEqual(len(job.messages),0)

    def testMultipleRecipients(self):
        self.job.recipients.append(Telnumber("01234567890"))
        task = Task(Telnumber('123456789'),self.job)
        status = Status(self.provider,"a")
        self.job.setStatus(task, status)
        
        with self.session() as session:
            u = session.merge(self.user)
            job = u.job(self.job.dbjob)
            self.assertEqual(job.status,"sending")

    @patch("iro.model.job.datetime")
    def testCosts(self,p_dt):
        p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5)
        task = Task(Telnumber('123456789'),self.job)
        status = Status(self.provider,"a",costs=0.055,exID="12345678",count=1)
        
        self.job.setStatus(task, status)
        
        with self.session() as session:
            u = session.merge(self.user)
            o = session.merge(self.offer)
            job = u.job(self.job.dbjob)
            self.assertEqual(job.status,"sended")
            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)