tests/db.py
branchdevel
changeset 131 c51c3e8c3ec0
child 134 fae3fdfece65
equal deleted inserted replaced
130:05e599aa83c3 131:c51c3e8c3ec0
       
     1 import unittest
       
     2 from sqlalchemy import create_engine, pool
       
     3 from tempfile import mkdtemp
       
     4 import shutil
       
     5 
       
     6 from datetime import datetime
       
     7 
       
     8 from iro.model import POOL_SIZE as DB_POOL_SIZE
       
     9 from iro.model.schema import User, Base, Offer, Userright, Job, Message
       
    10 from decimal import Decimal
       
    11 
       
    12 from ngdatabase.mysql import Server, createConfig, Database
       
    13 from .dbtestcase import DBTestCase
       
    14 
       
    15 class SampleDatabase(Database):
       
    16     def createPassword(self):
       
    17         self.password="test"
       
    18         return self.password
       
    19 
       
    20 class ModuleData:
       
    21     def __init__(self):
       
    22         self.tdir = mkdtemp(prefix='iro-mysql-')
       
    23         self.server = Server('%s/my.cnf'%self.tdir)
       
    24         self.db = SampleDatabase("test","test",'%s/my.cnf'%self.tdir)
       
    25         self.engine = create_engine('mysql://test:test@localhost/test?unix_socket=%s/socket'%self.tdir,
       
    26                 poolclass = pool.SingletonThreadPool,  pool_size=DB_POOL_SIZE, )#echo=True)
       
    27 
       
    28     def setUp(self):
       
    29         with open('%s/my.cnf'%self.tdir,'w') as cnf:
       
    30             cnf.write(createConfig(self.tdir))
       
    31         self.server.create()
       
    32         self.server.start()
       
    33         self.db.create()
       
    34         Base.metadata.create_all(self.engine)
       
    35     
       
    36     def tearDown(self):
       
    37         self.server.stop()
       
    38         shutil.rmtree(self.tdir)
       
    39  
       
    40 
       
    41 md=ModuleData()
       
    42 
       
    43 def setUpModule():
       
    44     md.setUp()
       
    45 
       
    46 def tearDownModule():
       
    47     md.tearDown()
       
    48 
       
    49 class DBTests(DBTestCase):
       
    50     """tests for the db model"""
       
    51     def setUp(self):
       
    52         if not self.engine:
       
    53             self.engine = md.engine
       
    54     
       
    55     def testRoutes(self):
       
    56         '''test routes'''
       
    57         with self.session() as session:
       
    58             u=User(name='test',apikey='abcdef123456789')
       
    59             o=Offer(name="sipgate_basic", provider="sipgate", route="basic", typ="sms")
       
    60             u.rights.append(Userright(o)) 
       
    61             session.add(u)
       
    62         
       
    63         with self.session() as session:
       
    64             u=session.merge(u)
       
    65             self.failUnlessEqual(u.routes('sms').all(),[('sipgate_basic',),])
       
    66 
       
    67 
       
    68     def testTyps(self):
       
    69         with self.session() as session:
       
    70             o=Offer(name="sipgate_basic", provider="sipgate", route="basic", typ="sms")
       
    71             session.add(o)
       
    72         
       
    73         with self.session() as session:
       
    74             self.failUnlessEqual(session.typs.all(),[('sms',),])
       
    75 
       
    76         with self.session() as session:
       
    77             o=Offer(name="s2", provider="sipgate", route="basic", typ="sms")
       
    78             o=Offer(name="s3", provider="sipgate", route="basic", typ="sms2")
       
    79             session.add(o)
       
    80         
       
    81         with self.session() as session:
       
    82             self.failUnlessEqual(session.typs.order_by(Offer.typ).all(),[('sms',),('sms2',)])
       
    83 
       
    84 
       
    85 class BillTest(DBTestCase):
       
    86     """test the bill function"""
       
    87     def setUp(self):
       
    88         if not self.engine:
       
    89             self.engine = md.engine
       
    90 
       
    91     def testBill(self):
       
    92         '''test bill function'''
       
    93         apikey='abcdef123456789'
       
    94         with self.session() as session:
       
    95             u=User(name='test',apikey=apikey)
       
    96             session.add(u)
       
    97             o = Offer(name='sipgate_basic',provider="sipgate",route="basic",typ="sms")
       
    98             j = Job(hash='a1',info='i',status='sended')
       
    99             m = Message(recipient='0123456789', isBilled=False, date=datetime.now() , price=0.30, offer=o, job=j)
       
   100             u.rights.append(Userright(o))
       
   101             u.jobs.append(j)
       
   102             session.add(m)
       
   103 
       
   104         with self.session() as session:
       
   105             u=session.merge(u)
       
   106             self.failUnlessEqual(u.rights[0].bill.all(),[(1L,Decimal('0.3000'),'i')])
       
   107 
       
   108     def testBillAgreget(self):
       
   109         apikey='abcdef123456789'
       
   110         with self.session() as session:
       
   111             u=User(name='test',apikey=apikey)
       
   112             session.add(u)
       
   113             o = Offer(name='sipgate_basic',provider="sipgate",route="basic",typ="sms")
       
   114             j = Job(hash='a1',info='i',status='sended')
       
   115             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now() , price=0.30, offer=o))
       
   116             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now() , price=0.4, offer=o))
       
   117             u.rights.append(Userright(o))
       
   118             u.jobs.append(j)
       
   119  
       
   120         with self.session() as session:
       
   121             u=session.merge(u)
       
   122             self.failUnlessEqual(u.rights[0].bill.all(),[(2L,Decimal('0.7000'),'i')])
       
   123         
       
   124     def testBillIsBilled(self):
       
   125         apikey='abcdef123456789'
       
   126         with self.session() as session:
       
   127             u=User(name='test',apikey=apikey)
       
   128             session.add(u)
       
   129             o = Offer(name='sipgate_basic',provider="sipgate",route="basic",typ="sms")
       
   130             j = Job(hash='a1',info='i',status='sended')
       
   131             j.messages.append(Message(recipient='0123456789', isBilled=True, date=datetime.now() , price=0.30, offer=o))
       
   132             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now() , price=0.4, offer=o))
       
   133             u.rights.append(Userright(o))
       
   134             u.jobs.append(j)
       
   135 
       
   136         with self.session() as session:
       
   137             u=session.merge(u)
       
   138             self.failUnlessEqual(u.rights[0].bill.all(),[(1L,Decimal('0.4000'),'i')])
       
   139 
       
   140     def testBillMultipleJobs(self):
       
   141         apikey='abcdef123456789'
       
   142         with self.session() as session:
       
   143             u=User(name='test',apikey=apikey)
       
   144             session.add(u)
       
   145             o = Offer(name='sipgate_basic',provider="sipgate",route="basic",typ="sms")
       
   146             u.rights.append(Userright(o))
       
   147             
       
   148             j = Job(hash='a1',info='i',status='sended')
       
   149             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now() , price=0.4, offer=o))
       
   150             u.jobs.append(j)
       
   151 
       
   152             j = Job(hash='a2',info='a',status='sended')
       
   153             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now(), price=0.4, offer=o))
       
   154             u.jobs.append(j) 
       
   155         
       
   156         with self.session() as session:
       
   157             u=session.merge(u)
       
   158             self.failUnlessEqual(u.rights[0].bill.order_by(Job.info).all(),
       
   159                     [(1L,Decimal('0.4000'),'a'),
       
   160                     (1L,Decimal('0.4000'),'i')
       
   161                     ])
       
   162 
       
   163     def testBillMultipleOffers(self):
       
   164         apikey='abcdef123456789'
       
   165         with self.session() as session:
       
   166             u=User(name='test',apikey=apikey)
       
   167             session.add(u)
       
   168             o = Offer(name='sipgate_basic',provider="sipgate",route="basic",typ="sms")
       
   169             u.rights.append(Userright(o))
       
   170             
       
   171             j = Job(hash='a2',info='a',status='sended')
       
   172             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now(), price=0.4, offer=o))
       
   173             u.jobs.append(j) 
       
   174  
       
   175             o = Offer(name='sipgate_gold',provider="sipgate",route="gold",typ="sms")
       
   176             u.rights.append(Userright(offer=o))
       
   177             
       
   178             j = Job(hash='a3',info='a',status='sended')
       
   179             j.messages.append(Message(recipient='0123456789', isBilled=False, date=datetime.now(), price=0.5, offer=o))
       
   180             u.jobs.append(j) 
       
   181        
       
   182         with self.session() as session:
       
   183             u=session.merge(u)
       
   184             self.failUnlessEqual(u.rights[0].bill.all(),
       
   185                     [(1L,Decimal('0.4000'),'a')])
       
   186         
       
   187             self.failUnlessEqual(u.rights[1].bill.all(),[(1L,Decimal('0.5000'),'a')])
       
   188 
       
   189 if __name__ == '__main__':
       
   190         unittest.main()