[Zope-Checkins] CVS: Zope/lib/python/OFS/tests - testProductInit.py:1.2

Chris McDonough chrism at plope.com
Sun Jan 11 10:32:45 EST 2004


Update of /cvs-repository/Zope/lib/python/OFS/tests
In directory cvs.zope.org:/tmp/cvs-serv8959/lib/python/OFS/tests

Added Files:
	testProductInit.py 
Log Message:
Don't throw misleading warnings about duplicate products on product path unless there actually are duplicate products on product path.  Also, add unit tests for product initialization.


=== Zope/lib/python/OFS/tests/testProductInit.py 1.1 => 1.2 ===
--- /dev/null	Sun Jan 11 10:32:45 2004
+++ Zope/lib/python/OFS/tests/testProductInit.py	Sun Jan 11 10:32:45 2004
@@ -0,0 +1,218 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+
+import os, sys, unittest, tempfile, shutil, cStringIO
+
+import ZODB
+from OFS.Application import Application, AppInitializer, get_products
+import Zope.Startup
+import ZConfig
+from App.config import getConfiguration, setConfiguration
+
+TEMPNAME = tempfile.mktemp()
+TEMPPRODUCTS = os.path.join(TEMPNAME, "Products")
+TEMPPRODUCTS2 = os.path.join(TEMPNAME, "Products2")
+FAKEPRODUCTS = ['foo', 'bar', 'bee', 'baz']
+
+cfg = """
+instancehome <<INSTANCE_HOME>>
+products <<PRODUCTS>>
+products <<PRODUCTS2>>
+
+<zodb_db main>
+   mount-point /
+   <mappingstorage>
+      name mappingstorage
+   </mappingstorage>
+</zodb_db>
+"""
+
+dummy_product_init = """
+def initialize(context):
+    f=open('%s', 'w')
+    f.write('didit')
+    f.close()
+misc_ = {'a':1}
+def amethod(self):
+    pass
+methods = {'amethod':amethod}
+__ac_permissions__ = ( ('aPermission', (), () ), )
+meta_types = ( {'name':'grabass', 'action':'amethod'}, )
+"""
+
+def getSchema():
+    startup = os.path.dirname(os.path.realpath(Zope.Startup.__file__))
+    schemafile = os.path.join(startup, 'zopeschema.xml')
+    return ZConfig.loadSchema(schemafile)
+
+def getApp():
+    from ZODB.ZApplication import ZApplicationWrapper
+    DB = getConfiguration().dbtab.getDatabase('/')
+    return ZApplicationWrapper(DB, 'Application', Application, (), 'foo')()
+
+original_config = None
+
+class TestProductInit( unittest.TestCase ):
+    """ Test the application initializer object """
+
+    def setUp(self):
+        global original_config
+        if original_config is None:
+            original_config = getConfiguration()
+        self.schema = getSchema()
+        os.makedirs(TEMPNAME)
+        os.makedirs(TEMPPRODUCTS)
+        os.makedirs(TEMPPRODUCTS2)
+
+    def tearDown(self):
+        import App.config
+        del self.schema
+        App.config.setConfiguration(original_config)
+        shutil.rmtree(TEMPNAME)
+
+    def configure(self, text):
+        # We have to create a directory of our own since the existence
+        # of the directory is checked.  This handles this in a
+        # platform-independent way.
+        schema = self.schema
+        text = text.replace("<<INSTANCE_HOME>>", TEMPNAME)
+        text = text.replace("<<PRODUCTS>>", TEMPPRODUCTS)
+        text = text.replace("<<PRODUCTS2>>", TEMPPRODUCTS2)
+        sio = cStringIO.StringIO(text)
+        conf, handler = ZConfig.loadConfigFile(schema, sio)
+        from Zope.Startup.handlers import handleConfig
+        handleConfig(conf, handler)
+        self.assertEqual(conf.instancehome, TEMPNAME)
+        setConfiguration(conf)
+
+    def makeProduct(self, proddir):
+        os.makedirs(proddir)
+        f = open(os.path.join(proddir, '__init__.py'), 'w')
+        f.write('#foo')
+        f.close()
+
+    def makeFakeProducts(self):
+        for name in FAKEPRODUCTS:
+            proddir = os.path.join(TEMPPRODUCTS, name)
+            self.makeProduct(proddir)
+
+    def test_get_products(self):
+        self.makeFakeProducts()
+        self.configure(cfg)
+        from OFS.Application import get_products
+        names =  [x[1] for x in get_products()]
+        for name in FAKEPRODUCTS:
+            self.assert_(name in names)
+
+    def test_empty_dir_on_products_path_is_not_product(self):
+        self.makeFakeProducts()
+        os.makedirs(os.path.join(TEMPPRODUCTS, 'gleeb'))
+        self.configure(cfg)
+        from OFS.Application import get_products
+        names =  [x[1] for x in get_products()]
+        for name in FAKEPRODUCTS:
+            self.assert_(name in names)
+        self.assert_('gleeb' not in names)
+        
+    def test_file_on_products_path_is_not_product(self):
+        self.makeFakeProducts()
+        f = open(os.path.join(TEMPPRODUCTS, 'README.txt'), 'w')
+        f.write('#foo')
+        f.close()
+        self.configure(cfg)
+        from OFS.Application import get_products
+        names =  [x[1] for x in get_products()]
+        for name in FAKEPRODUCTS:
+            self.assert_(name in names)
+        self.assert_('README.txt' not in names)
+
+    def test_multiple_product_paths(self):
+        self.makeFakeProducts()
+        self.makeProduct(os.path.join(TEMPPRODUCTS2, 'another'))
+        self.configure(cfg)
+        from OFS.Application import get_products
+        names =  [x[1] for x in get_products()]
+        for name in FAKEPRODUCTS:
+            self.assert_(name in names)
+        self.assert_('another' in names)
+
+    def test_import_products(self):
+        self.makeFakeProducts()
+        self.configure(cfg)
+        from OFS.Application import import_products
+        names = import_products()
+        for name in FAKEPRODUCTS:
+            assert name in names
+
+    def test_import_product_throws(self):
+        self.makeProduct(os.path.join(TEMPPRODUCTS, 'abar'))
+        f = open(os.path.join(TEMPPRODUCTS, 'abar', '__init__.py'), 'w')
+        f.write('Syntax Error!')
+        f.close()
+        self.configure(cfg)
+        self.assertRaises(SyntaxError, self.import_bad_product)
+
+    def import_bad_product(self):
+        from OFS.Application import import_product
+        import_product(TEMPPRODUCTS, 'abar', raise_exc=1)
+
+    def test_install_product(self):
+        self.makeProduct(os.path.join(TEMPPRODUCTS, 'abaz'))
+        f = open(os.path.join(TEMPPRODUCTS, 'abaz', '__init__.py'), 'w')
+        doneflag = os.path.join(TEMPPRODUCTS, 'abaz', 'doneflag')
+        f.write(dummy_product_init % doneflag)
+        f.close()
+        self.configure(cfg)
+        from OFS.Application import install_product, get_folder_permissions,\
+             Application
+        import Products
+        from OFS.Folder import Folder
+        app = getApp()
+        meta_types = []
+        install_product(app, TEMPPRODUCTS, 'abaz', meta_types,
+                        get_folder_permissions(), raise_exc=1)
+        # misc_ dictionary is updated
+        self.assert_(Application.misc_.__dict__.has_key('abaz'))
+        # initialize is called
+        self.assert_(os.path.exists(doneflag))
+        # Methods installed into folder
+        self.assert_(hasattr(Folder, 'amethod'))
+        # __ac_permissions__ put into folder
+        self.assert_( ('aPermission', (),)  in
+                       Folder.__ac_permissions__)
+        # Products.meta_types updated
+        self.assert_( {'action': 'amethod', 'product': 'abaz',
+                       'name': 'grabass', 'visibility': 'Global'}
+                      in meta_types)
+
+    def test_install_products(self):
+        self.makeFakeProducts()
+        self.configure(cfg)
+        app = getApp()
+        from OFS.Application import install_products
+        install_products(app)
+        obids = app.Control_Panel.Products.objectIds()
+        for name in FAKEPRODUCTS:
+            assert name in obids
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest( unittest.makeSuite( TestProductInit ) )
+    return suite
+
+def main():
+    unittest.main(defaultTest='test_suite')
+
+if __name__ == '__main__':
+    main()




More information about the Zope-Checkins mailing list