[CMF-checkins] CVS: Products/CMFCore/tests - test_PortalFolder.py:1.36

Yvo Schubbe y.2004_ at wcm-solutions.de
Tue Aug 24 15:16:33 EDT 2004


Update of /cvs-repository/Products/CMFCore/tests
In directory cvs.zope.org:/tmp/cvs-serv5307/CMFCore/tests

Modified Files:
	test_PortalFolder.py 
Log Message:
- added listDAVObjects
- refactored and added some PortalFolder tests


=== Products/CMFCore/tests/test_PortalFolder.py 1.35 => 1.36 ===
--- Products/CMFCore/tests/test_PortalFolder.py:1.35	Mon Aug  9 14:47:48 2004
+++ Products/CMFCore/tests/test_PortalFolder.py	Tue Aug 24 15:16:32 2004
@@ -1,25 +1,43 @@
+##############################################################################
+#
+# Copyright (c) 2001 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.
+#
+##############################################################################
+""" Unit tests for PortalFolder module.
+
+$Id$
+"""
+
 from unittest import TestCase, TestSuite, makeSuite, main
 import Testing
 import Zope
 Zope.startup()
-  
+from Interface.Verify import verifyClass
+
 import cStringIO
 
 from AccessControl import SecurityManager
-from Acquisition import Implicit
 from Acquisition import aq_base
+from Acquisition import Implicit
 from DateTime import DateTime
-from webdav.WriteLockInterface import WriteLockInterface
 from OFS.Application import Application
 from OFS.Image import manage_addFile
 from OFS.tests.testCopySupport import makeConnection
 from Testing.makerequest import makerequest
 
 from Products.CMFCore.CatalogTool import CatalogTool
-from Products.CMFCore.interfaces.Dynamic import DynamicType as IDynamicType
+from Products.CMFCore.exceptions import BadRequest
 from Products.CMFCore.tests.base.dummy import DummyContent
 from Products.CMFCore.tests.base.dummy import DummyFactory
-from Products.CMFCore.tests.base.security import OmnipotentUser
+from Products.CMFCore.tests.base.dummy import DummySite
+from Products.CMFCore.tests.base.dummy import DummyUserFolder
 from Products.CMFCore.tests.base.testcase import newSecurityManager
 from Products.CMFCore.tests.base.testcase import noSecurityManager
 from Products.CMFCore.tests.base.testcase import SecurityTest
@@ -27,7 +45,6 @@
 from Products.CMFCore.tests.base.utils import has_path
 from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI
 from Products.CMFCore.TypesTool import TypesTool
-from Products.CMFCore.exceptions import BadRequest
 
 
 def extra_meta_types():
@@ -92,76 +109,108 @@
                          , type_name='Dummy Content', id='foo' )
 
 
-class PortalFolderTests( SecurityTest ):
+class PortalFolderTests(SecurityTest):
 
-    def setUp( self ):
-        from Products.CMFCore.PortalFolder import PortalFolder
+    def setUp(self):
         SecurityTest.setUp(self)
+        self.site = DummySite('site').__of__(self.root)
 
-        root = self.root
-        root._setObject( 'test', PortalFolder( 'test','' ) )
+    def _makeOne(self, id, *args, **kw):
+        from Products.CMFCore.PortalFolder import PortalFolder
 
-    def test_deletePropagation( self ):
+        return self.site._setObject( id, PortalFolder(id, *args, **kw) )
 
-        test = self.root.test
-        foo = DummyContent( 'foo' )
+    def test_contents_methods(self):
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
+        f = self._makeOne('foo')
+        self.assertEqual( f.objectValues(), [] )
+        self.assertEqual( f.contentIds(), [] )
+        self.assertEqual( f.contentItems(), [] )
+        self.assertEqual( f.contentValues(), [] )
+        self.assertEqual( f.listFolderContents(), [] )
+        self.assertEqual( f.listDAVObjects(), [] )
+
+        f._setObject('sub1', DummyContent('sub1') )
+        self.assertEqual( f.objectValues(), [f.sub1] )
+        self.assertEqual( f.contentIds(), [] )
+        self.assertEqual( f.contentItems(), [] )
+        self.assertEqual( f.contentValues(), [] )
+        self.assertEqual( f.listFolderContents(), [] )
+        self.assertEqual( f.listDAVObjects(), [f.sub1] )
 
+        fti = FTIDATA_DUMMY[0].copy()
+        ttool._setObject( 'Dummy Content', FTI(**fti) )
+        self.assertEqual( f.objectValues(), [f.sub1] )
+        self.assertEqual( f.contentIds(), ['sub1'] )
+        self.assertEqual( f.contentItems(), [ ('sub1', f.sub1) ] )
+        self.assertEqual( f.contentValues(), [f.sub1] )
+        self.assertEqual( f.listFolderContents(), [f.sub1] )
+        self.assertEqual( f.listDAVObjects(), [f.sub1] )
+
+        f._setObject('hidden_sub2', DummyContent('hidden_sub2') )
+        self.assertEqual( f.objectValues(), [f.sub1, f.hidden_sub2] )
+        self.assertEqual( f.contentIds(), ['sub1', 'hidden_sub2'] )
+        self.assertEqual( f.contentItems(), [ ('sub1', f.sub1),
+                                            ('hidden_sub2', f.hidden_sub2) ] )
+        self.assertEqual( f.contentValues(), [f.sub1, f.hidden_sub2] )
+        self.assertEqual( f.listFolderContents(), [f.sub1] )
+        self.assertEqual( f.listDAVObjects(), [f.sub1, f.hidden_sub2] )
+
+    def test_deletePropagation(self):
+        test = self._makeOne('test')
+        foo = DummyContent('foo')
         foo.reset()
-        assert not foo.after_add_called
-        assert not foo.before_delete_called
-        test._setObject( 'foo', foo )
-        assert foo.after_add_called
-        assert not foo.before_delete_called
+        self.failIf( foo.after_add_called )
+        self.failIf( foo.before_delete_called )
 
-        foo.reset()
-        test._delObject( 'foo' )
-        assert not foo.after_add_called
-        assert foo.before_delete_called
+        test._setObject('foo', foo)
+        self.failUnless( foo.after_add_called )
+        self.failIf( foo.before_delete_called )
 
         foo.reset()
-        test._setObject( 'foo', foo )
-        test._delOb( 'foo' )    # doesn't propagate
-        assert foo.after_add_called
-        assert not foo.before_delete_called
+        test._delObject('foo')
+        self.failIf( foo.after_add_called )
+        self.failUnless( foo.before_delete_called )
 
-    def test_manageDelObjects( self ):
-
-        test = self.root.test
-        foo = DummyContent( 'foo' )
+        foo.reset()
+        test._setObject('foo', foo)
+        test._delOb('foo')    # doesn't propagate
+        self.failUnless( foo.after_add_called )
+        self.failIf( foo.before_delete_called )
+
+    def test_manageDelObjects(self):
+        test = self._makeOne('test')
+        foo = DummyContent('foo')
 
-        test._setObject( 'foo', foo )
+        test._setObject('foo', foo)
         foo.reset()
-        test.manage_delObjects( ids=[ 'foo' ] )
-        assert not foo.after_add_called
-        assert foo.before_delete_called
+        test.manage_delObjects( ids=['foo'] )
+        self.failIf( foo.after_add_called )
+        self.failUnless( foo.before_delete_called )
 
-    def test_catalogUnindexAndIndex( self ):
+    def test_catalogUnindexAndIndex(self):
         #
         # Test is a new object does get cataloged upon _setObject
         # and uncataloged upon manage_deleteObjects
         #
-        test = self.root.test
-
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.root.portal_types
-
-        self.root._setObject( 'portal_catalog', CatalogTool() )
-        catalog = self.root.portal_catalog
-        assert len( catalog ) == 0
+        test = self._makeOne('test')
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
+        ctool = self.site._setObject( 'portal_catalog', CatalogTool() )
+        self.assertEqual( len(ctool), 0 )
 
         test._setObject( 'foo', DummyContent( 'foo' , catalog=1 ) )
         foo = test.foo
-        assert foo.after_add_called
-        assert not foo.before_delete_called
-        assert len( catalog ) == 1
+        self.failUnless( foo.after_add_called )
+        self.failIf( foo.before_delete_called )
+        self.assertEqual( len(ctool), 1 )
 
         foo.reset()
-        test._delObject( 'foo' )
-        assert not foo.after_add_called
-        assert foo.before_delete_called
-        assert len( catalog ) == 0
+        test._delObject('foo')
+        self.failIf( foo.after_add_called )
+        self.failUnless( foo.before_delete_called )
+        self.assertEqual( len(ctool), 0 )
 
-    def test_tracker261( self ):
+    def test_tracker261(self):
 
         #
         #   Tracker issue #261 says that content in a deleted folder
@@ -170,14 +219,10 @@
         #
         from Products.CMFCore.PortalFolder import PortalFolder
 
-        test = self.root.test
-
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.root.portal_types
-
-        self.root._setObject( 'portal_catalog', CatalogTool() )
-        catalog = self.root.portal_catalog
-        assert len( catalog ) == 0
+        test = self._makeOne('test')
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
+        ctool = self.site._setObject( 'portal_catalog', CatalogTool() )
+        self.assertEqual( len(ctool), 0 )
 
         test._setObject( 'sub', PortalFolder( 'sub', '' ) )
         sub = test.sub
@@ -185,115 +230,52 @@
         sub._setObject( 'foo', DummyContent( 'foo', catalog=1 ) )
         foo = sub.foo
 
-        assert foo.after_add_called
-        assert not foo.before_delete_called
-        assert len( catalog ) == 1
+        self.failUnless( foo.after_add_called )
+        self.failIf( foo.before_delete_called )
+        self.assertEqual( len(ctool), 1 )
 
         foo.reset()
-        test.manage_delObjects( ids=[ 'sub' ] )
-        assert not foo.after_add_called
-        assert foo.before_delete_called
-        assert len( catalog ) == 0
-
-    def test_tracker215( self ):
-        self.failUnless(IDynamicType.isImplementedBy(self.root.test))
-        self.failUnless(WriteLockInterface.isImplementedBy(self.root.test))
+        test.manage_delObjects( ids=['sub'] )
+        self.failIf( foo.after_add_called )
+        self.failUnless( foo.before_delete_called )
+        self.assertEqual( len(ctool), 0 )
 
-    def test_folderMove( self ):
-        #
-        #   Does the catalog stay synched when folders are moved?
-        #
-        from Products.CMFCore.PortalFolder import PortalFolder
-
-        test = self.root.test
-
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.root.portal_types
-
-        self.root._setObject( 'portal_catalog', CatalogTool() )
-        catalog = self.root.portal_catalog
-        assert len( catalog ) == 0
-
-        test._setObject( 'folder', PortalFolder( 'folder', '' ) )
-        folder = test.folder
-
-        folder._setObject( 'sub', PortalFolder( 'sub', '' ) )
-        sub = folder.sub
-
-        sub._setObject( 'foo', DummyContent( 'foo', catalog=1 ) )
-        foo = sub.foo
-        assert len( catalog ) == 1
-        self.failUnless( 'foo' in catalog.uniqueValuesFor('getId') )
-        assert has_path( catalog._catalog, '/test/folder/sub/foo' )
-
-        get_transaction().commit(1)
-        folder.manage_renameObject(id='sub', new_id='new_sub')
-
-        self.failUnless( 'foo' in catalog.uniqueValuesFor('getId') )
-        assert len( catalog ) == 1
-        assert has_path( catalog._catalog, '/test/folder/new_sub/foo' )
-
-        folder._setObject( 'bar', DummyContent( 'bar', catalog=1 ) )
-        bar = folder.bar
-        self.failUnless( 'bar' in catalog.uniqueValuesFor('getId') )
-        assert len( catalog ) == 2
-        assert has_path( catalog._catalog, '/test/folder/bar' )
-
-        folder._setObject( 'sub2', PortalFolder( 'sub2', '' ) )
-        sub2 = folder.sub2
-        # Waaa! force sub2 to allow paste of Dummy object.
-        sub2.all_meta_types = []
-        sub2.all_meta_types.extend( sub2.all_meta_types )
-        sub2.all_meta_types.extend( extra_meta_types() )
-
-        get_transaction().commit(1)
-        cookie = folder.manage_cutObjects(ids=['bar'])
-        sub2.manage_pasteObjects(cookie)
-
-        self.failUnless( 'foo' in catalog.uniqueValuesFor('getId') )
-        self.failUnless( 'bar' in catalog.uniqueValuesFor('getId') )
-        assert len( catalog ) == 2
-        assert has_path( catalog._catalog, '/test/folder/sub2/bar' )
-
-    def test_manageAddFolder( self ):
+    def test_manageAddFolder(self):
         #
         #   Does MKDIR/MKCOL intercept work?
         #
         from Products.CMFCore.PortalFolder import PortalFolder
 
-        test = self.root.test
-        test._setPortalTypeName( 'Folder' )
-        self.root.reindexObject = lambda: 0
+        test = self._makeOne('test')
 
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.root.portal_types
-        types_tool._setObject( 'Folder'
-                             , FTI( id='Folder'
-                                  , title='Folder or Directory'
-                                  , meta_type=PortalFolder.meta_type
-                                  , product='CMFCore'
-                                  , factory='manage_addPortalFolder'
-                                  , filter_content_types=0
-                                  )
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
+        ttool._setObject( 'Folder'
+                        , FTI( id='Folder'
+                             , title='Folder or Directory'
+                             , meta_type=PortalFolder.meta_type
+                             , product='CMFCore'
+                             , factory='manage_addPortalFolder'
+                             , filter_content_types=0
                              )
-        types_tool._setObject( 'Grabbed'
-                             , FTI( 'Grabbed'
-                                  , title='Grabbed Content'
-                                  , meta_type=PortalFolder.meta_type
-                                  , product='CMFCore'
-                                  , factory='manage_addPortalFolder'
-                                  )
+                        )
+        ttool._setObject( 'Grabbed'
+                        , FTI( 'Grabbed'
+                             , title='Grabbed Content'
+                             , meta_type=PortalFolder.meta_type
+                             , product='CMFCore'
+                             , factory='manage_addPortalFolder'
                              )
+                        )
 
         # First, test default behavior
-        test.manage_addFolder( id='simple', title='Simple' )
+        test.manage_addFolder(id='simple', title='Simple')
         self.assertEqual( test.simple.getPortalTypeName(), 'Folder' )
         self.assertEqual( test.simple.Type(), 'Folder or Directory' )
         self.assertEqual( test.simple.getId(), 'simple' )
         self.assertEqual( test.simple.Title(), 'Simple' )
 
         # Now, test overridden behavior
-        types_tool.Folder.setMethodAliases( {'mkdir': 'grabbed'} )
+        ttool.Folder.setMethodAliases( {'mkdir': 'grabbed'} )
 
         class Grabbed:
 
@@ -307,119 +289,36 @@
                 self._context._setOb( id, PortalFolder( id ) )
                 self._context._getOb( id )._setPortalTypeName( 'Grabbed' )
 
-        self.root.grabbed = Grabbed( test )
+        self.root.grabbed = Grabbed(test)
 
-        test.manage_addFolder( id='indirect', title='Indirect' )
+        test.manage_addFolder(id='indirect', title='Indirect')
         self.assertEqual( test.indirect.getPortalTypeName(), 'Grabbed' )
         self.assertEqual( test.indirect.Type(), 'Grabbed Content' )
         self.assertEqual( test.indirect.getId(), 'indirect' )
         self.assertEqual( test.indirect.Title(), 'Indirect' )
 
-    def test_contentPaste( self ):
-        #
-        #   Does copy / paste work?
-        #
-        from Products.CMFCore.PortalFolder import PortalFolder
-
-        test = self.root.test
-
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.root.portal_types
-        fti = FTIDATA_DUMMY[0].copy()
-        types_tool._setObject( 'Dummy Content', FTI(**fti) )
-
-        self.root._setObject( 'portal_catalog', CatalogTool() )
-        catalog = self.root.portal_catalog
-        assert len( catalog ) == 0
-
-        test._setObject( 'sub1', PortalFolder( 'sub1', '' ) )
-        sub1 = test.sub1
-
-        test._setObject( 'sub2', PortalFolder( 'sub2', '' ) )
-        sub2 = test.sub2
-
-        test._setObject( 'sub3', PortalFolder( 'sub3', '' ) )
-        sub3 = test.sub3
-
-        sub1._setObject( 'dummy', DummyContent( 'dummy', catalog=1 ) )
-        dummy = sub1.dummy
-
-        assert 'dummy' in sub1.objectIds()
-        assert 'dummy' in sub1.contentIds()
-        assert not 'dummy' in sub2.objectIds()
-        assert not 'dummy' in sub2.contentIds()
-        assert not 'dummy' in sub3.objectIds()
-        assert not 'dummy' in sub3.contentIds()
-        assert has_path( catalog._catalog, '/test/sub1/dummy' )
-        assert not has_path( catalog._catalog, '/test/sub2/dummy' )
-        assert not has_path( catalog._catalog, '/test/sub3/dummy' )
-
-        cookie = sub1.manage_copyObjects( ids = ( 'dummy', ) )
-        # Waaa! force sub2 to allow paste of Dummy object.
-        sub2.all_meta_types = []
-        sub2.all_meta_types.extend( sub2.all_meta_types )
-        sub2.all_meta_types.extend( extra_meta_types() )
-        sub2.manage_pasteObjects( cookie )
-        assert 'dummy' in sub1.objectIds()
-        assert 'dummy' in sub1.contentIds()
-        assert 'dummy' in sub2.objectIds()
-        assert 'dummy' in sub2.contentIds()
-        assert not 'dummy' in sub3.objectIds()
-        assert not 'dummy' in sub3.contentIds()
-        assert has_path( catalog._catalog, '/test/sub1/dummy' )
-        assert has_path( catalog._catalog, '/test/sub2/dummy' )
-        assert not has_path( catalog._catalog, '/test/sub3/dummy' )
-
-        get_transaction().commit(1)
-        cookie = sub1.manage_cutObjects( ids = ('dummy',) )
-        # Waaa! force sub2 to allow paste of Dummy object.
-        sub3.all_meta_types = []
-        sub3.all_meta_types.extend(sub3.all_meta_types)
-        sub3.all_meta_types.extend( extra_meta_types() )
-        sub3.manage_pasteObjects(cookie)
-
-        assert not 'dummy' in sub1.objectIds()
-        assert not 'dummy' in sub1.contentIds()
-        assert 'dummy' in sub2.objectIds()
-        assert 'dummy' in sub2.contentIds()
-        assert 'dummy' in sub3.objectIds()
-        assert 'dummy' in sub3.contentIds()
-        assert not has_path( catalog._catalog, '/test/sub1/dummy' )
-        assert has_path( catalog._catalog, '/test/sub2/dummy' )
-        assert has_path( catalog._catalog, '/test/sub3/dummy' )
-
-    def test_contentPasteAllowedTypes( self ):
+    def test_contentPasteAllowedTypes(self):
         #
         #   _verifyObjectPaste() should honor allowed content types
         #
-        from Products.CMFCore.PortalFolder import PortalFolder
-
-        test = self.root.test
-
-        self.root._setObject( 'portal_types', TypesTool() )
-        types_tool = self.root.portal_types
-
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
         fti = FTIDATA_DUMMY[0].copy()
-        types_tool._setObject( 'Dummy Content', FTI(**fti) )
-        types_tool._setObject( 'Folder', FTI(**fti) )
-
-        test._setObject( 'sub1', PortalFolder( 'sub1', '' ) )
-        sub1 = test.sub1
+        ttool._setObject( 'Dummy Content', FTI(**fti) )
+        ttool._setObject( 'Folder', FTI(**fti) )
+        sub1 = self._makeOne('sub1')
         sub1._setObject( 'dummy', DummyContent( 'dummy' ) )
-
-        test._setObject( 'sub2', PortalFolder( 'sub2', '' ) )
-        sub2 = test.sub2
+        sub2 = self._makeOne('sub2')
         sub2.all_meta_types = extra_meta_types()
 
         # Allow adding of Dummy Content
-        types_tool.Folder.manage_changeProperties(filter_content_types=False)
+        ttool.Folder.manage_changeProperties(filter_content_types=False)
 
-        # Copy/paste should work fine 
-        cookie = sub1.manage_copyObjects( ids = ( 'dummy', ) )
+        # Copy/paste should work fine
+        cookie = sub1.manage_copyObjects( ids = ['dummy'] )
         sub2.manage_pasteObjects( cookie )
 
         # Disallow adding of Dummy Content
-        types_tool.Folder.manage_changeProperties(filter_content_types=True)
+        ttool.Folder.manage_changeProperties(filter_content_types=True)
 
         # Now copy/paste should raise a ValueError
         cookie = sub1.manage_copyObjects( ids = ( 'dummy', ) )
@@ -429,16 +328,16 @@
         #
         #   _setObject() should raise BadRequest on duplicate id
         #
-        test = self.root.test
+        test = self._makeOne('test')
         test._setObject('foo', DummyContent('foo'))
-        self.assertRaises(BadRequest, test._setObject, 'foo', 
+        self.assertRaises(BadRequest, test._setObject, 'foo',
                                       DummyContent('foo'))
 
     def test_checkIdRaisesBadRequest(self):
         #
         #   _checkId() should raise BadRequest on duplicate id
         #
-        test = self.root.test
+        test = self._makeOne('test')
         test._setObject('foo', DummyContent('foo'))
         self.assertRaises(BadRequest, test._checkId, 'foo')
 
@@ -446,10 +345,138 @@
         #
         #   checkIdAvailable() should catch BadRequest
         #
-        test = self.root.test
+        test = self._makeOne('test')
         test._setObject('foo', DummyContent('foo'))
         self.failIf(test.checkIdAvailable('foo'))
 
+    def test_interface(self):
+        from Products.CMFCore.interfaces.Dynamic \
+                import DynamicType as IDynamicType
+        from OFS.IOrderSupport import IOrderedContainer
+        from webdav.WriteLockInterface import WriteLockInterface
+        from Products.CMFCore.PortalFolder import PortalFolder
+
+        verifyClass(IDynamicType, PortalFolder)
+        verifyClass(IOrderedContainer, PortalFolder)
+        verifyClass(WriteLockInterface, PortalFolder)
+
+
+class PortalFolderMoveTests(SecurityTest):
+
+    def setUp(self):
+        SecurityTest.setUp(self)
+        self.root._setObject( 'site', DummySite('site') )
+        self.site = self.root.site
+
+    def _makeOne(self, id, *args, **kw):
+        from Products.CMFCore.PortalFolder import PortalFolder
+
+        return self.site._setObject( id, PortalFolder(id, *args, **kw) )
+
+    def test_folderMove(self):
+        #
+        #   Does the catalog stay synched when folders are moved?
+        #
+        from Products.CMFCore.PortalFolder import PortalFolder
+
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
+        ctool = self.site._setObject( 'portal_catalog', CatalogTool() )
+        self.assertEqual( len(ctool), 0 )
+
+        folder = self._makeOne('folder')
+        folder._setObject( 'sub', PortalFolder( 'sub', '' ) )
+        folder.sub._setObject( 'foo', DummyContent( 'foo', catalog=1 ) )
+        self.assertEqual( len(ctool), 1 )
+        self.failUnless( 'foo' in ctool.uniqueValuesFor('getId') )
+        self.failUnless( has_path(ctool._catalog,
+                                  '/bar/site/folder/sub/foo') )
+
+        get_transaction().commit(1)
+        folder.manage_renameObject(id='sub', new_id='new_sub')
+        self.assertEqual( len(ctool), 1 )
+        self.failUnless( 'foo' in ctool.uniqueValuesFor('getId') )
+        self.failUnless( has_path(ctool._catalog,
+                                  '/bar/site/folder/new_sub/foo') )
+
+        folder._setObject( 'bar', DummyContent( 'bar', catalog=1 ) )
+        self.assertEqual( len(ctool), 2 )
+        self.failUnless( 'bar' in ctool.uniqueValuesFor('getId') )
+        self.failUnless( has_path(ctool._catalog, '/bar/site/folder/bar') )
+
+        folder._setObject( 'sub2', PortalFolder( 'sub2', '' ) )
+        sub2 = folder.sub2
+        # Waaa! force sub2 to allow paste of Dummy object.
+        sub2.all_meta_types = []
+        sub2.all_meta_types.extend( sub2.all_meta_types )
+        sub2.all_meta_types.extend( extra_meta_types() )
+
+        get_transaction().commit(1)
+        cookie = folder.manage_cutObjects(ids=['bar'])
+        sub2.manage_pasteObjects(cookie)
+
+        self.failUnless( 'foo' in ctool.uniqueValuesFor('getId') )
+        self.failUnless( 'bar' in ctool.uniqueValuesFor('getId') )
+        self.assertEqual( len(ctool), 2 )
+        self.failUnless( has_path(ctool._catalog,
+                                  '/bar/site/folder/sub2/bar') )
+
+    def test_contentPaste(self):
+        #
+        #   Does copy / paste work?
+        #
+        ctool = self.site._setObject( 'portal_catalog', CatalogTool() )
+        ttool = self.site._setObject( 'portal_types', TypesTool() )
+        fti = FTIDATA_DUMMY[0].copy()
+        ttool._setObject( 'Dummy Content', FTI(**fti) )
+        sub1 = self._makeOne('sub1')
+        sub2 = self._makeOne('sub2')
+        sub3 = self._makeOne('sub3')
+        self.assertEqual( len(ctool), 0 )
+
+        sub1._setObject( 'dummy', DummyContent( 'dummy', catalog=1 ) )
+        self.failUnless( 'dummy' in sub1.objectIds() )
+        self.failUnless( 'dummy' in sub1.contentIds() )
+        self.failIf( 'dummy' in sub2.objectIds() )
+        self.failIf( 'dummy' in sub2.contentIds() )
+        self.failIf( 'dummy' in sub3.objectIds() )
+        self.failIf( 'dummy' in sub3.contentIds() )
+        self.failUnless( has_path(ctool._catalog, '/bar/site/sub1/dummy') )
+        self.failIf( has_path(ctool._catalog, '/bar/site/sub2/dummy') )
+        self.failIf( has_path(ctool._catalog, '/bar/site/sub3/dummy') )
+
+        cookie = sub1.manage_copyObjects( ids = ( 'dummy', ) )
+        # Waaa! force sub2 to allow paste of Dummy object.
+        sub2.all_meta_types = []
+        sub2.all_meta_types.extend( sub2.all_meta_types )
+        sub2.all_meta_types.extend( extra_meta_types() )
+        sub2.manage_pasteObjects( cookie )
+        self.failUnless( 'dummy' in sub1.objectIds() )
+        self.failUnless( 'dummy' in sub1.contentIds() )
+        self.failUnless( 'dummy' in sub2.objectIds() )
+        self.failUnless( 'dummy' in sub2.contentIds() )
+        self.failIf( 'dummy' in sub3.objectIds() )
+        self.failIf( 'dummy' in sub3.contentIds() )
+        self.failUnless( has_path(ctool._catalog, '/bar/site/sub1/dummy') )
+        self.failUnless( has_path(ctool._catalog, '/bar/site/sub2/dummy') )
+        self.failIf( has_path(ctool._catalog, '/bar/site/sub3/dummy') )
+
+        get_transaction().commit(1)
+        cookie = sub1.manage_cutObjects( ids = ('dummy',) )
+        # Waaa! force sub2 to allow paste of Dummy object.
+        sub3.all_meta_types = []
+        sub3.all_meta_types.extend(sub3.all_meta_types)
+        sub3.all_meta_types.extend( extra_meta_types() )
+        sub3.manage_pasteObjects(cookie)
+        self.failIf( 'dummy' in sub1.objectIds() )
+        self.failIf( 'dummy' in sub1.contentIds() )
+        self.failUnless( 'dummy' in sub2.objectIds() )
+        self.failUnless( 'dummy' in sub2.contentIds() )
+        self.failUnless( 'dummy' in sub3.objectIds() )
+        self.failUnless( 'dummy' in sub3.contentIds() )
+        self.failIf( has_path(ctool._catalog, '/bar/site/sub1/dummy') )
+        self.failUnless( has_path(ctool._catalog, '/bar/site/sub2/dummy') )
+        self.failUnless( has_path(ctool._catalog, '/bar/site/sub3/dummy') )
+
 
 class ContentFilterTests( TestCase ):
 
@@ -827,7 +854,7 @@
         except CopyError, e:
 
             if ce_regex is not None:
-                
+
                 pattern = re.compile( ce_regex, re.DOTALL )
                 if pattern.search( e ) is None:
                     self.fail( "Paste failed; didn't match pattern:\n%s" % e )
@@ -841,7 +868,7 @@
         else:
             self.fail( "Paste allowed unexpectedly." )
 
-    def _initPolicyAndUser( self    
+    def _initPolicyAndUser( self
                           , a_lambda=None
                           , v_lambda=None
                           , c_lambda=None
@@ -899,7 +926,7 @@
                                    )
 
     def test_copy_cant_create_target_metatype_not_supported( self ):
-        
+
         from OFS.CopySupport import CopyError
 
         folder1, folder2 = self._initFolders()
@@ -930,7 +957,7 @@
         self.failUnless( 'file' in folder2.objectIds() )
 
     def test_move_cant_read_source( self ):
-        
+
         from OFS.CopySupport import CopyError
 
         folder1, folder2 = self._initFolders()
@@ -950,7 +977,7 @@
                                    )
 
     def test_move_cant_create_target_metatype_not_supported( self ):
-        
+
         from OFS.CopySupport import CopyError
 
         folder1, folder2 = self._initFolders()
@@ -965,7 +992,7 @@
                                    )
 
     def test_move_cant_create_target_metatype_not_allowed( self ):
-        
+
         #
         #   This test can't succeed on Zope's earlier than 2.7.3 because
         #   of the DWIM'y behavior of 'guarded_getattr', which tries to
@@ -993,7 +1020,7 @@
                                    )
 
     def test_move_cant_delete_source( self ):
-        
+
         #
         #   This test fails on Zope's earlier than 2.7.3 because of the
         #   changes required to 'OFS.CopytSupport.manage_pasteObjects'
@@ -1049,10 +1076,12 @@
 
         return DummyTypeInfo()
 
+
 def test_suite():
     return TestSuite((
         makeSuite( PortalFolderFactoryTests ),
         makeSuite( PortalFolderTests ),
+        makeSuite( PortalFolderMoveTests ),
         makeSuite( ContentFilterTests ),
         makeSuite( PortalFolderCopySupportTests ),
         ))



More information about the CMF-checkins mailing list