[Checkins] SVN: Products.CMFCore/trunk/ Rip out dependency on DCWorkflow.

Tres Seaver tseaver at palladion.com
Wed Jul 8 11:15:57 EDT 2009


Log message for revision 101749:
  Rip out dependency on DCWorkflow.

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/tests/test_TypesTool.py
  U   Products.CMFCore/trunk/setup.py

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/tests/test_TypesTool.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/tests/test_TypesTool.py	2009-07-08 15:15:29 UTC (rev 101748)
+++ Products.CMFCore/trunk/Products/CMFCore/tests/test_TypesTool.py	2009-07-08 15:15:56 UTC (rev 101749)
@@ -20,51 +20,39 @@
 from Products.CMFCore.testing import FunctionalZCMLLayer
 from Products.CMFCore.tests.base.testcase import SecurityTest
 
-class TypesToolTests(SecurityTest):
+class TypesToolTests(unittest.TestCase):
 
-    layer = FunctionalZCMLLayer
+    def _getTargetClass(self):
+        from Products.CMFCore.TypesTool import TypesTool
+        return TypesTool
 
     def _makeOne(self):
-        from Products.CMFCore.TypesTool import TypesTool
+        return self._getTargetClass()()
 
-        return TypesTool()
+    def test_class_conforms_to_IActionProvider(self):
+        from zope.interface.verify import verifyClass
+        from Products.CMFCore.interfaces import IActionProvider
+        verifyClass(IActionProvider, self._getTargetClass())
 
-    def setUp(self):
-        from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
-        from Products.CMFCore.tests.base.dummy import DummySite
-        from Products.CMFCore.tests.base.dummy import DummyUserFolder
-        from Products.CMFCore.tests.base.tidata import FTIDATA_DUMMY
-        SecurityTest.setUp(self)
-        self.site = DummySite('site').__of__(self.root)
-        self.acl_users = self.site._setObject( 'acl_users', DummyUserFolder() )
-        self.ttool = self.site._setObject( 'portal_types', self._makeOne() )
-        fti = FTIDATA_DUMMY[0].copy()
-        self.ttool._setObject( 'Dummy Content', FTI(**fti) )
-        
-        # setup workflow tool
-        # to test 'Instance creation conditions' of workflows
-        from Products.CMFCore.WorkflowTool import WorkflowTool
-        self.site._setObject( 'portal_workflow', WorkflowTool() )
-        wftool = self.site.portal_workflow
+    def test_instance_conforms_to_IActionProvider(self):
+        from zope.interface.verify import verifyObject
+        from Products.CMFCore.interfaces import IActionProvider
+        verifyObject(IActionProvider, self._makeOne())
 
-        from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition
-        wftool._setObject('wf', DCWorkflowDefinition('wf'))
-        wftool.setDefaultChain('wf')
-        wf = wftool.wf
-        wf.states.addState('initial')
-        wf.states.setInitialState('initial')
+    def test_class_conforms_to_ITypesTool(self):
+        from zope.interface.verify import verifyClass
+        from Products.CMFCore.interfaces import IActionProvider
+        verifyClass(IActionProvider, self._getTargetClass())
 
-        from Products.DCWorkflow.Guard import Guard
-        g = Guard()
-        wf.creation_guard = g
-        
+    def test_instance_conforms_to_ITypesTool(self):
+        from zope.interface.verify import verifyObject
+        from Products.CMFCore.interfaces import IActionProvider
+        verifyObject(IActionProvider, self._makeOne())
 
-    def tearDown(self):
-        SecurityTest.tearDown(self)
-
-    def _makeDummyTypeInfo(self):
+    def test_listActions_passes_all_context_information_to_TIs(self):
         from zope.interface import implements
         from Products.CMFCore.interfaces import ITypeInformation
+        from Products.CMFCore.tests.base.dummy import DummyContent
 
         class ActionTesterTypeInfo:
             implements(ITypeInformation)
@@ -75,42 +63,42 @@
                 self._action_obj = obj
                 return ()
 
-        return ActionTesterTypeInfo()
-
-    def test_interfaces(self):
-        from Products.CMFCore.interfaces import IActionProvider
-        from Products.CMFCore.interfaces import ITypesTool
-        from Products.CMFCore.TypesTool import TypesTool
-        from zope.interface.verify import verifyClass
-
-        verifyClass(IActionProvider, TypesTool)
-        verifyClass(ITypesTool, TypesTool)
-
-    def test_listActions(self):
-        """test that a full set of context information is passed
-           by the types tool
-        """
-        from Products.CMFCore.tests.base.dummy import DummyContent
-        tool = self.ttool
-        ti = self._makeDummyTypeInfo()
+        ti = ActionTesterTypeInfo()
+        tool = self._makeOne()
         setattr( tool, 'Dummy Content', ti )
 
-        dummy = self.site._setObject('dummy', DummyContent('dummy'))
+        dummy = DummyContent('dummy')
         tool.listActions('fake_info', dummy)
 
         self.assertEqual(ti._action_info, 'fake_info')
         self.assertEqual(ti._action_obj, dummy)
 
+class TypesToolFunctionalTests(SecurityTest):
+
+    layer = FunctionalZCMLLayer
+
+    def _getTargetClass(self):
+        from Products.CMFCore.TypesTool import TypesTool
+        return TypesTool
+
+    def _makeOne(self):
+        return self._getTargetClass()()
+
+    def _makeSite(self):
+        from Products.CMFCore.tests.base.dummy import DummySite
+        from Products.CMFCore.tests.base.dummy import DummyUserFolder
+        site = DummySite('site')
+        site.acl_users = DummyUserFolder()
+        return site
+
     def test_allMetaTypes(self):
-        """
-        Test that everything returned by allMetaTypes can be
-        traversed to.
-        """
+        # everything returned by allMetaTypes can be traversed to.
         from Acquisition import aq_base
         from Products.PythonScripts.standard import html_quote
         from webdav.NullResource import NullResource
-        tool = self.ttool
-        meta_types={}
+        site = self._makeSite().__of__(self.root)
+        tool = self._makeOne().__of__(site)
+        meta_types = {}
         # Seems we get NullResource if the method couldn't be traverse to
         # so we check for that. If we've got it, something is b0rked.
         for factype in tool.all_meta_types():
@@ -124,68 +112,166 @@
         self.failUnless(meta_types.has_key('Scriptable Type Information'))
         self.failUnless(meta_types.has_key('Factory-based Type Information'))
 
-    def test_constructContent(self):
+    def test_constructContent_simple_FTI(self):
         from AccessControl.SecurityManagement import newSecurityManager
         from AccessControl.SecurityManager import setSecurityPolicy
-        from AccessControl.unauthorized import Unauthorized
-        from Products.PythonScripts.PythonScript import PythonScript
+        from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
+        from Products.CMFCore.tests.base.dummy import DummyFolder
+        from Products.CMFCore.tests.base.tidata import FTIDATA_DUMMY
+        site = self._makeSite().__of__(self.root)
+        acl_users = site.acl_users
+        setSecurityPolicy(self._oldPolicy)
+        newSecurityManager(None, acl_users.all_powerful_Oz)
+        tool = self._makeOne().__of__(site)
+        fti = FTIDATA_DUMMY[0].copy()
+        tool._setObject('Dummy Content', FTI(**fti))
+        folder = DummyFolder(id='folder', fake_product=1).__of__(site)
+
+        tool.constructContent('Dummy Content', container=folder, id='page1')
+
+        self.assertEqual(folder.page1.portal_type, 'Dummy Content')
+
+    def test_constructContent_FTI_w_wftool_no_workflows(self):
+        from AccessControl.SecurityManagement import newSecurityManager
+        from AccessControl.SecurityManager import setSecurityPolicy
+        from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
+        from Products.CMFCore.tests.base.dummy import DummyFolder
+        from Products.CMFCore.tests.base.tidata import FTIDATA_DUMMY
+        site = self._makeSite().__of__(self.root)
+        acl_users = site.acl_users
+        setSecurityPolicy(self._oldPolicy)
+        newSecurityManager(None, acl_users.all_powerful_Oz)
+        tool = self._makeOne().__of__(site)
+        fti = FTIDATA_DUMMY[0].copy()
+        tool._setObject('Dummy Content', FTI(**fti))
+        folder = DummyFolder(id='folder', fake_product=1).__of__(site)
+        tool.portal_workflow = DummyWorkflowTool()
+
+        tool.constructContent('Dummy Content', container=folder, id='page1')
+
+        self.assertEqual(folder.page1.portal_type, 'Dummy Content')
+
+    def test_constructContent_FTI_w_wftool_w_workflow_no_guard(self):
+        from AccessControl.SecurityManagement import newSecurityManager
+        from AccessControl.SecurityManager import setSecurityPolicy
+        from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
+        from Products.CMFCore.tests.base.dummy import DummyFolder
+        from Products.CMFCore.tests.base.tidata import FTIDATA_DUMMY
+        site = self._makeSite().__of__(self.root)
+        acl_users = site.acl_users
+        setSecurityPolicy(self._oldPolicy)
+        newSecurityManager(None, acl_users.all_powerful_Oz)
+        tool = self._makeOne().__of__(site)
+        fti = FTIDATA_DUMMY[0].copy()
+        tool._setObject('Dummy Content', FTI(**fti))
+        folder = DummyFolder(id='folder', fake_product=1).__of__(site)
+        tool.portal_workflow = DummyWorkflowTool(object())
+
+        tool.constructContent('Dummy Content', container=folder, id='page1')
+
+        self.assertEqual(folder.page1.portal_type, 'Dummy Content')
+
+    def test_constructContent_FTI_w_wftool_w_workflow_w_guard_allows(self):
+        from AccessControl.SecurityManagement import newSecurityManager
+        from AccessControl.SecurityManager import setSecurityPolicy
+        from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
+        from Products.CMFCore.tests.base.dummy import DummyFolder
+        from Products.CMFCore.tests.base.tidata import FTIDATA_DUMMY
+        site = self._makeSite().__of__(self.root)
+        acl_users = site.acl_users
+        setSecurityPolicy(self._oldPolicy)
+        newSecurityManager(None, acl_users.all_powerful_Oz)
+        tool = self._makeOne().__of__(site)
+        fti = FTIDATA_DUMMY[0].copy()
+        tool._setObject('Dummy Content', FTI(**fti))
+        folder = DummyFolder(id='folder', fake_product=1).__of__(site)
+        tool.portal_workflow = DummyWorkflowTool(DummyWorkflow(True))
+
+        tool.constructContent('Dummy Content', container=folder, id='page1')
+
+        self.assertEqual(folder.page1.portal_type, 'Dummy Content')
+
+    def test_constructContent_FTI_w_wftool_w_workflow_w_guard_denies(self):
+        from AccessControl import Unauthorized
+        from AccessControl.SecurityManagement import newSecurityManager
+        from AccessControl.SecurityManager import setSecurityPolicy
+        from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
+        from Products.CMFCore.tests.base.dummy import DummyFolder
+        from Products.CMFCore.tests.base.tidata import FTIDATA_DUMMY
+        site = self._makeSite().__of__(self.root)
+        acl_users = site.acl_users
+        setSecurityPolicy(self._oldPolicy)
+        newSecurityManager(None, acl_users.all_powerful_Oz)
+        tool = self._makeOne().__of__(site)
+        fti = FTIDATA_DUMMY[0].copy()
+        tool._setObject('Dummy Content', FTI(**fti))
+        folder = DummyFolder(id='folder', fake_product=1).__of__(site)
+        tool.portal_workflow = DummyWorkflowTool(DummyWorkflow(False))
+
+        self.assertRaises(Unauthorized,
+                          tool.constructContent,
+                          'Dummy Content', container=folder, id='page1')
+
+    def test_constructContent_simple_STI(self):
+        from AccessControl import Unauthorized
+        from AccessControl.SecurityManagement import newSecurityManager
+        from AccessControl.SecurityManager import setSecurityPolicy
         from Products.CMFCore.PortalFolder import PortalFolder
         from Products.CMFCore.TypesTool \
                 import ScriptableTypeInformation as STI
         from Products.CMFCore.tests.base.dummy import DummyFactoryDispatcher
         from Products.CMFCore.tests.base.tidata import STI_SCRIPT
-
-        site = self.site
-        acl_users = self.acl_users
-        ttool = self.ttool
+        from Products.PythonScripts.PythonScript import PythonScript
+        site = self._makeSite().__of__(self.root)
+        acl_users = site.acl_users
         setSecurityPolicy(self._oldPolicy)
         newSecurityManager(None, acl_users.all_powerful_Oz)
-        self.site._owner = (['acl_users'], 'all_powerful_Oz')
+        tool = self._makeOne().__of__(site)
         sti_baz = STI('Baz',
                       permission='Add portal content',
                       constructor_path='addBaz')
-        ttool._setObject('Baz', sti_baz)
-        ttool._setObject( 'addBaz',  PythonScript('addBaz') )
-        s = ttool.addBaz
-        s.write(STI_SCRIPT)
+        tool._setObject('Baz', sti_baz)
+        script = PythonScript('addBaz')
+        script.write(STI_SCRIPT)
+        tool._setObject('addBaz',  script)
+        folder = site._setObject( 'folder', PortalFolder(id='folder') )
+        folder.manage_addProduct = {'FooProduct':
+                                        DummyFactoryDispatcher(folder) }
+        folder._owner = (['acl_users'], 'user_foo')
+        self.assertEqual( folder.getOwner(), acl_users.user_foo )
 
-        f = site._setObject( 'folder', PortalFolder(id='folder') )
-        f.manage_addProduct = { 'FooProduct' : DummyFactoryDispatcher(f) }
-        f._owner = (['acl_users'], 'user_foo')
-        self.assertEqual( f.getOwner(), acl_users.user_foo )
-
-        ttool.constructContent('Dummy Content', container=f, id='page1')
         try:
-            ttool.constructContent('Baz', container=f, id='page2')
+            tool.constructContent('Baz', container=folder, id='page2')
         except Unauthorized:
             self.fail('CMF Collector issue #165 (Ownership bug): '
                       'Unauthorized raised' )
 
-        wf = site.portal_workflow.wf
-        wf.creation_guard.changeFromProperties({'guard_expr':'python:False'})
-        try :
-            ttool.constructContent('Dummy Content', container=f, id='page3')
-        except Unauthorized, e :
-            self.assertEqual(str(e), "Cannot create Dummy Content")
-        else :
-            self.fail("workflow 'Instance creation conditions' does not work")
-        
-        wf.manager_bypass = 1
-        try :
-            ttool.constructContent('Dummy Content', container=f, id='page4')
-        except Unauthorized:
-            self.fail("manager may bypass 'Instance creation conditions'")
+        self.assertEqual(folder.page2.portal_type, 'Baz')
 
 
 class TypeInfoTests:
+    # Subclass must define _getTargetClass
 
+    def _makeOne(self, id='test', **kw):
+        return self._getTargetClass()(id, **kw)
+
     def _makeTypesTool(self):
         from Products.CMFCore.TypesTool import TypesTool
 
         return TypesTool()
 
+    def test_class_conforms_to_ITypeInformation(self):
+        from zope.interface.verify import verifyClass
+        from Products.CMFCore.interfaces import ITypeInformation
+        verifyClass(ITypeInformation, self._getTargetClass())
+
+    def test_instance_conforms_to_ITypeInformation(self):
+        from zope.interface.verify import verifyObject
+        from Products.CMFCore.interfaces import ITypeInformation
+        verifyObject(ITypeInformation, self._makeOne())
+
     def test_construction( self ):
-        ti = self._makeInstance( 'Foo'
+        ti = self._makeOne( 'Foo'
                                , description='Description'
                                , meta_type='Foo'
                                , icon='foo.gif'
@@ -197,14 +283,14 @@
         self.assertEqual( ti.getIcon(), 'foo.gif' )
         self.assertEqual( ti.immediate_view, '' )
 
-        ti = self._makeInstance( 'Foo'
+        ti = self._makeOne( 'Foo'
                                , immediate_view='foo_view'
                                )
         self.assertEqual( ti.immediate_view, 'foo_view' )
 
     def _makeAndSetInstance(self, id, **kw):
         tool = self.tool
-        t = self._makeInstance(id, **kw)
+        t = self._makeOne(id, **kw)
         tool._setObject(id,t)
         return tool[id]
 
@@ -246,18 +332,18 @@
         self.failUnless ( taf2.allowType( 'Not Hidden') )
 
     def test_allowDiscussion( self ):
-        ti = self._makeInstance( 'Foo' )
+        ti = self._makeOne( 'Foo' )
         self.failIf( ti.allowDiscussion() )
 
-        ti = self._makeInstance( 'Foo', allow_discussion=1 )
+        ti = self._makeOne( 'Foo', allow_discussion=1 )
         self.failUnless( ti.allowDiscussion() )
 
     def test_listActions( self ):
         from Products.CMFCore.tests.base.tidata import FTIDATA_ACTIONS
-        ti = self._makeInstance( 'Foo' )
+        ti = self._makeOne( 'Foo' )
         self.failIf( ti.listActions() )
 
-        ti = self._makeInstance( **FTIDATA_ACTIONS[0] )
+        ti = self._makeOne( **FTIDATA_ACTIONS[0] )
         actions = ti.listActions()
         self.failUnless( actions )
 
@@ -282,7 +368,7 @@
 
     def test_MethodAliases_methods(self):
         from Products.CMFCore.tests.base.tidata import FTIDATA_CMF15
-        ti = self._makeInstance( **FTIDATA_CMF15[0] )
+        ti = self._makeOne( **FTIDATA_CMF15[0] )
         self.assertEqual( ti.getMethodAliases(), FTIDATA_CMF15[0]['aliases'] )
         self.assertEqual( ti.queryMethodID('view'), 'dummy_view' )
         self.assertEqual( ti.queryMethodID('view.html'), 'dummy_view' )
@@ -300,7 +386,7 @@
                    'icon_expr' : 'string:${portal_url}/foo_icon_expr.gif',
                    'add_view_expr': 'string:${folder_url}/foo_add_view',
                    'link_target': '_new'}
-        ti = self._makeInstance(**ti_data)
+        ti = self._makeOne(**ti_data)
         info_data = ti.getInfoData()
         self.assertEqual(len(info_data), 2)
 
@@ -327,7 +413,7 @@
                    'description': 'Foo objects are just used for testing.',
                    'content_meta_type': 'Foo Content',
                    'factory' : 'cmf.foo'}
-        ti = self._makeInstance(**ti_data)
+        ti = self._makeOne(**ti_data)
         info_data = ti.getInfoData()
         self.assertEqual(len(info_data), 2)
 
@@ -385,51 +471,35 @@
 
 class FTIDataTests( TypeInfoTests, unittest.TestCase ):
 
-    def _makeInstance(self, id, **kw):
+    def _getTargetClass(self):
         from Products.CMFCore.TypesTool import FactoryTypeInformation
+        return FactoryTypeInformation
 
-        return FactoryTypeInformation(id, **kw)
-
-    def test_interfaces(self):
-        from Products.CMFCore.interfaces import ITypeInformation
-        from Products.CMFCore.TypesTool import FactoryTypeInformation
-        from zope.interface.verify import verifyClass
-
-        verifyClass(ITypeInformation, FactoryTypeInformation)
-
     def test_properties( self ):
-        ti = self._makeInstance( 'Foo' )
+        ti = self._makeOne( 'Foo' )
         self.assertEqual( ti.product, '' )
         self.assertEqual( ti.factory, '' )
 
-        ti = self._makeInstance( 'Foo'
-                               , product='FooProduct'
-                               , factory='addFoo'
-                               )
+        ti = self._makeOne('Foo'
+                          , product='FooProduct'
+                          , factory='addFoo'
+                          )
         self.assertEqual( ti.product, 'FooProduct' )
         self.assertEqual( ti.factory, 'addFoo' )
 
 
 class STIDataTests( TypeInfoTests, unittest.TestCase ):
 
-    def _makeInstance(self, id, **kw):
+    def _getTargetClass(self):
         from Products.CMFCore.TypesTool import ScriptableTypeInformation
+        return ScriptableTypeInformation
 
-        return ScriptableTypeInformation(id, **kw)
-
-    def test_interfaces(self):
-        from Products.CMFCore.interfaces import ITypeInformation
-        from Products.CMFCore.TypesTool import ScriptableTypeInformation
-        from zope.interface.verify import verifyClass
-
-        verifyClass(ITypeInformation, ScriptableTypeInformation)
-
     def test_properties( self ):
-        ti = self._makeInstance( 'Foo' )
+        ti = self._makeOne( 'Foo' )
         self.assertEqual( ti.permission, '' )
         self.assertEqual( ti.constructor_path, '' )
 
-        ti = self._makeInstance( 'Foo'
+        ti = self._makeOne( 'Foo'
                                , permission='Add Foos'
                                , constructor_path='foo_add'
                                )
@@ -441,7 +511,6 @@
 
     def _getTargetClass(self):
         from Products.CMFCore.TypesTool import FactoryTypeInformation
-
         return FactoryTypeInformation
 
     def _makeOne(self, *args, **kw):
@@ -663,10 +732,27 @@
         self.failUnless(IContainerModifiedEvent.providedBy(evt))
         self.assertEquals(evt.object, self.f)
 
+class DummyWorkflowTool:
 
+    def __init__(self, *workflows):
+        self._workflows = workflows
+
+    def getWorkflowsFor(self, type_id):
+        return self._workflows
+
+class DummyWorkflow:
+
+    def __init__(self, allow):
+        self._allow = allow
+
+    def allowCreate(self, container, type_id):
+        return self._allow
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TypesToolTests),
+        unittest.makeSuite(TypesToolFunctionalTests),
         unittest.makeSuite(FTIDataTests),
         unittest.makeSuite(STIDataTests),
         unittest.makeSuite(FTIOldstyleConstructionTests),

Modified: Products.CMFCore/trunk/setup.py
===================================================================
--- Products.CMFCore/trunk/setup.py	2009-07-08 15:15:29 UTC (rev 101748)
+++ Products.CMFCore/trunk/setup.py	2009-07-08 15:15:56 UTC (rev 101749)
@@ -52,11 +52,7 @@
           ],
       tests_require=[
           'zope.testing >= 3.7.0',
-          'Products.DCWorkflow',
           ],
-      extras_require = dict(
-          test = ['Products.DCWorkflow'],
-          ),
       test_loader='zope.testing.testrunner.eggsupport:SkipLayers',
       test_suite='Products.%s' % NAME,
       entry_points="""



More information about the Checkins mailing list