class ZODBLayer(object): """This layer load a ZCML configuration and create a test database. You can access the test database with layer.getRootFolder(). """ db = None db_name = 'main' connection = None __bases__ = tuple() def __init__(self, config_file, module, name, allow_teardown=False, product_config=None): self.config_file = config_file self.__module__ = module self.__name__ = name self.allow_teardown = allow_teardown self.product_config = product_config def getRootFolder(self): """This return the root object of the database or assert if the database have not been created yet. """ if self.connection is None: assert self.db is not None self.connection = self.db.open() return self.connection.root()[ZopePublication.root_name] def _close_db(self): # Close any opened connections if self.connection is not None: transaction.abort() self.connection.close() self.connection = None # Close the Database if self.db is not None: base = component.getGlobalSiteManager() base.unregisterUtility( self.db, ZODB.interfaces.IDatabase, self.db_name) self.db.close() self.db = None def setUp(self): self.setup = FunctionalTestSetup( self.config_file, product_config=self.product_config) self.db = createTestDB(self.db_name) self.base_storage = self.db._storage self._base_db_open = True def testSetUp(self): from fernlehrgang.models import Base session = Session() Base.metadata.create_all(session.connection().engine) transaction.commit() if self._base_db_open: self._close_db() self._base_db_open = False self.db = createTestDB(self.db_name, self.base_storage) def testTearDown(self): self._close_db() from fernlehrgang.models import Base session = Session() Base.metadata.drop_all(session.connection().engine) transaction.commit() session.close() def tearDown(self): self.setup.tearDownCompletely() if not self.allow_teardown: raise NotImplementedError