[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