tests/dbtestcase.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 09 Feb 2012 17:34:47 +0100
branchdevel
changeset 138 57c4450c8ba6
parent 135 f8640c663e3e
child 141 90c95fdd1e33
permissions -rw-r--r--
switching from nose to trial testing

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 schema, setEngine
from iro.model.utils import WithSession
from iro.model.schema import Base

from iro.controller.pool import dbPool

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()

    def tearDown(self):
        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 schema.__tables__:
                session.query(getattr(schema,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):
        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.engine = create_engine('mysql://test:test@localhost/test?unix_socket=%s/socket'%self.tdir, 
                poolclass = pool.SingletonThreadPool,  pool_size=dbPool.maxthreads, )#echo=True)
        self.vaild = False

    def setUp(self):
        if not self.vaild:
            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)
            self.vaild = True
    

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