iro/test_helpers/dbtestcase.py
author Sandro Knauß <knauss@netzguerilla.net>
Sat, 24 Mar 2012 00:07:40 +0100
branchdevel
changeset 249 4007b5072c4a
parent 241 546316b0b09c
child 294 0e75bd39767d
permissions -rw-r--r--
getting old iro.user into actual version

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)