iro/tests/job.py
author Sandro Knauß <knauss@netzguerilla.net>
Wed, 25 Apr 2012 15:06:28 +0200
branchdevel
changeset 277 f65edc0382cc
parent 245 4526747a42ca
child 294 0e75bd39767d
permissions -rw-r--r--
prepare for release: * diffrent web directory with all web specific content (split doc dir -> doc (data) and web (rendered data)) * update installation

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 ..test_helpers.dbtestcase import DBTestCase
from ..test_helpers.utils import DummyPool

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)
        self.assertEqual(self.log.e[0]['message'], ("Job(%s) created."%job.dbjob,))

    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)

        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):
        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[1]['message'], ("Job(%s) status changed to: error."%self.job.dbjob,))
        self.assertEqual(self.log.e[2]['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[1]['message'], ("Job(%s) status changed to: sended."%self.job.dbjob,))
        self.assertEqual(self.log.e[2]['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)