def test_manageAddFolder(self): # # Does MKDIR/MKCOL intercept work? # from Products.CMFCore.PortalFolder import PortalFolder from Products.CMFCore.PortalFolder import PortalFolderFactory acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) test = self._makeOne('test') ttool = TypesTool() ttool._setObject( 'Folder' , FTI( id='Folder' , title='Folder or Directory' , meta_type=PortalFolder.meta_type , factory='cmf.folder' , filter_content_types=0 ) ) ttool._setObject( 'Grabbed' , FTI( 'Grabbed' , title='Grabbed Content' , meta_type=PortalFolder.meta_type , factory='cmf.folder' ) ) sm = getSiteManager() sm.registerUtility(ttool, ITypesTool) sm.registerUtility(PortalFolderFactory, IFactory, 'cmf.folder') # First, test default behavior 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 ttool.Folder.setMethodAliases( {'mkdir': 'grabbed'} ) class Grabbed: _grabbed_with = None def __init__( self, context ): self._context = context def __call__( self, id ): self._grabbed_with = id self._context._setOb( id, PortalFolder( id ) ) self._context._getOb( id )._setPortalTypeName( 'Grabbed' ) self.app.grabbed = Grabbed(test) 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_contentPasteAllowedTypes(self): # # _verifyObjectPaste() should honor allowed content types # ttool = TypesTool() getSiteManager().registerUtility(ttool, ITypesTool) fti = FTIDATA_DUMMY[0].copy() ttool._setObject('Dummy Content', FTI(**fti)) ttool._setObject('Folder', FTI(**fti)) sub1 = self._makeOne('sub1') sub1._setObject('dummy', DummyContent('dummy')) sub2 = self._makeOne('sub2') sub2.all_meta_types = extra_meta_types() # Allow adding of Dummy Content ttool.Folder.manage_changeProperties(filter_content_types=False) # Copy/paste should work fine cookie = sub1.manage_copyObjects(ids=['dummy']) sub2.manage_pasteObjects(cookie) # Disallow adding of Dummy Content ttool.Folder.manage_changeProperties(filter_content_types=True) # Now copy/paste should raise a ValueError cookie = sub1.manage_copyObjects(ids=('dummy',)) self.assertRaises(ValueError, sub2.manage_pasteObjects, cookie)
def setUp(self): self.site = DummySite('site') ttool = TypesTool() getSiteManager().registerUtility(ttool, ITypesTool) fti = FTIDATA_CMF[0].copy() ttool._setObject( 'Dummy Content 15', FTI(**fti) ) self.site._setObject( 'foo', DummyContent() ) dummy_view = self.site._setObject( 'dummy_view', DummyObject() )
def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.app) ttool = TypesTool() fti = FTIDATA_CMF[0].copy() ttool._setObject( 'Dummy Content 15', FTI(**fti) ) self.site._setObject( 'foo', DummyContent() ) sm = getSiteManager() sm.registerUtility(DummyTool(), IMembershipTool) sm.registerUtility(DummyTool().__of__(self.site), IURLTool) sm.registerUtility(ttool, ITypesTool)
def test__checkId_MethodAlias(self): acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) test = self._makeOne('test') test._setPortalTypeName('Dummy Content 15') ttool = TypesTool() ttool._setObject('Dummy Content 15', FTI(**FTIDATA_CMF[0])) getSiteManager().registerUtility(ttool, ITypesTool) acl_users = self.site._setObject('acl_users', DummyUserFolder()) test._checkId('view.html') newSecurityManager(None, acl_users.user_foo) self.assertRaises(BadRequest, test._checkId, 'view.html')
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')) 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'))
def test_manageAddFolder(self): # # Does MKDIR/MKCOL intercept work? # from Products.CMFCore.PortalFolder import PortalFolder test = self._makeOne('test') 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 ) ) 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') 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 ttool.Folder.setMethodAliases( {'mkdir': 'grabbed'} ) class Grabbed: _grabbed_with = None def __init__( self, context ): self._context = context def __call__( self, id ): self._grabbed_with = id self._context._setOb( id, PortalFolder( id ) ) self._context._getOb( id )._setPortalTypeName( 'Grabbed' ) self.root.grabbed = Grabbed(test) 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 setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) sm = getSiteManager() self.site._setObject( 'portal_discussion', DiscussionTool() ) sm.registerUtility(self.site.portal_discussion, IDiscussionTool) self.site._setObject( 'portal_membership', DummyTool() ) sm.registerUtility(self.site.portal_membership, IMembershipTool) self.site._setObject( 'portal_types', TypesTool() ) sm.registerUtility(self.site.portal_types, ITypesTool)
def setUp(self): self.site = DummySite('site') self.site._setObject( 'portal_types', TypesTool() ) fti = FTIDATA_CMF15[0].copy() self.site.portal_types._setObject( 'Dummy Content 15', FTI(**fti) ) self.site._setObject( 'foo', DummyContent() ) dummy_view = self.site._setObject( 'dummy_view', DummyObject() ) zope.component.provideAdapter(FiveTraversable, (None,), ITraversable) zope.component.provideAdapter(Traverser, (None,), ITraverser)
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_contentPasteFollowsWorkflowGuards(self): # # Copy/Paste should obey workflow guards # acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) ttool = TypesTool() fti = FTIDATA_DUMMY[0].copy() ttool._setObject('Dummy Content', FTI(**fti)) ttool._setObject('Folder', FTI(**fti)) folder = self._makeOne('folder', 'Folder') content = self._makeOne('content') folder._setObject('content', content) sm = getSiteManager() sm.registerUtility(ttool, ITypesTool) # Allow adding of Dummy Content ttool.Folder.manage_changeProperties(filter_content_types=False) # Copy/paste verification should work fine folder._verifyObjectPaste(content) # Add a workflow with a blocking guard # Based on TypesTools tests class DummyWorkflow: _allow = False def allowCreate(self, container, type_id): return self._allow class DummyWorkflowTool: def __init__(self): self._workflows = [DummyWorkflow()] def getWorkflowsFor(self, type_id): return self._workflows # Now copy/paste verification should raise a ValueError sm.registerUtility(DummyWorkflowTool(), IWorkflowTool) self.assertRaises(ValueError, folder._verifyObjectPaste, content)
def test_paste_with_restricted_item_content_type_allowed(self): # Test from CMF Collector #216 (Plone #2186), for the case # in which the item being pasted *does8 allow adding such # objects to containers which *do* explicitly grant access. from Products.CMFCore.PortalFolder import PortalFolder RESTRICTED_TYPE = 'Restricted Item' UNRESTRICTED_TYPE = 'Unrestricted Container' folder1, folder2 = self._initFolders() folder1.portal_type = UNRESTRICTED_TYPE folder2.portal_type = RESTRICTED_TYPE self._initPolicyAndUser() # ensure that sec. machinery allows paste ttool = TypesTool() ttool._setObject(RESTRICTED_TYPE, FTI(id=RESTRICTED_TYPE , title=RESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , global_allow=0 ) ) ttool._setObject(UNRESTRICTED_TYPE, FTI(id=UNRESTRICTED_TYPE , title=UNRESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , filter_content_types=1 , allowed_content_types=[RESTRICTED_TYPE] ) ) getSiteManager().registerUtility(ttool, ITypesTool) # copy and pasting the object into the folder should *not* raise # an exception, because the folder's type allows it. copy_cookie = self.app.manage_copyObjects(ids=['folder2']) folder1.manage_pasteObjects(copy_cookie) self.failUnless('folder2' in folder1.objectIds())
def test_allowType( self ): self.tool = TypesTool() ti = self._makeAndSetInstance( 'Foo' ) self.failIf( ti.allowType( 'Foo' ) ) self.failIf( ti.allowType( 'Bar' ) ) ti = self._makeAndSetInstance( 'Foo2', allowed_content_types=( 'Bar', ) ) self.failUnless( ti.allowType( 'Bar' ) ) ti = self._makeAndSetInstance( 'Foo3', filter_content_types=0 ) self.failUnless( ti.allowType( 'Foo3' ) )
def setUp(self): SecurityRequestTest.setUp(self) root = self.root root._setObject('portal_actions', self._makeOne()) root._setObject('portal_url', URLTool()) root._setObject('foo', URLTool()) root._setObject('portal_membership', MembershipTool()) root._setObject('portal_types', TypesTool()) self.tool = root.portal_actions self.tool.action_providers = ('portal_actions', )
def test__checkId_MethodAlias(self): sm = getSiteManager(self.site) test = self._makeOne('test') test._setPortalTypeName('Dummy Content 15') ttool = self.site._setObject('portal_types', TypesTool()) sm.registerUtility(self.site.portal_types, ITypesTool) ttool._setObject('Dummy Content 15', FTI(**FTIDATA_CMF15[0])) acl_users = self.site._setObject('acl_users', DummyUserFolder()) test._checkId('view.html') newSecurityManager(None, acl_users.user_foo) self.assertRaises(BadRequest, test._checkId, 'view.html')
def test_portalfolder_cataloging(self): # # Test to ensure a portal folder itself is *not* cataloged upon # instantiation (Tracker issue 309) # ttool = self.site._setObject('portal_types', TypesTool()) ctool = self.site._setObject('portal_catalog', DummyCatalogTool()) wftool = self.site._setObject('portal_workflow', WorkflowTool()) test = self._makeOne('test') wftool.notifyCreated(test) self.assertEqual(len(ctool), 0)
def _initSite(self, foo=0): site = Folder(id='site').__of__(self.app) ttool = TypesTool() getSiteManager().registerUtility(ttool, ITypesTool) if foo == 1: fti = _TI_LIST[0].copy() ttool._setObject(fti['id'], FactoryTypeInformation(**fti)) sti = _TI_LIST[1].copy() ttool._setObject(sti['id'], ScriptableTypeInformation(**sti)) elif foo == 2: fti = _TI_LIST_WITH_FILENAME[0].copy() ttool._setObject(fti['id'], FactoryTypeInformation(**fti)) sti = _TI_LIST_WITH_FILENAME[1].copy() ttool._setObject(sti['id'], ScriptableTypeInformation(**sti)) return site, ttool
def test_paste_with_restricted_container_content_type(self): # Test from CMF Collector #216 (Plone #2186), for the case # in which the container does not allow adding items of the # type being pasted. from Products.CMFCore.PortalFolder import PortalFolder RESTRICTED_TYPE = 'Restricted Container' UNRESTRICTED_TYPE = 'Unrestricted Item' folder1, folder2 = self._initFolders() folder1.portal_type = RESTRICTED_TYPE folder2.portal_type = UNRESTRICTED_TYPE self._initPolicyAndUser() # ensure that sec. machinery allows paste ttool = TypesTool() ttool._setObject(RESTRICTED_TYPE, FTI(id=RESTRICTED_TYPE , title=RESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , filter_content_types=1 , allowed_content_types=() ) ) ttool._setObject(UNRESTRICTED_TYPE, FTI(id=UNRESTRICTED_TYPE , title=UNRESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , global_allow=1 ) ) getSiteManager().registerUtility(ttool, ITypesTool) # copy and pasting the object into the folder should raise # an exception copy_cookie = self.app.manage_copyObjects(ids=['folder2']) self.assertRaises(ValueError, folder1.manage_pasteObjects, copy_cookie)
def setUp(self): SecurityRequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) sm = getSiteManager() sm.registerUtility(self.site, ISiteRoot) self.site._setObject('portal_membership', DummyTool()) sm.registerUtility(self.site.portal_membership, IMembershipTool) self.site._setObject('portal_types', TypesTool()) sm.registerUtility(self.site.portal_types, ITypesTool) fti = FTIDATA_CMF15[0].copy() self.site.portal_types._setObject('Dummy Content 15', FTI(**fti)) self.site._setObject('foo', DummyContent())
def _makeFolder(id, site_folder=False): from Products.CMFCore.PortalFolder import PortalFolder from Products.CMFCore.TypesTool import TypesTool from Products.CMFCore.tests.base.dummy import DummyType class _TypeInfo(DummyType): def _getId(self): return self._id def constructInstance(self, container, id, *args, **kw): portal_type = self._getId() if portal_type == TEST_FOLDER: content = PortalFolder(id) elif portal_type == TEST_DAV_FOLDER: content = _makeDAVAwareFolder(id) elif portal_type == TEST_CONTENT: content = _makeItem() content._setId(id) elif portal_type == TEST_INI_AWARE: content = _makeINIAware(id) elif portal_type == TEST_CSV_AWARE: content = _makeCSVAware(id) else: raise ValueError('Ugh') content.portal_type = portal_type container._setObject(id, content) return container._getOb(id) folder = PortalFolder(id) folder.portal_type = TEST_FOLDER if site_folder: ttool = TypesTool() ttool._setObject(TEST_CSV_AWARE, _TypeInfo(TEST_CSV_AWARE)) ttool._setObject(TEST_INI_AWARE, _TypeInfo(TEST_INI_AWARE)) ttool._setObject(TEST_CONTENT, _TypeInfo(TEST_CONTENT)) ttool._setObject(TEST_FOLDER, _TypeInfo(TEST_FOLDER)) ttool._setObject(TEST_DAV_FOLDER, _TypeInfo(TEST_DAV_FOLDER)) getSiteManager().registerUtility(ttool, ITypesTool) return folder
def test_contents_methods(self): acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) ttool = TypesTool() getSiteManager().registerUtility(ttool, ITypesTool) 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_contentPasteAllowedTypes(self): # # _verifyObjectPaste() should honor allowed content types # ttool = TypesTool() getSiteManager().registerUtility(ttool, ITypesTool) fti = FTIDATA_DUMMY[0].copy() ttool._setObject('Dummy Content', FTI(**fti)) ttool._setObject('Folder', FTI(**fti)) sub1 = self._makeOne('sub1') sub1._setObject('dummy', DummyContent('dummy')) sub2 = self._makeOne('sub2') sub2.all_meta_types = extra_meta_types() # Allow adding of Dummy Content ttool.Folder.manage_changeProperties(filter_content_types=False) # Copy/paste should work fine cookie = sub1.manage_copyObjects(ids=['dummy']) sub2.manage_pasteObjects(cookie) # Disallow adding of Dummy Content ttool.Folder.manage_changeProperties(filter_content_types=True) # Now copy/paste should raise a ValueError cookie = sub1.manage_copyObjects(ids=('dummy', )) self.assertRaises(ValueError, sub2.manage_pasteObjects, cookie)
def test_folderMove(self): # # Does the catalog stay synched when folders are moved? # self.root._setObject('test', PortalFolder('test', '')) 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', 1)) foo = sub.foo assert len(catalog) == 1 assert 'foo' in catalog.uniqueValuesFor('id') assert has_path(catalog._catalog, '/test/folder/sub/foo') #import pdb; pdb.set_trace() folder.manage_renameObject(id='sub', new_id='new_sub') assert 'foo' in catalog.uniqueValuesFor('id') assert len(catalog) == 1 assert has_path(catalog._catalog, '/test/folder/new_sub/foo') folder._setObject('bar', DummyContent('bar', 1)) bar = folder.bar assert 'bar' in catalog.uniqueValuesFor('id') 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()) cookie = folder.manage_cutObjects(ids=['bar']) sub2.manage_pasteObjects(cookie) assert 'foo' in catalog.uniqueValuesFor('id') assert 'bar' in catalog.uniqueValuesFor('id') assert len(catalog) == 2 assert has_path(catalog._catalog, '/test/folder/sub2/bar')
def setUp(self): SecurityTest.setUp(self) self.root._setObject('portal_types', TypesTool()) types_tool = self.root.portal_types types_tool._setObject( 'Folder', FTI(id='Folder', meta_type=PortalFolder.meta_type, product='CMFCore', factory='manage_addPortalFolder', filter_content_types=0)) types_tool._setObject('Dummy', DummyFTI)
def test_manageAddFolder(self): # # Does MKDIR/MKCOL intercept work? # from Products.CMFCore.PortalFolder import PortalFolder from Products.CMFCore.PortalFolder import PortalFolderFactory acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) test = self._makeOne('test') ttool = TypesTool() ttool._setObject( 'Folder', FTI(id='Folder', title='Folder or Directory', meta_type=PortalFolder.meta_type, factory='cmf.folder', filter_content_types=0)) ttool._setObject( 'Grabbed', FTI('Grabbed', title='Grabbed Content', meta_type=PortalFolder.meta_type, factory='cmf.folder')) sm = getSiteManager() sm.registerUtility(ttool, ITypesTool) sm.registerUtility(PortalFolderFactory, IFactory, 'cmf.folder') # First, test default behavior 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 ttool.Folder.setMethodAliases({'mkdir': 'grabbed'}) class Grabbed: _grabbed_with = None def __init__(self, context): self._context = context def __call__(self, id): self._grabbed_with = id self._context._setOb(id, PortalFolder(id)) self._context._getOb(id)._setPortalTypeName('Grabbed') self.app.grabbed = Grabbed(test) 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_portalfolder_cataloging(self): # # Test to ensure a portal folder itself is *not* cataloged upon # instantiation (Tracker issue 309) # sm = getSiteManager(self.site) ttool = self.site._setObject( 'portal_types', TypesTool() ) sm.registerUtility(ttool, ITypesTool) ctool = self.site._setObject( 'portal_catalog', CatalogTool() ) sm.registerUtility(ctool, ICatalogTool) wftool = self.site._setObject( 'portal_workflow', WorkflowTool() ) test = self._makeOne('test') wftool.notifyCreated(test) self.assertEqual( len(ctool), 0 )
def test_folderMove(self): # # Does the catalog stay synched when folders are moved? # from Products.CMFCore.PortalFolder import PortalFolder sm = getSiteManager(self.site) ttool = self.site._setObject( 'portal_types', TypesTool() ) sm.registerUtility(ttool, ITypesTool) ctool = self.site._setObject( 'portal_catalog', CatalogTool() ) sm.registerUtility(ctool, ICatalogTool) ctool.addIndex('getId', 'FieldIndex') 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') ) transaction.savepoint(optimistic=True) 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() ) transaction.savepoint(optimistic=True) 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 setUp(self): get_transaction().begin() self._policy = UnitTestSecurityPolicy() SecurityManager.setSecurityPolicy(self._policy) self.root = Zope.app() self.root._setObject('portal_discussion', DiscussionTool()) self.discussion_tool = self.root.portal_discussion self.root._setObject('portal_catalog', CatalogTool()) self.catalog_tool = self.root.portal_catalog self.root._setObject('portal_url', URLTool()) self.url_tool = self.root.portal_url self.root._setObject('portal_workflow', WorkflowTool()) self.workflow_tool = self.root.portal_workflow self.root._setObject('portal_types', TypesTool()) types_tool = self.types_tool = self.root.portal_types
def setUp(self): SecurityTest.setUp(self) 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)) fti = FTIDATA_DUMMY[0].copy() types_tool._setObject('Dummy Content', FTI(**fti))
def test_paste_with_restricted_container_content_type(self): # Test from CMF Collector #216 (Plone #2186), for the case # in which the container does not allow adding items of the # type being pasted. from Products.CMFCore.PortalFolder import PortalFolder RESTRICTED_TYPE = 'Restricted Container' UNRESTRICTED_TYPE = 'Unrestricted Item' folder1, folder2 = self._initFolders() folder1.portal_type = RESTRICTED_TYPE folder2.portal_type = UNRESTRICTED_TYPE sm = getSiteManager() self._initPolicyAndUser() # ensure that sec. machinery allows paste self.app._setObject( 'portal_types', TypesTool() ) types_tool = self.app.portal_types sm.registerUtility(types_tool, ITypesTool) types_tool._setObject( RESTRICTED_TYPE , FTI( id=RESTRICTED_TYPE , title=RESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , filter_content_types=1 , allowed_content_types=() ) ) types_tool._setObject( UNRESTRICTED_TYPE , FTI( id=UNRESTRICTED_TYPE , title=UNRESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , global_allow=1 ) ) # copy and pasting the object into the folder should raise # an exception copy_cookie = self.app.manage_copyObjects( ids=[ 'folder2' ] ) self.assertRaises( ValueError , folder1.manage_pasteObjects , copy_cookie )
def test_folderMove(self): # # Does the catalog stay synched when folders are moved? # from Products.CMFCore.PortalFolder import PortalFolder acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) ctool = DummyCatalogTool() sm = getSiteManager() sm.registerUtility(TypesTool(), ITypesTool) sm.registerUtility(ctool, ICatalogTool) 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.assertTrue(has_id(ctool, 'foo')) self.assertTrue(has_path(ctool, '/bar/site/folder/sub/foo')) transaction.savepoint(optimistic=True) folder.manage_renameObject(id='sub', new_id='new_sub') self.assertEqual(len(ctool), 1) self.assertTrue(has_id(ctool, 'foo')) self.assertTrue(has_path(ctool, '/bar/site/folder/new_sub/foo')) folder._setObject('bar', DummyContent('bar', catalog=1)) self.assertEqual(len(ctool), 2) self.assertTrue(has_id(ctool, 'bar')) self.assertTrue(has_path(ctool, '/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()) transaction.savepoint(optimistic=True) cookie = folder.manage_cutObjects(ids=['bar']) sub2.manage_pasteObjects(cookie) self.assertTrue(has_id(ctool, 'foo')) self.assertTrue(has_id(ctool, 'bar')) self.assertEqual(len(ctool), 2) self.assertTrue(has_path(ctool, '/bar/site/folder/sub2/bar'))
def _initSite(self, foo=0): self.root.site = Folder(id='site') site = self.root.site ttool = site.portal_types = TypesTool() if foo == 1: fti = _TI_LIST[0].copy() ttool._setObject(fti['id'], FactoryTypeInformation(**fti)) sti = _TI_LIST[1].copy() ttool._setObject(sti['id'], ScriptableTypeInformation(**sti)) elif foo == 2: fti = _TI_LIST_WITH_FILENAME[0].copy() ttool._setObject(fti['id'], FactoryTypeInformation(**fti)) sti = _TI_LIST_WITH_FILENAME[1].copy() ttool._setObject(sti['id'], ScriptableTypeInformation(**sti)) return site
def test_paste_with_restricted_item_content_type_allowed(self): # Test from CMF Collector #216 (Plone #2186), for the case # in which the item being pasted *does8 allow adding such # objects to containers which *do* explicitly grant access. from Products.CMFCore.PortalFolder import PortalFolder RESTRICTED_TYPE = 'Restricted Item' UNRESTRICTED_TYPE = 'Unrestricted Container' folder1, folder2 = self._initFolders() folder1.portal_type = UNRESTRICTED_TYPE folder2.portal_type = RESTRICTED_TYPE sm = getSiteManager() self._initPolicyAndUser() # ensure that sec. machinery allows paste self.app._setObject( 'portal_types', TypesTool() ) types_tool = self.app.portal_types sm.registerUtility(types_tool, ITypesTool) types_tool._setObject( RESTRICTED_TYPE , FTI( id=RESTRICTED_TYPE , title=RESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , global_allow=0 ) ) types_tool._setObject( UNRESTRICTED_TYPE , FTI( id=UNRESTRICTED_TYPE , title=UNRESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , filter_content_types=1 , allowed_content_types=[ RESTRICTED_TYPE ] ) ) # copy and pasting the object into the folder should *not* raise # an exception, because the folder's type allows it. copy_cookie = self.app.manage_copyObjects( ids=[ 'folder2' ] ) folder1.manage_pasteObjects( copy_cookie ) self.failUnless( 'folder2' in folder1.objectIds() )
def setUp( self ): SecurityTest.setUp(self) root = self.root root._setObject( 'portal_discussion', DiscussionTool() ) self.discussion_tool = root.portal_discussion root._setObject( 'portal_catalog', CatalogTool() ) self.catalog_tool = root.portal_catalog root._setObject( 'portal_url', URLTool() ) self.url_tool = root.portal_url root._setObject( 'portal_workflow', WorkflowTool() ) self.workflow_tool = root.portal_workflow root._setObject( 'portal_types', TypesTool() ) types_tool = self.types_tool = root.portal_types try: root._delObject('test') except AttributeError: pass root._setObject( 'test', Document( 'test' ) )
def test_paste_with_restricted_item_content_type_not_allowed(self): # Test from CMF Collector #216 (Plone #2186), for the case # in which the item being pasted does not allow adding such # objects to containers which do not explicitly grant access. from Products.CMFCore.PortalFolder import PortalFolder RESTRICTED_TYPE = 'Restricted Item' UNRESTRICTED_TYPE = 'Unrestricted Container' folder1, folder2 = self._initFolders() folder1.portal_type = UNRESTRICTED_TYPE folder2.portal_type = RESTRICTED_TYPE self._initPolicyAndUser() # ensure that sec. machinery allows paste self.app._setObject( 'portal_types', TypesTool() ) types_tool = self.app.portal_types types_tool._setObject( RESTRICTED_TYPE , FTI( id=RESTRICTED_TYPE , title=RESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , global_allow=0 ) ) types_tool._setObject( UNRESTRICTED_TYPE , FTI( id=UNRESTRICTED_TYPE , title=UNRESTRICTED_TYPE , meta_type=PortalFolder.meta_type , product='CMFCore' , factory='manage_addPortalFolder' , filter_content_types=0 ) ) # copy and pasting the object into the folder should raise # an exception copy_cookie = self.app.manage_copyObjects( ids=[ 'folder2' ] ) self.assertRaises( ValueError , folder1.manage_pasteObjects , copy_cookie )
def setUp(self): super(DynamicTypeDefaultTraversalTests, self).setUp() self.site = DummySite('site') self.site._setObject('portal_types', TypesTool()) fti = FTIDATA_CMF15[0].copy() self.site.portal_types._setObject('Dummy Content 15', FTI(**fti)) self.site._setObject('foo', DummyContent()) dummy_view = self.site._setObject('dummy_view', DummyObject()) try: from zope.component import provideAdapter provideAdapter(FiveTraversable, (None, ), ITraversable) provideAdapter(Traverser, (None, ), ITraverser) except ImportError: # BBB for Zope 2.8 from zope.app.tests import ztapi ztapi.provideAdapter(None, ITraversable, FiveTraversable) ztapi.provideAdapter(None, ITraverser, Traverser)
def setUp(self): from Products.CMFCore.PortalFolder import PortalFolder SecurityTest.setUp(self) sm = getSiteManager() sm.registerUtility(self._getTargetObject(), IFactory, 'cmf.folder') self.site = DummySite('site').__of__(self.root) acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) ttool = self.site._setObject('portal_types', TypesTool()) ttool._setObject(self._PORTAL_TYPE, FTI(id=self._PORTAL_TYPE, title='Folder or Directory', meta_type=PortalFolder.meta_type, factory='cmf.folder', filter_content_types=0)) ttool._setObject('Dummy Content', FTI(**FTIDATA_DUMMY[0].copy())) self.f = self.site._setObject('container', PortalFolder('container')) self.f._setPortalTypeName(self._PORTAL_TYPE)
def test_catalogUnindexAndIndex(self): # # Test is a new object does get cataloged upon _setObject # and uncataloged upon manage_deleteObjects # 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 self.failUnless( foo.after_add_called ) self.failIf( foo.before_delete_called ) self.assertEqual( len(ctool), 1 ) foo.reset() test._delObject('foo') self.failIf( foo.after_add_called ) self.failUnless( foo.before_delete_called ) self.assertEqual( len(ctool), 0 )
def _makeFolder(id, site_folder=False): from zope.interface import directlyProvides from zope.interface import providedBy from Products.CMFCore.PortalFolder import PortalFolder from Products.CMFCore.interfaces import ISiteRoot from Products.CMFCore.TypesTool import TypesTool from Products.CMFCore.tests.base.dummy import DummyType class _TypeInfo(DummyType): def _getId(self): return self._id def constructInstance(self, container, id, *args, **kw): portal_type = self._getId() if portal_type == TEST_FOLDER: content = PortalFolder(id) elif portal_type == TEST_CONTENT: content = _makeItem() content._setId(id) elif portal_type == TEST_INI_AWARE: content = _makeINIAware(id) elif portal_type == TEST_CSV_AWARE: content = _makeCSVAware(id) else: raise ValueError, 'Ugh' content.portal_type = portal_type container._setObject(id, content) return container._getOb(id) folder = PortalFolder(id) folder.portal_type = TEST_FOLDER if site_folder: directlyProvides(folder, ISiteRoot + providedBy(folder)) tool = folder.portal_types = TypesTool() tool._setObject(TEST_CSV_AWARE, _TypeInfo(TEST_CSV_AWARE)) tool._setObject(TEST_INI_AWARE, _TypeInfo(TEST_INI_AWARE)) tool._setObject(TEST_CONTENT, _TypeInfo(TEST_CONTENT)) tool._setObject(TEST_FOLDER, _TypeInfo(TEST_FOLDER)) return folder
def _makeFolder(id, site_folder=False): from Products.CMFCore.PortalFolder import PortalFolder from Products.CMFCore.TypesTool import TypesTool from Products.CMFCore.tests.base.dummy import DummyType class _TypeInfo(DummyType): def _getId(self): return self._id def constructInstance(self, container, id, *args, **kw): portal_type = self._getId() if portal_type == TEST_FOLDER: content = PortalFolder(id) elif portal_type == TEST_CONTENT: content = _makeItem() content._setId(id) elif portal_type == TEST_INI_AWARE: content = _makeINIAware(id) elif portal_type == TEST_CSV_AWARE: content = _makeCSVAware(id) else: raise ValueError('Ugh') content.portal_type = portal_type container._setObject(id, content) return container._getOb(id) folder = PortalFolder(id) folder.portal_type = TEST_FOLDER if site_folder: ttool = TypesTool() ttool._setObject(TEST_CSV_AWARE, _TypeInfo(TEST_CSV_AWARE)) ttool._setObject(TEST_INI_AWARE, _TypeInfo(TEST_INI_AWARE)) ttool._setObject(TEST_CONTENT, _TypeInfo(TEST_CONTENT)) ttool._setObject(TEST_FOLDER, _TypeInfo(TEST_FOLDER)) getSiteManager().registerUtility(ttool, ITypesTool) return folder
def test_contentPaste(self): # # Does copy / paste work? # acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) ctool = DummyCatalogTool() ttool = 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) sm = getSiteManager() sm.registerUtility(ctool, ICatalogTool) sm.registerUtility(ttool, ITypesTool) sub1._setObject('dummy', DummyContent('dummy', catalog=1)) self.assertTrue('dummy' in sub1.objectIds()) self.assertTrue('dummy' in sub1.contentIds()) self.assertFalse('dummy' in sub2.objectIds()) self.assertFalse('dummy' in sub2.contentIds()) self.assertFalse('dummy' in sub3.objectIds()) self.assertFalse('dummy' in sub3.contentIds()) self.assertTrue(has_path(ctool, '/bar/site/sub1/dummy')) self.assertFalse(has_path(ctool, '/bar/site/sub2/dummy')) self.assertFalse(has_path(ctool, '/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.assertTrue('dummy' in sub1.objectIds()) self.assertTrue('dummy' in sub1.contentIds()) self.assertTrue('dummy' in sub2.objectIds()) self.assertTrue('dummy' in sub2.contentIds()) self.assertFalse('dummy' in sub3.objectIds()) self.assertFalse('dummy' in sub3.contentIds()) self.assertTrue(has_path(ctool, '/bar/site/sub1/dummy')) self.assertTrue(has_path(ctool, '/bar/site/sub2/dummy')) self.assertFalse(has_path(ctool, '/bar/site/sub3/dummy')) transaction.savepoint(optimistic=True) 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.assertFalse('dummy' in sub1.objectIds()) self.assertFalse('dummy' in sub1.contentIds()) self.assertTrue('dummy' in sub2.objectIds()) self.assertTrue('dummy' in sub2.contentIds()) self.assertTrue('dummy' in sub3.objectIds()) self.assertTrue('dummy' in sub3.contentIds()) self.assertFalse(has_path(ctool, '/bar/site/sub1/dummy')) self.assertTrue(has_path(ctool, '/bar/site/sub2/dummy')) self.assertTrue(has_path(ctool, '/bar/site/sub3/dummy'))
def testHTML(self): self.REQUEST['BODY'] = BASIC_HTML ttool = TypesTool() fti = FTIDATA_CMF[0].copy() del fti['id'] ttool._setObject('Document', FTI('Document', **fti)) ps = self.site._setObject('source_html', PythonScript('source_html')) zpt = self.site._setObject('source_html', ZopePageTemplate('source_html_template')) dir = abspath(dirname(utils.__file__)) _file = path_join(dir, 'skins', 'zpt_content', 'source_html.py') data = open(_file, 'r').read() ps.write(data) _file = path_join(dir, 'skins', 'zpt_content', 'source_html_template.pt') data = open(_file, 'r').read() zpt.write(data) d = self._makeOne('foo') d._setPortalTypeName('Document') d.PUT(self.REQUEST, self.RESPONSE) rnlinesplit = compile(r'\r?\n?') simple_lines = rnlinesplit.split(BASIC_HTML) get_lines = rnlinesplit.split(d.manage_FTPget()) # strip off headers meta_pattern = compile(r'meta name="([a-z]*)" ' + r'content="([a-z]*)"' ) title_pattern = compile(r'<title>(.*)</title>') simple_headers = [] while simple_lines and simple_lines[0] != '<BODY>': header = simple_lines[0].strip().lower() match = meta_pattern.search(header) if match: simple_headers.append(match.groups()) else: match = title_pattern.search(header) if match: simple_headers.append(('title', match.group(1))) simple_lines = simple_lines[1:] get_headers = [] while get_lines and get_lines[0] != '<BODY>': header = get_lines[0].strip().lower() match = meta_pattern.search(header) if match: get_headers.append(match.groups()) else: match = title_pattern.search(header) if match: get_headers.append(('title', match.group(1))) get_lines = get_lines[1:] self.assertEqual(get_lines, simple_lines) self.assertTrue(get_headers) self.assertTrue(simple_headers) self.assertTrue(len(get_headers) >= len(simple_headers)) for header in simple_headers: self.assertTrue(header in get_headers) body1 = d.EditableBody() self.REQUEST['BODY'] = d.manage_FTPget() d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual(d.EditableBody(), body1)