[Checkins] SVN: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/test Add the testlayer based on zope.component.testlayer which setup a test database. with it.
Sylvain Viollon
sylvain at infrae.com
Thu Jan 21 11:05:47 EST 2010
Log message for revision 108361:
Add the testlayer based on zope.component.testlayer which setup a test database. with it.
Changed:
A zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.py
A zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.txt
A zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/
A zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/__init__.py
A zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/ftesting.zcml
A zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/testobject.py
U zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/tests.py
-=-
Added: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.py
===================================================================
--- zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.py (rev 0)
+++ zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.py 2010-01-21 16:05:46 UTC (rev 108361)
@@ -0,0 +1,81 @@
+##############################################################################
+#
+# Copyright (c) 2010 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+from ZODB.DB import DB
+from ZODB.DemoStorage import DemoStorage
+import ZODB.ActivityMonitor
+import ZODB.interfaces
+
+from zope import component
+from zope.app.publication.zopepublication import ZopePublication
+from zope.component.testlayer import ZCMLFileLayer
+from zope.event import notify
+import zope.processlifetime
+
+
+def createTestDB(name='main'):
+ """This create a test storage and register it.
+ """
+ storage = DemoStorage(name)
+ db = DB(storage, database_name=name)
+ db.setActivityMonitor(ZODB.ActivityMonitor.ActivityMonitor())
+
+ # DB are registered as utilities
+ component.provideUtility(db, ZODB.interfaces.IDatabase, name)
+
+ # And we send a event that our DB is available
+ notify(zope.processlifetime.DatabaseOpened(db))
+ return db
+
+
+class ZODBLayer(ZCMLFileLayer):
+ """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
+
+ 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 testSetUp(self):
+ super(ZODBLayer, self).testSetUp()
+ self.db = createTestDB(self.db_name)
+
+ def testTearDown(self):
+ super(ZODBLayer, self).testTearDown()
+ # Close any opened connections
+ if self.connection is not None:
+ self.connection.close()
+ self.connection = None
+
+ # Close the Database
+ if self.db is not None:
+ # Need to unregister DB
+ base = component.getGlobalSiteManager()
+ base.unregisterUtility(
+ self.db, ZODB.interfaces.IDatabase, self.db_name)
+ self.db.close()
+ self.db = None
+
+
Added: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.txt
===================================================================
--- zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.txt (rev 0)
+++ zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.txt 2010-01-21 16:05:46 UTC (rev 108361)
@@ -0,0 +1,62 @@
+Layers
+======
+
+zope.app.appsetup.testlayer define a test layer which creates a test
+database.
+
+ZODBLayer
+---------
+
+We can instantiate a ZODBLayer::
+
+ >>> from zope.app.appsetup.testlayer import ZODBLayer
+ >>> from zope.app.appsetup import testpackage
+
+ >>> layer = ZODBLayer(testpackage)
+ >>> layer
+ <zope.app.appsetup.testlayer.ZODBLayer object at ...>
+
+Now we run some tests with this layer that checks that we have a
+working database::
+
+ >>> import unittest
+ >>> import transaction
+ >>> from zope import component
+ >>> from zope.app.appsetup.testpackage import testobject
+ >>> from ZODB.interfaces import IDatabase
+
+ >>> class TestCase(unittest.TestCase):
+ ... layer = layer
+ ...
+ ... def testAddObjectInDB(self):
+ ... root = self.layer.getRootFolder()
+ ... root['object'] = testobject.TestObject()
+ ... transaction.commit()
+ ... self.failUnless('object' in root)
+ ... def testNoMoreObjectInDB(self):
+ ... root = self.layer.getRootFolder()
+ ... self.failIf('object' in root)
+ ... def testApplicationInDB(self):
+ ... root = self.layer.getRootFolder()
+ ... self.assertEquals(
+ ... repr(root.__class__), "<class 'zope.site.folder.Folder'>")
+ ... def testDBRegistered(self):
+ ... root = self.layer.getRootFolder()
+ ... db = component.getUtility(IDatabase, name='main')
+ ... self.assertEquals(db, root._p_jar.db())
+
+We define a suite with our test:
+
+ >>> suite = unittest.TestSuite()
+ >>> suite.addTest(unittest.makeSuite(TestCase))
+
+And run that suite:
+
+ >>> from zope.testing.testrunner.runner import Runner
+ >>> runner = Runner(found_suites=[suite])
+ >>> succeeded = runner.run()
+ Running zope.app.appsetup.testpackage.ZODBLayer tests:
+ Set up zope.app.appsetup.testpackage.ZODBLayer in ... seconds.
+ Ran 4 tests with 0 failures and 0 errors in ... seconds.
+ Tearing down left over layers:
+ Tear down zope.app.appsetup.testpackage.ZODBLayer in ... seconds.
Added: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/__init__.py
===================================================================
--- zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/__init__.py (rev 0)
+++ zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/__init__.py 2010-01-21 16:05:46 UTC (rev 108361)
@@ -0,0 +1 @@
+# This is a cool test package.
Added: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/ftesting.zcml
===================================================================
--- zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/ftesting.zcml (rev 0)
+++ zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/ftesting.zcml 2010-01-21 16:05:46 UTC (rev 108361)
@@ -0,0 +1,19 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+ <include package="zope.component" file="meta.zcml" />
+ <include package="zope.component" />
+
+ <!-- Those next ZCML includes are required by zope.app.appsetup. So
+ should be in the real configure.zcml. zope.security probably be
+ include in zope.site configuration -->
+ <include package="zope.security" file="meta.zcml" />
+ <include package="zope.security" />
+
+ <include package="zope.traversing" />
+ <include package="zope.container" />
+ <include package="zope.site" />
+
+ <!-- Include zope.app.appsetup so there is an Application in our DB -->
+ <include package="zope.app.appsetup" />
+
+</configure>
Added: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/testobject.py
===================================================================
--- zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/testobject.py (rev 0)
+++ zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testpackage/testobject.py 2010-01-21 16:05:46 UTC (rev 108361)
@@ -0,0 +1,5 @@
+
+import persistent
+
+class TestObject(persistent.Persistent):
+ pass
Modified: zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/tests.py
===================================================================
--- zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/tests.py 2010-01-21 15:42:41 UTC (rev 108360)
+++ zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/tests.py 2010-01-21 16:05:46 UTC (rev 108361)
@@ -274,6 +274,12 @@
'debug.txt',
setUp=setUpDebug, tearDown=tearDownDebug,
))
+ suite.addTest(doctest.DocFileSuite(
+ 'testlayer.txt',
+ optionflags=(doctest.ELLIPSIS +
+ doctest.NORMALIZE_WHITESPACE +
+ doctest.REPORT_NDIFF)))
+
return suite
if __name__ == '__main__':
More information about the checkins
mailing list