[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