iro/test_helpers/dbtestcase.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 29 Mar 2012 17:25:14 +0200
branchdevel
changeset 260 4a03119a98c1
parent 241 546316b0b09c
child 294 0e75bd39767d
permissions -rw-r--r--
deleting iro.model.session. Own Session is not needed anymore.

from twisted.trial import unittest

from sqlalchemy import create_engine, pool
from tempfile import mkdtemp

from shutil import rmtree
import atexit 
from ngdatabase.mysql import Server, createConfig, Database

from iro.model import setEngine, setPool
from iro.model.utils import WithSession
from iro.model.schema import Base

from iro.controller.pool import dbPool

from .utils import DummyObserver

class DBTestCase(unittest.TestCase):
    '''a TestCase with DB connection
    you have to set self.session manually in setUp'''
    def __init__(self,*args,**kwargs):
        unittest.TestCase.__init__(self,*args,**kwargs)
        self.engine = md.engine

    def setUp(self):
        md.setUp()
        self.log = DummyObserver()
        self.log.start()

    def tearDown(self):
        self.log.stop()
        self.__cleanDB()
    
    def session(self,autocommit=True):
        '''returns a WithSession'''
        return WithSession(self.engine,autocommit)
    
    def __cleanDB(self):
        '''cleaning database'''
        with self.session() as session:
            for table in reversed(Base.metadata.sorted_tables):
                session.execute(table.delete())


class SampleDatabase(Database):
    def createPassword(self):
        self.password="test"
        return self.password

class ModuleData(object):
    def __init__(self):
        self.create()

    def close(self):
        if self.valid:
            self.server.stop()
            rmtree(self.tdir)
            self.valid= False

    def create(self):
        self.tdir = mkdtemp(prefix='iro-mysql-')
        self.server = Server('%s/my.cnf'%self.tdir)
        self.db = SampleDatabase("test","test",'%s/my.cnf'%self.tdir)
        self.dburl = 'mysql://test:test@localhost/test?unix_socket=%s/socket'%self.tdir
        self.engine = create_engine(self.dburl, 
                poolclass = pool.SingletonThreadPool,  pool_size=dbPool.maxthreads, )#echo=True)
        self.valid = False

    def setUp(self):
        if not self.valid:
            with open('%s/my.cnf'%self.tdir,'w') as cnf:
                cnf.write(createConfig(self.tdir))
            self.server.create()
            self.server.start()
            self.db.create()
            Base.metadata.create_all(self.engine)
            setEngine(self.engine)
            setPool(dbPool)
            self.valid = True
    

md=ModuleData()
atexit.register(md.close)