[Checkins] SVN: zope.app.appsetup/trunk/ Merge sylvain-zcmltestlayer into trunk to remove zope.app.testing test dependency.
Sylvain Viollon
sylvain at infrae.com
Thu Jan 21 13:59:23 EST 2010
Log message for revision 108378:
Merge sylvain-zcmltestlayer into trunk to remove zope.app.testing test dependency.
Changed:
U zope.app.appsetup/trunk/CHANGES.txt
U zope.app.appsetup/trunk/setup.py
A zope.app.appsetup/trunk/src/zope/app/appsetup/ftesting.zcml
A zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.py
A zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.txt
A zope.app.appsetup/trunk/src/zope/app/appsetup/testpackage/
U zope.app.appsetup/trunk/src/zope/app/appsetup/tests.py
-=-
Modified: zope.app.appsetup/trunk/CHANGES.txt
===================================================================
--- zope.app.appsetup/trunk/CHANGES.txt 2010-01-21 18:48:42 UTC (rev 108377)
+++ zope.app.appsetup/trunk/CHANGES.txt 2010-01-21 18:59:23 UTC (rev 108378)
@@ -4,9 +4,11 @@
3.13.1 (unreleased)
-------------------
-- make zope.testing an optional (test) dependency
+- make zope.testing an optional (test) dependency.
+- remove test dependency zope.app.testing.
+
3.13.0 (2009-12-24)
-------------------
Modified: zope.app.appsetup/trunk/setup.py
===================================================================
--- zope.app.appsetup/trunk/setup.py 2010-01-21 18:48:42 UTC (rev 108377)
+++ zope.app.appsetup/trunk/setup.py 2010-01-21 18:59:23 UTC (rev 108378)
@@ -64,7 +64,6 @@
package_dir={'': 'src'},
extras_require=dict(
test=[
- 'zope.app.testing',
'zope.componentvocabulary',
'zope.principalregistry',
'zope.testing',
Copied: zope.app.appsetup/trunk/src/zope/app/appsetup/ftesting.zcml (from rev 108375, zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/ftesting.zcml)
===================================================================
--- zope.app.appsetup/trunk/src/zope/app/appsetup/ftesting.zcml (rev 0)
+++ zope.app.appsetup/trunk/src/zope/app/appsetup/ftesting.zcml 2010-01-21 18:59:23 UTC (rev 108378)
@@ -0,0 +1,20 @@
+<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.location" />
+ <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>
Copied: zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.py (from rev 108375, zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.py)
===================================================================
--- zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.py (rev 0)
+++ zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.py 2010-01-21 18:59:23 UTC (rev 108378)
@@ -0,0 +1,82 @@
+##############################################################################
+#
+# 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
+import transaction
+
+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):
+ # 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:
+ # Need to unregister DB
+ base = component.getGlobalSiteManager()
+ base.unregisterUtility(
+ self.db, ZODB.interfaces.IDatabase, self.db_name)
+ self.db.close()
+ self.db = None
+
+ super(ZODBLayer, self).testTearDown()
Copied: zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.txt (from rev 108375, zope.app.appsetup/branches/sylvain-zcmltestlayer/src/zope/app/appsetup/testlayer.txt)
===================================================================
--- zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.txt (rev 0)
+++ zope.app.appsetup/trunk/src/zope/app/appsetup/testlayer.txt 2010-01-21 18:59:23 UTC (rev 108378)
@@ -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(args=[], 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.
Modified: zope.app.appsetup/trunk/src/zope/app/appsetup/tests.py
===================================================================
--- zope.app.appsetup/trunk/src/zope/app/appsetup/tests.py 2010-01-21 18:48:42 UTC (rev 108377)
+++ zope.app.appsetup/trunk/src/zope/app/appsetup/tests.py 2010-01-21 18:59:23 UTC (rev 108378)
@@ -36,6 +36,7 @@
from zope.app.publication.zopepublication import ZopePublication
from zope.site.site import LocalSiteManager
+import zope.app.appsetup
from zope.app.appsetup.bootstrap import bootStrapSubscriber
from zope.app.appsetup.bootstrap import getInformationFromEvent, \
ensureObject, ensureUtility
@@ -45,9 +46,9 @@
from zope.session.interfaces import IClientIdManager
from zope.session.interfaces import ISessionDataContainer
-from zope.app.testing import placelesssetup
-from zope.app.testing import setup
+from zope.component.testlayer import ZCMLFileLayer
+layer = ZCMLFileLayer(zope.app.appsetup)
class EventStub(object):
@@ -58,15 +59,15 @@
# TODO: some methods from the boostap module are not tested
#
-class TestBootstrapSubscriber(placelesssetup.PlacelessSetup, unittest.TestCase):
+class TestBootstrapSubscriber(unittest.TestCase):
+ layer = layer
+
def setUp(self):
- setup.placefulSetUp()
self.db = DB()
def tearDown(self):
transaction.abort()
- setup.placefulTearDown()
self.db.close()
def createRootFolder(self):
@@ -230,50 +231,55 @@
schema = ZConfig.loadSchema(url)
-def bootstraptearDown(test):
- test.globs['db'].close()
+class DebugLayer(ZCMLFileLayer):
-def setUpDebug(test):
- placelesssetup.setUp(test)
- test.real_stderr = sys.stderr
- test.real_argv = list(sys.argv)
- test.olddir = os.getcwd()
- os.chdir(os.path.join(os.path.dirname(__file__), 'testdata'))
- from zope.security.management import endInteraction
- endInteraction()
+ def setUp(self):
+ super(DebugLayer, self).setUp()
+ self.stderr = sys.stderr
+ self.argv = list(sys.argv)
+ self.olddir = os.getcwd()
+ os.chdir(os.path.join(os.path.dirname(__file__), 'testdata'))
+ from zope.security.management import endInteraction
+ endInteraction()
+ def tearDown(self):
+ sys.stderr = self.stderr
+ sys.argv[:] = self.argv
+ if hasattr(sys, 'ps1'):
+ del sys.ps1
+ os.chdir(self.olddir)
+ # make sure we don't leave environment variables that would cause
+ # Python to open an interactive console
+ if 'PYTHONINSPECT' in os.environ:
+ del os.environ['PYTHONINSPECT']
+ from zope.security.management import endInteraction
+ endInteraction()
+ super(DebugLayer, self).tearDown()
-def tearDownDebug(test):
- sys.stderr = test.real_stderr
- sys.argv[:] = test.real_argv
- if hasattr(sys, 'ps1'):
- del sys.ps1
- os.chdir(test.olddir)
- # make sure we don't leave environment variables that would cause
- # Python to open an interactive console
- if 'PYTHONINSPECT' in os.environ:
- del os.environ['PYTHONINSPECT']
- from zope.security.management import endInteraction
- endInteraction()
- placelesssetup.tearDown(test)
-
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestBootstrapSubscriber))
suite.addTest(unittest.makeSuite(TestConfigurationSchema))
- suite.addTest(doctest.DocTestSuite(
- 'zope.app.appsetup.appsetup',
- setUp=placelesssetup.setUp, tearDown=placelesssetup.tearDown))
+ for module in ['zope.app.appsetup.appsetup',]:
+ test = doctest.DocTestSuite(module)
+ test.layer = layer
+ suite.addTest(test)
+ for filename in ['bootstrap.txt', 'product.txt',]:
+ test = doctest.DocFileSuite(filename)
+ test.layer = layer
+ suite.addTest(test)
+
+ test = doctest.DocFileSuite('debug.txt')
+ test.layer = DebugLayer(zope.app.appsetup)
+ suite.addTest(test)
suite.addTest(doctest.DocFileSuite(
- 'bootstrap.txt', 'product.txt',
- setUp=placelesssetup.setUp, tearDown=placelesssetup.tearDown,
- ))
- suite.addTest(doctest.DocFileSuite(
- 'debug.txt',
- setUp=setUpDebug, tearDown=tearDownDebug,
- ))
+ 'testlayer.txt',
+ optionflags=(doctest.ELLIPSIS +
+ doctest.NORMALIZE_WHITESPACE +
+ doctest.REPORT_NDIFF)))
+
return suite
if __name__ == '__main__':
More information about the checkins
mailing list