def setUp(self): from Products.CMFCore.ActionsTool import ActionsTool site = DummySite('site') site._setObject('portal_actions', ActionsTool('portal_actions')) self._obj = site.portal_actions self._BODY = _ACTIONSTOOL_BODY
class CoreUtilsTests(SecurityTest): def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'acl_users', DummyUserFolder() ) self.site._setObject('content_dummy', DummyObject(id='content_dummy')) self.site._setObject('actions_dummy', DummyObject(id='actions_dummy')) def test__checkPermission(self): o = self.site.actions_dummy Permission('View',(),o).setRoles(('Anonymous',)) Permission('WebDAV access',(),o).setRoles(('Authenticated',)) Permission('Manage users',(),o).setRoles(('Manager',)) eo = self.site.content_dummy eo._owner = (['acl_users'], 'user_foo') getSecurityManager().addContext(eo) self.failUnless( _checkPermission('View', o) ) self.failIf( _checkPermission('WebDAV access', o) ) self.failIf( _checkPermission('Manage users', o) ) eo._proxy_roles = ('Authenticated',) self.failIf( _checkPermission('View', o) ) self.failUnless( _checkPermission('WebDAV access', o) ) self.failIf( _checkPermission('Manage users', o) ) def test_normalize(self): self.assertEqual( normalize('foo/bar'), 'foo/bar' ) self.assertEqual( normalize('foo\\bar'), 'foo/bar' )
class PortalFolderFactoryTests(SecurityTest): _PORTAL_TYPE = 'Test Folder' def _getTargetObject(self): from Products.CMFCore.PortalFolder import PortalFolderFactory return PortalFolderFactory def setUp(self): from Products.CMFCore.PortalFolder import PortalFolder SecurityTest.setUp(self) setUpEvents() gsm = getGlobalSiteManager() gsm.provideUtility(IFactory, self._getTargetObject(), '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 tearDown(self): SecurityTest.tearDown(self) cleanUp() def test_invokeFactory(self): f = self.f self.failIf( 'foo' in f.objectIds() ) f.manage_addProduct = {'FooProduct': DummyFactoryDispatcher(f)} f.invokeFactory( type_name='Dummy Content', id='foo' ) self.failUnless( 'foo' in f.objectIds() ) foo = f.foo self.assertEqual( foo.getId(), 'foo' ) self.assertEqual( foo.getPortalTypeName(), 'Dummy Content' ) self.assertEqual( foo.Type(), 'Dummy Content Title' ) def test_invokeFactory_disallowed_type(self): f = self.f ftype = getattr(self.site.portal_types, self._PORTAL_TYPE) ftype.filter_content_types = 1 self.assertRaises(ValueError, f.invokeFactory, self._PORTAL_TYPE, 'sub') ftype.allowed_content_types = (self._PORTAL_TYPE,) f.invokeFactory(self._PORTAL_TYPE, id='sub') self.failUnless('sub' in f.objectIds()) self.assertRaises(ValueError, f.invokeFactory, 'Dummy Content', 'foo')
def _initSite(self, foo=2, bar=2): site = DummySite('site') sm = getSiteManager() sm.registerUtility(DummyMembershipTool(), IMembershipTool) atool = DummyActionsTool() atool.addActionProvider('portal_actions') sm.registerUtility(atool, IActionsTool) if foo > 0: site.portal_foo = DummyTool() if foo > 1: site.portal_foo.addAction(id='foo', name='Foo', action='foo', condition='python:1', permission=(), category='dummy', visible=1) atool.addActionProvider('portal_foo') if bar > 0: site.portal_bar = DummyTool() if bar > 1: site.portal_bar.addAction(id='bar', name='Bar', action='bar', condition='python:0', permission=('Manage portal',), category='dummy', visible=0) atool.addActionProvider('portal_bar') return site, atool
class ActionInfoSecurityTests(SecurityTest): def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_membership', DummyMembershipTool() ) def _makeOne(self, *args, **kw): from Products.CMFCore.ActionInformation import ActionInfo return ActionInfo(*args, **kw) def test_create_from_dict(self): WANTED = {'allowed': True, 'available': True, 'category': 'object', 'id': 'foo', 'title': 'foo', 'url': '', 'visible': True} action = {'name': 'foo', 'url': '', 'permissions': ('View',)} ec = createExprContext(self.site, self.site, None) ai = self._makeOne(action, ec) self.assertEqual( ai['id'], WANTED['id'] ) self.assertEqual( ai['title'], WANTED['title'] ) self.assertEqual( ai['url'], WANTED['url'] ) self.assertEqual( ai['category'], WANTED['category'] ) self.assertEqual( ai['visible'], WANTED['visible'] ) self.assertEqual( ai['available'], WANTED['available'] ) self.assertEqual( ai['allowed'], WANTED['allowed'] ) self.assertEqual( ai, WANTED )
class MembershipToolSecurityTests(SecurityTest): def _makeOne(self, *args, **kw): from Products.CMFDefault.MembershipTool import MembershipTool return MembershipTool(*args, **kw) def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_membership', self._makeOne() ) def tearDown(self): cleanUp() SecurityTest.tearDown(self) def test_createMemberArea(self): mtool = self.site.portal_membership members = self.site._setObject( 'Members', PortalFolder('Members') ) acl_users = self.site._setObject( 'acl_users', DummyUserFolder() ) wtool = self.site._setObject( 'portal_workflow', DummyTool() ) # permission mtool.createMemberArea('user_foo') self.failIf( hasattr(members.aq_self, 'user_foo') ) newSecurityManager(None, acl_users.user_bar) mtool.createMemberArea('user_foo') self.failIf( hasattr(members.aq_self, 'user_foo') ) newSecurityManager(None, acl_users.user_foo) mtool.setMemberareaCreationFlag() mtool.createMemberArea('user_foo') self.failIf( hasattr(members.aq_self, 'user_foo') ) newSecurityManager(None, acl_users.all_powerful_Oz) mtool.setMemberareaCreationFlag() mtool.createMemberArea('user_foo') self.failUnless( hasattr(members.aq_self, 'user_foo') ) # default content f = members.user_foo ownership = acl_users.user_foo localroles = ( ( 'user_foo', ('Owner',) ), ) self.assertEqual( f.Title(), "user_foo's Home" ) self.assertEqual( f.getOwner(), ownership ) self.assertEqual( f.get_local_roles(), localroles, 'CMF Collector issue #162 (LocalRoles broken): %s' % str( f.get_local_roles() ) ) self.assertEqual( f.index_html.getOwner(), ownership, 'CMF Collector issue #162 (Ownership broken): %s' % str( f.index_html.getOwner() ) ) self.assertEqual( f.index_html.get_local_roles(), localroles, 'CMF Collector issue #162 (LocalRoles broken): %s' % str( f.index_html.get_local_roles() ) ) self.assertEqual( wtool.test_notified, f.index_html ) # acquisition self.site.user_bar = 'test attribute' newSecurityManager(None, acl_users.user_bar) mtool.createMemberArea('user_bar') self.failUnless( hasattr(members.aq_self, 'user_bar'), 'CMF Collector issue #102 (acquisition bug)' )
class DynamicTypeSecurityTests(SecurityTest): 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 tearDown(self): cleanUp() SecurityTest.tearDown(self) def test_getTypeInfo(self): foo = self.site.foo self.assertEqual( foo.getTypeInfo().getId(), 'Dummy Content 15' ) def test_getActionInfo(self): foo = self.site.foo self.assertEqual( foo.getActionInfo('object/view')['id'], 'view' ) # The following is nasty, but I want to make sure the ValueError # carries some useful information INVALID_ID = 'invalid_id' try: foo.getActionInfo('object/%s' % INVALID_ID) except ValueError, e: message = e.args[0] detail = '"%s" does not offer action "%s"' % (message, INVALID_ID) self.failUnless(message.find(INVALID_ID) != -1, detail)
class DynamicTypeTests(TestCase): 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() ) def test___before_publishing_traverse__(self): dummy_view = self.site._setObject( 'dummy_view', DummyObject() ) response = HTTPResponse() environment = { 'URL': '', 'PARENTS': [self.site], 'REQUEST_METHOD': 'GET', 'steps': [], '_hacked_path': 0, 'response': response } r = BaseRequest(environment) r.traverse('foo') self.assertEqual( r.URL, '/foo/dummy_view' ) self.assertEqual( r.response.base, '/foo/', 'CMF Collector issue #192 (wrong base): %s' % (r.response.base or 'empty',) ) def test_interface(self): from Products.CMFCore.interfaces.Dynamic \ import DynamicType as IDynamicType verifyClass(IDynamicType, DynamicType)
class TestImageElement(ConformsToContent, unittest.TestCase): def _getTargetClass(self): from Products.CMFDefault.Image import Image return Image def _makeOne(self, *args, **kw): return self._getTargetClass()(*args, **kw) def setUp(self): self.site = DummySite('site') self.site._setObject( 'portal_membership', DummyTool() ) def test_getId_on_old_Image_instance(self): image = self.site._setObject('testimage', self._makeOne('testimage')) self.assertEqual(image.getId(), 'testimage') self.assertEqual(image.id, 'testimage') # Mimick old instance when base classes had OFS.Image.Image first image.__name__ = 'testimage' delattr(image, 'id') self.assertEqual(image.getId(), 'testimage') self.assertEqual(image.id(), 'testimage') def test_EditWithEmptyFile(self): # Test handling of empty file uploads image = self.site._setObject('testimage', self._makeOne('testimage')) testfile = open(TEST_JPG, 'rb') image.edit(file=testfile) testfile.seek(0,2) testfilesize = testfile.tell() testfile.close() assert image.get_size() == testfilesize emptyfile = StringIO() image.edit(file=emptyfile) assert image.get_size() > 0 assert image.get_size() == testfilesize def test_Image_setFormat(self): # Setting the DC.format must also set the content_type property image = self._makeOne('testimage', format='image/jpeg') self.assertEqual(image.Format(), 'image/jpeg') self.assertEqual(image.content_type, 'image/jpeg') image.setFormat('image/gif') self.assertEqual(image.Format(), 'image/gif') self.assertEqual(image.content_type, 'image/gif') def test_ImageContentTypeUponConstruction(self): # Test the content type after calling the constructor with the # file object being passed in (http://www.zope.org/Collectors/CMF/370) testfile = open(TEST_JPG, 'rb') image = self._makeOne('testimage', file=testfile) testfile.close() self.assertEqual(image.Format(), 'image/jpeg') self.assertEqual(image.content_type, 'image/jpeg')
class RequestTestBase(RequestTest): def setUp(self): RequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_membership', DummyTool() ) def _makeOne(self, id, *args, **kw): return self.site._setObject( id, Document(id, *args, **kw) )
class PortalFolderFactoryTests(SecurityTest): layer = TraversingEventZCMLLayer _PORTAL_TYPE = 'Test Folder' def _getTargetObject(self): from Products.CMFCore.PortalFolder import PortalFolderFactory return PortalFolderFactory def setUp(self): from Products.CMFCore.PortalFolder import PortalFolder SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.app) acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.all_powerful_Oz) self.ttool = ttool = 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())) sm = getSiteManager() sm.registerUtility(ttool, ITypesTool) sm.registerUtility(self._getTargetObject(), IFactory, 'cmf.folder') self.f = self.site._setObject('container', PortalFolder('container')) self.f._setPortalTypeName(self._PORTAL_TYPE) def test_invokeFactory(self): f = self.f self.assertFalse('foo' in f.objectIds()) f.manage_addProduct = {'FooProduct': DummyFactoryDispatcher(f)} f.invokeFactory(type_name='Dummy Content', id='foo') self.assertTrue('foo' in f.objectIds()) foo = f.foo self.assertEqual(foo.getId(), 'foo') self.assertEqual(foo.getPortalTypeName(), 'Dummy Content') self.assertEqual(foo.Type(), 'Dummy Content Title') def test_invokeFactory_disallowed_type(self): f = self.f ftype = getattr(self.ttool, self._PORTAL_TYPE) ftype.filter_content_types = 1 self.assertRaises(ValueError, f.invokeFactory, self._PORTAL_TYPE, 'sub') ftype.allowed_content_types = (self._PORTAL_TYPE,) f.invokeFactory(self._PORTAL_TYPE, id='sub') self.assertTrue('sub' in f.objectIds()) self.assertRaises(ValueError, f.invokeFactory, 'Dummy Content', 'foo')
class URLToolTests(unittest.TestCase): def setUp(self): self.site = DummySite(id='foo') sm = getSiteManager() sm.registerUtility(self.site, ISiteRoot) def tearDown(self): cleanUp() def _makeOne(self, *args, **kw): from Products.CMFCore.URLTool import URLTool url_tool = URLTool(*args, **kw) return url_tool.__of__( self.site ) def test_z2interfaces(self): from Interface.Verify import verifyClass from Products.CMFCore.interfaces.portal_actions \ import ActionProvider as IActionProvider from Products.CMFCore.interfaces.portal_url \ import portal_url as IURLTool from Products.CMFCore.URLTool import URLTool verifyClass(IActionProvider, URLTool) verifyClass(IURLTool, URLTool) def test_z3interfaces(self): from zope.interface.verify import verifyClass from Products.CMFCore.interfaces import IActionProvider from Products.CMFCore.interfaces import IURLTool from Products.CMFCore.URLTool import URLTool verifyClass(IActionProvider, URLTool) verifyClass(IURLTool, URLTool) def test_portal_methods(self): url_tool = self._makeOne() self.assertEqual( url_tool() , 'http://www.foobar.com/bar/foo' ) self.assertEqual( url_tool.getPortalObject() , self.site ) self.assertEqual( url_tool.getPortalPath() , '/bar/foo' ) def test_content_methods(self): url_tool = self._makeOne() self.site._setObject( 'folder', DummyFolder(id='buz') ) self.site.folder._setObject( 'item', DummyContent(id='qux.html') ) obj = self.site.folder.item self.assertEqual( url_tool.getRelativeContentPath(obj) , ('buz', 'qux.html') ) self.assertEqual( url_tool.getRelativeContentURL(obj) , 'buz/qux.html' ) self.assertEqual( url_tool.getRelativeUrl(obj) , 'buz/qux.html' )
def setUp(self): from Products.CMFCore.ActionsTool import ActionsTool PlacelessSetup.setUp(self) zcml.load_config('meta.zcml', Products.Five) zcml.load_config('configure.zcml', Products.CMFCore) site = DummySite('site') site._setObject('portal_actions', ActionsTool('portal_actions')) self._obj = site.portal_actions self._XML = _ACTIONSTOOL_XML
def setUp(self): import Products.CMFCore from Products.CMFCore.ActionsTool import ActionsTool BodyAdapterTestCase.setUp(self) zcml.load_config('configure.zcml', Products.CMFCore) site = DummySite('site') site._setObject('portal_actions', ActionsTool('portal_actions')) self._obj = site.portal_actions self._BODY = _ACTIONSTOOL_BODY
class DefaultWorkflowDefinitionTests(unittest.TestCase): def setUp(self): from Products.CMFDefault.DefaultWorkflow \ import DefaultWorkflowDefinition self.site = DummySite('site') self.site._setObject('portal_types', DummyTool()) self.site._setObject('portal_workflow', WorkflowTool()) self.site._setObject('portal_membership', DummyTool()) self.site._setObject('acl_users', DummyUserFolder()) wftool = self.site.portal_workflow wftool._setObject('wf', DefaultWorkflowDefinition('wf')) wftool.setDefaultChain('wf') def test_z2interfaces(self): from Interface.Verify import verifyClass from Products.CMFCore.interfaces.portal_workflow \ import WorkflowDefinition as IWorkflowDefinition from Products.CMFDefault.DefaultWorkflow \ import DefaultWorkflowDefinition verifyClass(IWorkflowDefinition, DefaultWorkflowDefinition) def test_z3interfaces(self): from zope.interface.verify import verifyClass from Products.CMFCore.interfaces import IWorkflowDefinition from Products.CMFDefault.DefaultWorkflow \ import DefaultWorkflowDefinition verifyClass(IWorkflowDefinition, DefaultWorkflowDefinition) def _getDummyWorkflow(self): wftool = self.site.portal_workflow return wftool.wf def test_isActionSupported(self): wf = self._getDummyWorkflow() dummy = self.site._setObject('dummy', DummyContent()) for action in ('submit', 'retract', 'publish', 'reject',): self.assert_(wf.isActionSupported(dummy, action)) def test_isActionSupported_with_keywargs(self): wf = self._getDummyWorkflow() dummy = self.site._setObject('dummy', DummyContent()) for action in ('submit', 'retract', 'publish', 'reject',): self.assert_(wf.isActionSupported(dummy, action, arg1=1, arg2=2))
def test_refreshCatalog(self): site = DummySite('site').__of__(self.root) site._setObject('dummy', DummyContent(catalog=1)) site._setObject('portal_catalog', self._makeOne()) ctool = site.portal_catalog ctool.catalog_object(site.dummy, '/dummy') self.assertEqual(1, len(ctool._catalog.searchResults())) ctool.refreshCatalog(clear=1) self.assertEqual(1, len(ctool._catalog.searchResults()), 'CMF Collector issue #379 (\'Update Catalog\' ' 'fails): %s entries after refreshCatalog' % (len(ctool._catalog.searchResults()),))
def test_notifyModified(self): site = DummySite('site').__of__(self.root) acl_users = site._setObject( 'acl_users', DummyUserFolder() ) site._setObject( 'portal_membership', MembershipTool() ) newSecurityManager(None, acl_users.user_foo) item = self._makeDummyContent('item').__of__(site) self.assertEqual( item.listCreators(), () ) item.setModificationDate(0) initial_date = item.ModificationDate() item.notifyModified() self.assertEqual( item.listCreators(), ('user_foo',) ) self.assertNotEqual( item.ModificationDate(), initial_date )
def setUp(self): from Products.CMFCore.interfaces import IActionsTool from Products.CMFCore.ActionsTool import ActionsTool BodyAdapterTestCase.setUp(self) site = DummySite('site') site._setObject('portal_actions', ActionsTool('portal_actions')) self._obj = site.portal_actions self._BODY = _ACTIONSTOOL_BODY # utility registration sm = getSiteManager() sm.registerUtility(self._obj, IActionsTool)
class DublinCoreTests(SecurityTest): def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_membership', MembershipTool() ) def _makeDummyContent(self, id, *args, **kw): return self.site._setObject( id, DummyContent(id, *args, **kw) ) def test_notifyModified(self): acl_users = self.site._setObject( 'acl_users', DummyUserFolder() ) newSecurityManager(None, acl_users.user_foo) item = self._makeDummyContent('item') self.assertEqual( item.listCreators(), () ) item.setModificationDate(0) initial_date = item.ModificationDate() item.notifyModified() self.assertEqual( item.listCreators(), ('user_foo',) ) self.assertNotEqual( item.ModificationDate(), initial_date ) def test_creators_methods(self): acl_users = self.site._setObject( 'acl_users', DummyUserFolder() ) newSecurityManager(None, acl_users.user_foo) item = self._makeDummyContent('item') self.assertEqual( item.listCreators(), () ) item.addCreator() self.assertEqual( item.listCreators(), ('user_foo',) ) newSecurityManager(None, acl_users.user_bar) item.addCreator() self.assertEqual( item.listCreators(), ('user_foo', 'user_bar') ) item.addCreator() self.assertEqual( item.listCreators(), ('user_foo', 'user_bar') ) item.addCreator('user_baz') self.assertEqual( item.listCreators(), ('user_foo', 'user_bar', 'user_baz') ) def test_interface(self): from Products.CMFCore.interfaces.DublinCore \ import DublinCore as IDublinCore from Products.CMFCore.interfaces.DublinCore \ import CatalogableDublinCore as ICatalogableDublinCore from Products.CMFCore.interfaces.DublinCore \ import MutableDublinCore as IMutableDublinCore verifyClass(IDublinCore, DefaultDublinCoreImpl) verifyClass(ICatalogableDublinCore, DefaultDublinCoreImpl) verifyClass(IMutableDublinCore, DefaultDublinCoreImpl)
class DynamicTypeSecurityTests(SecurityRequestTest): def setUp(self): SecurityRequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_membership', DummyTool() ) self.site._setObject( 'portal_types', TypesTool() ) self.site._setObject( 'portal_url', DummyTool() ) fti = FTIDATA_CMF15[0].copy() self.site.portal_types._setObject( 'Dummy Content 15', FTI(**fti) ) self.site._setObject( 'foo', DummyContent() ) def tearDown(self): cleanUp() SecurityRequestTest.tearDown(self) def test_getTypeInfo(self): foo = self.site.foo self.assertEqual( foo.getTypeInfo().getId(), 'Dummy Content 15' ) def test_getActionInfo(self): foo = self.site.foo self.assertEqual( foo.getActionInfo('object/view')['id'], 'view' ) # The following is nasty, but I want to make sure the ValueError # carries some useful information INVALID_ID = 'invalid_id' try: rval = foo.getActionInfo('object/%s' % INVALID_ID) except ValueError, e: message = e.args[0] detail = '"%s" does not offer action "%s"' % (message, INVALID_ID) self.failUnless(message.find(INVALID_ID) != -1, detail)
def test_refreshCatalog(self): site = DummySite('site') site._setObject('dummy', self._makeContent(catalog=1)) ctool = self._makeOne().__of__(site) ctool.addIndex('meta_type', 'FieldIndex') ctool.catalog_object(site.dummy, '/dummy') query = {'meta_type': 'Dummy'} self.assertEqual(1, len(ctool._catalog.searchResults(query))) ctool.refreshCatalog(clear=1) length = len(ctool._catalog.searchResults(query)) self.assertEqual(1, length, 'CMF Collector issue #379 (\'Update Catalog\' ' 'fails): %s entries after refreshCatalog' % length)
def _makeSite(self): from AccessControl.Owned import Owned from Products.CMFCore.tests.base.dummy import DummySite from Products.CMFCore.tests.base.dummy import DummyUserFolder from Products.CMFCore.tests.base.dummy import DummyObject class _DummyObject(Owned, DummyObject): pass site = DummySite('site').__of__(self.root) site._setObject( 'acl_users', DummyUserFolder() ) site._setObject('foo_dummy', _DummyObject(id='foo_dummy')) site._setObject('bar_dummy', _DummyObject(id='bar_dummy')) return site
def setUp(self): self.site = DummySite('site') self.site._setObject('portal_types', DummyTool()) self.site._setObject('portal_workflow', WorkflowTool()) self._constructDummyWorkflows() provideHandler(react.object_transitioned)
def setUp(self): self._trap_warning_output() SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) sm = getSiteManager() sm.registerUtility(DummyTool(), IMembershipTool) sm.registerUtility(DummyTool().__of__(self.site), IURLTool)
def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site') sm = getSiteManager() self.site._setObject( 'portal_discussion', self._makeOne() ) sm.registerUtility(self.site.portal_discussion, IDiscussionTool) self.site._setObject( 'portal_types', DummyTool() )
def setUp(self): self.site = DummySite(id='foo') self.site._setObject('foo', DummyFolder(id='foo')) self.site.foo._setObject('doc1', DummyContent(id='doc1')) self.site.portal_properties = DummyProperties(id='portal_properties') self.site.portal_properties.site_properties = \ DummyProperties(id='site_properties')
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() )
def setUp(self): sm = getSiteManager() self.site = DummySite('site') sm.registerUtility(self.site, ISiteRoot) self.site._setObject( 'portal_membership', DummyTool() ) self.site._setObject( 'portal_url', DummyTool() ) self.site._setObject( 'target', DummyContent() )
def setUp(self): sm = getSiteManager() self.site = DummySite('site') self.site._setObject( 'portal_membership', DummyTool() ) sm.registerUtility(self.site.portal_membership, IMembershipTool) self.site._setObject( 'portal_url', DummyTool() ) sm.registerUtility(self.site.portal_url, IURLTool)
def setUp(self): self.site = DummySite('site') sm = getSiteManager() sm.registerUtility(self.site, ISiteRoot) sm.registerUtility(DummyTool(), IMembershipTool) sm.registerUtility(DummyTool().__of__(self.site), IURLTool) self.site._setObject( 'target', DummyContent() )
class TestTopic(SecurityTest): """ Test all the general Topic cases. """ def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) def _makeOne(self, id, *args, **kw): from Products.CMFTopic.Topic import Topic return self.site._setObject(id, Topic(id, *args, **kw)) def _initSite(self, max_items=15, index_ids=()): self.site.portal_catalog = DummyCatalog(index_ids) self.site.portal_syndication = DummySyndicationTool(max_items) def _initDocuments(self, **kw): for k, v in kw.items(): document = DummyDocument(k) document.description = v self.site._setObject(k, v) self.site.portal_catalog._index(document) def test_z2interfaces(self): from Interface.Verify import verifyClass from OFS.IOrderSupport import IOrderedContainer from webdav.WriteLockInterface import WriteLockInterface from Products.CMFCore.interfaces.Dynamic \ import DynamicType as IDynamicType from Products.CMFCore.interfaces.Folderish \ import Folderish as IFolderish from Products.CMFTopic.Topic import Topic verifyClass(IDynamicType, Topic) verifyClass(IFolderish, Topic) verifyClass(IOrderedContainer, Topic) verifyClass(WriteLockInterface, Topic) def test_z3interfaces(self): try: from zope.interface.verify import verifyClass except ImportError: # BBB: for Zope 2.7 return from Products.CMFCore.interfaces import IDynamicType from Products.CMFCore.interfaces import IFolderish from Products.CMFTopic.Topic import Topic verifyClass(IDynamicType, Topic) verifyClass(IFolderish, Topic) def test_Empty(self): topic = self._makeOne('top') query = topic.buildQuery() self.assertEqual(len(query), 0) def test_Simple(self): topic = self._makeOne('top') topic.addCriterion('foo', 'String Criterion') topic.getCriterion('foo').edit('bar') query = topic.buildQuery() self.assertEqual(len(query), 1) self.assertEqual(query['foo'], 'bar') topic.addCriterion('baz', 'Integer Criterion') topic.getCriterion('baz').edit(43) query = topic.buildQuery() self.assertEqual(len(query), 2) self.assertEqual(query['foo'], 'bar') self.assertEqual(query['baz'], 43) def test_Nested(self): self.site._setObject('portal_types', TypesTool()) fti = FTIDATA_TOPIC[0].copy() self.site.portal_types._setObject('Topic', FTI(**fti)) topic = self._makeOne('top') topic._setPortalTypeName('Topic') topic.addCriterion('foo', 'String Criterion') topic.getCriterion('foo').edit('bar') topic.addSubtopic('qux') subtopic = topic.qux subtopic.addCriterion('baz', 'String Criterion') subtopic.getCriterion('baz').edit('bam') query = subtopic.buildQuery() self.assertEqual(len(query), 2) self.assertEqual(query['foo'], 'bar') self.assertEqual(query['baz'], 'bam') subtopic.acquireCriteria = 0 query = subtopic.buildQuery() self.assertEqual(len(query), 1) self.assertEqual(query['baz'], 'bam') def test_selfIndexing(self): # The Topic object is CatalogAware and should be in the catalog # after it has beeen instantiated. self._initSite() topic = self._makeOne('top') # A topic without criteria will return a full catalog search result # set, so we should not have one result, for the Topic object itself. results = topic.queryCatalog() self.assertEquals(len(results), 1) self.assertEquals(results[0].getObject().getId(), topic.getId()) self.assertEquals(results[0].getObject(), topic) def test_searchableText(self): # Test the catalog helper topic = self._makeOne('top') topic.edit(False, title='FOO', description='BAR') st = topic.SearchableText() self.failUnless(st.find('BAR') != -1) self.failUnless(st.find('FOO') != -1) def test_queryCatalog_noop(self): self._initSite() self._initDocuments(**_DOCUMENTS) topic = self._makeOne('top') # Need to filter out the Topic object itself, which is also # CatalogAware and will index itself after instantiation. brains = [ x for x in topic.queryCatalog() if x.getObject().getId() != 'top' ] self.assertEqual(len(brains), len(_DOCUMENTS)) objects = [brain.getObject() for brain in brains] for object in objects: self.failUnless(object.getId() in _DOCUMENTS.keys()) self.failUnless(object.description in _DOCUMENTS.values()) def test_queryCatalog_simple(self): WORD = 'something' self._initSite(index_ids=('description', )) self._initDocuments(**_DOCUMENTS) topic = self._makeOne('top') topic.addCriterion('description', 'String Criterion') topic.getCriterion('description').edit(WORD) brains = topic.queryCatalog() self.assertEqual(len(brains), len([x for x in _DOCUMENTS.values() if WORD in x])) objects = [brain.getObject() for brain in brains] for object in objects: self.failUnless(object.getId() in _DOCUMENTS.keys()) self.failUnless(object.description in _DOCUMENTS.values()) def test_synContentValues_simple(self): self._initSite() self._initDocuments(**_DOCUMENTS) topic = self._makeOne('top') #brains = topic.synContentValues() # Need to filter out the Topic object itself, which is also # CatalogAware and will index itself after instantiation. brains = [ x for x in topic.synContentValues() if x.getObject().getId() != 'top' ] self.assertEqual(len(brains), len(_DOCUMENTS)) objects = [brain.getObject() for brain in brains] for object in objects: self.failUnless(object.getId() in _DOCUMENTS.keys()) self.failUnless(object.description in _DOCUMENTS.values()) def test_synContentValues_limit(self): LIMIT = 3 self._initSite(max_items=LIMIT) self._initDocuments(**_DOCUMENTS) topic = self._makeOne('top') brains = topic.synContentValues() self.assertEqual(len(brains), LIMIT) objects = [brain.getObject() for brain in brains] for object in objects: self.failUnless(object.getId() in _DOCUMENTS.keys()) self.failUnless(object.description in _DOCUMENTS.values())
def setUp(self): from Products.CMFCore import CachingPolicyManager RequestTest.setUp(self) FSDVTest.setUp(self) zcml.load_config('meta.zcml', Products.Five) zcml.load_config('permissions.zcml', Products.Five) zcml.load_config('configure.zcml', Products.CMFCore) zcml.load_string(_TRAVERSE_ZCML) now = DateTime() # Create a fake portal and the tools we need self.portal = DummySite(id='portal').__of__(self.root) self.portal._setObject('portal_types', DummyTool()) # This is a FSPageTemplate that will be used as the View for # our content objects. It doesn't matter what it returns. path = os.path.join(self.skin_path_name, 'testPT2.pt') self.portal._setObject('dummy_view', FSPageTemplate('dummy_view', path)) uf = self.root.acl_users password = '******' uf.userFolderAddUser(portal_owner, password, ['Manager'], []) user = uf.getUserById(portal_owner) if not hasattr(user, 'aq_base'): user = user.__of__(uf) newSecurityManager(None, user) owner_auth = '%s:%s' % (portal_owner, password) self.auth_header = "Basic %s" % base64.encodestring(owner_auth) self.portal._setObject('doc1', DummyContent('doc1')) self.portal._setObject('doc2', DummyContent('doc2')) self.portal._setObject('doc3', DummyContent('doc3')) self.portal.doc1.modified_date = now self.portal.doc2.modified_date = now self.portal.doc3.modified_date = now CachingPolicyManager.manage_addCachingPolicyManager(self.portal) cpm = self.portal.caching_policy_manager # This policy only applies to doc1. It will not emit any ETag header # but it enables If-modified-since handling. cpm.addPolicy(policy_id='policy_no_etag', predicate='python:object.getId()=="doc1"', mtime_func='', max_age_secs=0, no_cache=0, no_store=0, must_revalidate=0, vary='', etag_func='', enable_304s=1) # This policy only applies to doc2. It will emit an ETag with # the constant value "abc" and also enable if-modified-since handling. cpm.addPolicy(policy_id='policy_etag', predicate='python:object.getId()=="doc2"', mtime_func='', max_age_secs=0, no_cache=0, no_store=0, must_revalidate=0, vary='', etag_func='string:abc', enable_304s=1) # This policy only applies to doc3. Etags with constant values of # "abc" are emitted, but if-modified-since handling is turned off. cpm.addPolicy(policy_id='policy_disabled', predicate='python:object.getId()=="doc3"', mtime_func='', max_age_secs=0, no_cache=0, no_store=0, must_revalidate=0, vary='', etag_func='string:abc', enable_304s=0)
def setUp(self): self.site = DummySite('site') self.site._setObject('portal_membership', DummyTool()) self.site._setObject('portal_url', DummyTool())
def setUp(self): SecurityRequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) utool = self.site._setObject('portal_url', DummyTool()) mtool = self.site._setObject('portal_membership', DummyTool())
class DCWorkflowDefinitionTests(unittest.TestCase): layer = TraversingEventZCMLLayer def setUp(self): self.site = DummySite('site') self.site._setObject('portal_types', DummyTool()) self.site._setObject('portal_workflow', WorkflowTool()) self._constructDummyWorkflow() def test_z2interfaces(self): from Interface.Verify import verifyClass from Products.CMFCore.interfaces.portal_workflow \ import WorkflowDefinition as IWorkflowDefinition from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition verifyClass(IWorkflowDefinition, DCWorkflowDefinition) def test_z3interfaces(self): from zope.interface.verify import verifyClass from Products.CMFCore.interfaces import IWorkflowDefinition from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition verifyClass(IWorkflowDefinition, DCWorkflowDefinition) def _constructDummyWorkflow(self): from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition wftool = self.site.portal_workflow wftool._setObject('wf', DCWorkflowDefinition('wf')) wftool.setDefaultChain('wf') wf = wftool.wf wf.states.addState('private') sdef = wf.states['private'] sdef.setProperties(transitions=('publish', )) wf.states.addState('published') wf.states.setInitialState('private') wf.transitions.addTransition('publish') tdef = wf.transitions['publish'] tdef.setProperties(title='', new_state_id='published', actbox_name='') wf.variables.addVariable('comments') vdef = wf.variables['comments'] vdef.setProperties( description='', default_expr="python:state_change.kwargs.get('comment', '')", for_status=1, update_always=1) def _getDummyWorkflow(self): wftool = self.site.portal_workflow return wftool.wf def test_doActionFor(self): wftool = self.site.portal_workflow wf = self._getDummyWorkflow() dummy = self.site._setObject('dummy', DummyContent()) wftool.notifyCreated(dummy) self.assertEqual(wf._getStatusOf(dummy), { 'state': 'private', 'comments': '' }) wf.doActionFor(dummy, 'publish', comment='foo') self.assertEqual(wf._getStatusOf(dummy), { 'state': 'published', 'comments': 'foo' }) # XXX more def test_events(self): events = [] @adapter(IBeforeTransitionEvent) def _handleBefore(event): events.append(event) provideHandler(_handleBefore) @adapter(IAfterTransitionEvent) def _handleAfter(event): events.append(event) provideHandler(_handleAfter) wftool = self.site.portal_workflow wf = self._getDummyWorkflow() dummy = self.site._setObject('dummy', DummyContent()) wftool.notifyCreated(dummy) wf.doActionFor(dummy, 'publish', comment='foo', test='bar') self.assertEquals(4, len(events)) evt = events[0] self.failUnless(IBeforeTransitionEvent.providedBy(evt)) self.assertEquals(dummy, evt.object) self.assertEquals('private', evt.old_state.id) self.assertEquals('private', evt.new_state.id) self.assertEquals(None, evt.transition) self.assertEquals({}, evt.status) self.assertEquals(None, evt.kwargs) evt = events[1] self.failUnless(IAfterTransitionEvent.providedBy(evt)) self.assertEquals(dummy, evt.object) self.assertEquals('private', evt.old_state.id) self.assertEquals('private', evt.new_state.id) self.assertEquals(None, evt.transition) self.assertEquals({}, evt.status) self.assertEquals(None, evt.kwargs) evt = events[2] self.failUnless(IBeforeTransitionEvent.providedBy(evt)) self.assertEquals(dummy, evt.object) self.assertEquals('private', evt.old_state.id) self.assertEquals('published', evt.new_state.id) self.assertEquals('publish', evt.transition.id) self.assertEquals({'state': 'private', 'comments': ''}, evt.status) self.assertEquals({'test': 'bar', 'comment': 'foo'}, evt.kwargs) evt = events[3] self.failUnless(IAfterTransitionEvent.providedBy(evt)) self.assertEquals(dummy, evt.object) self.assertEquals('private', evt.old_state.id) self.assertEquals('published', evt.new_state.id) self.assertEquals('publish', evt.transition.id) self.assertEquals({'state': 'private', 'comments': ''}, evt.status) self.assertEquals({'test': 'bar', 'comment': 'foo'}, evt.kwargs) def test_checkTransitionGuard(self): wftool = self.site.portal_workflow wf = self._getDummyWorkflow() dummy = self.site._setObject('dummy', DummyContent()) wftool.notifyCreated(dummy) self.assertEqual(wf._getStatusOf(dummy), { 'state': 'private', 'comments': '' }) # Check self.assert_(wf._checkTransitionGuard(wf.transitions['publish'], dummy)) # Check with kwargs propagation self.assert_( wf._checkTransitionGuard(wf.transitions['publish'], dummy, arg1=1, arg2=2)) def test_isActionSupported(self): wf = self._getDummyWorkflow() dummy = self.site._setObject('dummy', DummyContent()) # check publish self.assert_(wf.isActionSupported(dummy, 'publish')) # Check with kwargs. self.assert_(wf.isActionSupported(dummy, 'publish', arg1=1, arg2=2))
def test_publisher_with_metadata_tool(self): PUBLISHER = 'Some Publisher' site = DummySite('site').__of__(self.root) site.portal_metadata = DummyMetadataTool(publisher=PUBLISHER) item = self._makeDummyContent('item').__of__(site) self.assertEqual(item.Publisher(), PUBLISHER)
def test_publisher_no_metadata_tool(self): site = DummySite('site').__of__(self.root) item = self._makeDummyContent('item').__of__(site) self.assertEqual(item.Publisher(), 'No publisher')
def test_ceiling_parsable(self): # Test that a None ceiling date will be parsable by a DateIndex site = DummySite('site').__of__(self.root) item = self._makeDummyContent('item').__of__(site) self.assertEqual(item.expiration_date, None) self.assert_(_DateIndexConvert(item.expires()))
def setUp(self): self.site = DummySite('site') self.site._setObject('portal_discussion', DiscussionTool()) self.site._setObject('portal_membership', DummyTool())
def setUp( self ): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_discussion', DiscussionTool() ) self.site._setObject( 'portal_membership', DummyTool() ) self.site._setObject( 'portal_types', TypesTool() )
class TypesToolTests(SecurityTest, WarningInterceptor): layer = FunctionalZCMLLayer def _makeOne(self): from Products.CMFCore.TypesTool import TypesTool return TypesTool() def setUp(self): from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI 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) ) def tearDown(self): SecurityTest.tearDown(self) self._free_warning_output() def test_interfaces(self): from Products.CMFCore.interfaces import IActionProvider from Products.CMFCore.interfaces import ITypesTool from Products.CMFCore.TypesTool import TypesTool verifyClass(IActionProvider, TypesTool) verifyClass(ITypesTool, TypesTool) def test_listActions(self): """test that a full set of context information is passed by the types tool """ tool = self.ttool ti = ActionTesterTypeInfo() setattr( tool, 'Dummy Content', ti ) dummy = self.site._setObject('dummy', DummyContent('dummy')) tool.listActions('fake_info', dummy) self.assertEqual(ti._action_info, 'fake_info') self.assertEqual(ti._action_obj, dummy) def test_allMetaTypes(self): """ Test that everything returned by allMetaTypes can be traversed to. """ tool = self.ttool 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(): meta_types[factype['name']]=1 # The html_quote below is necessary 'cos of the one in # main.dtml. Could be removed once that is gone. act = tool.unrestrictedTraverse(html_quote(factype['action'])) self.failIf(type(aq_base(act)) is NullResource) # Check the ones we're expecting are there self.failUnless(meta_types.has_key('Scriptable Type Information')) self.failUnless(meta_types.has_key('Factory-based Type Information')) def test_constructContent(self): from Products.CMFCore.TypesTool \ import ScriptableTypeInformation as STI site = self.site acl_users = self.acl_users ttool = self.ttool setSecurityPolicy(self._oldPolicy) newSecurityManager(None, acl_users.all_powerful_Oz) self.site._owner = (['acl_users'], 'all_powerful_Oz') 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) 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') except Unauthorized: self.fail('CMF Collector issue #165 (Ownership bug): ' 'Unauthorized raised' )
def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.mtool = MembershipTool().__of__(self.site)
class PortalFolderFactoryTests(SecurityTest): _PORTAL_TYPE = 'Test Folder' def _getTargetObject(self): from Products.CMFCore.PortalFolder import PortalFolderFactory return PortalFolderFactory def setUp(self): from Products.CMFCore.PortalFolder import PortalFolder SecurityTest.setUp(self) setUpEvents() gsm = getGlobalSiteManager() gsm.provideUtility(IFactory, self._getTargetObject(), '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 tearDown(self): SecurityTest.tearDown(self) cleanUp() def test_invokeFactory(self): f = self.f self.failIf('foo' in f.objectIds()) f.manage_addProduct = {'FooProduct': DummyFactoryDispatcher(f)} f.invokeFactory(type_name='Dummy Content', id='foo') self.failUnless('foo' in f.objectIds()) foo = f.foo self.assertEqual(foo.getId(), 'foo') self.assertEqual(foo.getPortalTypeName(), 'Dummy Content') self.assertEqual(foo.Type(), 'Dummy Content Title') def test_invokeFactory_disallowed_type(self): f = self.f ftype = getattr(self.site.portal_types, self._PORTAL_TYPE) ftype.filter_content_types = 1 self.assertRaises(ValueError, f.invokeFactory, self._PORTAL_TYPE, 'sub') ftype.allowed_content_types = (self._PORTAL_TYPE, ) f.invokeFactory(self._PORTAL_TYPE, id='sub') self.failUnless('sub' in f.objectIds()) self.assertRaises(ValueError, f.invokeFactory, 'Dummy Content', 'foo')
class TestURLTool(unittest.TestCase): def setUp(self): self.site = DummySite(id='foo') self.site._setObject('foo', DummyFolder(id='foo')) self.site.foo._setObject('doc1', DummyContent(id='doc1')) mock_registry = DummyRegistry(id='portal_registry') self.site.portal_registry = mock_registry sm = getSiteManager() sm.registerUtility(component=mock_registry, provided=IRegistry) def _makeOne(self, *args, **kw): from Products.CMFPlone.URLTool import URLTool url_tool = URLTool(*args, **kw) return url_tool.__of__(self.site) def test_isURLInPortal(self): # First test what the absolute url of the site is, otherwise these # tests look really weird. Apparently our domain is www.foobar.com. self.assertEqual(self.site.absolute_url(), 'http://www.foobar.com/bar/foo') url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertTrue(iURLiP('http://www.foobar.com/bar/foo/folder')) self.assertTrue(iURLiP('http://www.foobar.com/bar/foo')) self.assertFalse(iURLiP('http://www.foobar.com/bar2/foo')) self.assertTrue(iURLiP('https://www.foobar.com/bar/foo/folder')) self.assertFalse(iURLiP('http://www.foobar.com:8080/bar/foo/folder')) self.assertFalse(iURLiP('http://www.foobar.com/bar')) self.assertTrue(iURLiP('//www.foobar.com/bar/foo')) self.assertFalse(iURLiP('/images')) self.assertTrue(iURLiP('/bar/foo/foo')) def test_isURLInPortalRelative(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal # non-root relative urls will need a current context to be passed in self.assertTrue(iURLiP('images/img1.jpg')) self.assertTrue(iURLiP('./images/img1.jpg')) # /bar/foo/something self.assertTrue(iURLiP('../something', self.site.foo.doc1)) # /bar/afolder self.assertFalse(iURLiP('../../afolder', self.site.foo.doc1)) # /afolder self.assertFalse(iURLiP('../../../afolder', self.site.foo.doc1)) # /../afolder? How do we have more ../'s than there are parts in # the URL? self.assertFalse(iURLiP('../../../../afolder', self.site.foo.doc1)) # /bar/foo/afolder self.assertTrue(iURLiP('../../foo/afolder', self.site.foo.doc1)) def test_isURLInPortalExternal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertTrue(iURLiP('http://external1')) self.assertTrue(iURLiP('http://external1/')) self.assertTrue(iURLiP('http://external1/something')) self.assertTrue(iURLiP('http://external2')) self.assertTrue(iURLiP('http://external2/')) self.assertTrue(iURLiP('http://external2/something')) self.assertTrue(iURLiP('http://external3/site')) self.assertTrue(iURLiP('http://external3/site/')) self.assertTrue(iURLiP('http://external3/site/something')) self.assertTrue(iURLiP('http://external4/site')) self.assertTrue(iURLiP('http://external4/site/')) self.assertTrue(iURLiP('http://external4/site/something')) self.assertFalse(iURLiP('http://external3/other')) self.assertFalse(iURLiP('http://external4/other')) self.assertFalse(iURLiP('http://external5')) self.assertFalse(iURLiP('http://external11')) def test_script_tag_url_not_in_portal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP('<script>alert("hi");</script>')) self.assertFalse(iURLiP('<sCript>alert("hi");</script>')) self.assertFalse( iURLiP('%3Cscript%3Ealert(%22hi%22)%3B%3C%2Fscript%3E')) self.assertFalse( iURLiP('%3CsCript%3Ealert(%22hi%22)%3B%3C%2Fscript%3E')) def test_inline_url_not_in_portal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP('javascript%3Aalert(3)')) self.assertFalse(iURLiP('jaVascript%3Aalert(3)')) self.assertFalse(iURLiP('javascript:alert(3)')) self.assertFalse(iURLiP('jaVascript:alert(3)')) def test_double_back_slash(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP('\\\\www.example.com')) def test_escape(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP('\/\/www.example.com')) self.assertFalse(iURLiP('\%2F\%2Fwww.example.com')) self.assertFalse(iURLiP('\%2f\%2fwww.example.com')) self.assertFalse(iURLiP('%2F%2Fwww.example.com')) self.assertFalse(iURLiP('%2f%2fwww.example.com')) def test_regression_absolute_url_in_portal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertTrue(iURLiP(url_tool())) self.assertTrue(iURLiP(url_tool() + '/shrubbery?knights=ni#ekki-ekki')) def test_mailto_simple_not_in_portal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP( 'mailto:[email protected]') ) def test_mailto_complex_not_in_portal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP( 'mailto:192.168.163.154:8080/Plone'' '"><html><svg onload=alert(document' '.domain)></html>') ) def test_data_not_in_portal(self): url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP( 'data:text/html%3bbase64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K') ) def test_double_slash(self): # I wondered if this might be a problem after reading # https://bugs.python.org/issue23505 # Apparently not, but let's test it. url_tool = self._makeOne() iURLiP = url_tool.isURLInPortal self.assertFalse(iURLiP( '//www.google.com')) self.assertFalse(iURLiP( '////www.google.com'))
class DiscussionTests(SecurityTest): layer = EventZCMLLayer def setUp(self): SecurityTest.setUp(self) newSecurityManager(None, DummyUser().__of__(self.app.acl_users)) 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_types', TypesTool() ) def _makeDummyContent(self, id, *args, **kw): return self.site._setObject( id, DummyContent(id, *args, **kw) ) def test_policy( self ): dtool = self.site.portal_discussion ttool = self.site.portal_types test = self._makeDummyContent('test') self.assertRaises(DiscussionNotAllowed, dtool.getDiscussionFor, test) assert getattr( test, 'talkback', None ) is None test.allow_discussion = 1 assert dtool.getDiscussionFor(test) assert test.talkback del test.talkback del test.allow_discussion fti = FTIDATA_DUMMY[0].copy() ttool._setObject( 'Dummy Content', FTI(**fti) ) self.assertRaises(DiscussionNotAllowed, dtool.getDiscussionFor, test) assert getattr( test, 'talkback', None ) is None ti = getattr(ttool, 'Dummy Content') ti.allow_discussion = 1 assert dtool.getDiscussionFor(test) assert test.talkback del test.talkback ti.allow_discussion = 0 self.assertRaises(DiscussionNotAllowed, dtool.getDiscussionFor, test) assert getattr( test, 'talkback', None ) is None test.allow_discussion = 1 assert dtool.getDiscussionFor(test) assert test.talkback def test_nestedReplies( self ): dtool = self.site.portal_discussion test = self._makeDummyContent('test') test.allow_discussion = 1 talkback = dtool.getDiscussionFor(test) assert talkback._getDiscussable() == test assert talkback._getDiscussable( outer=1 ) == test assert not talkback.hasReplies( test ) assert len( talkback.getReplies() ) == 0 reply_id = talkback.createReply( title='test', text='blah' ) assert talkback.hasReplies( test ) assert len( talkback.getReplies() ) == 1 assert talkback.getReply( reply_id ) reply1 = talkback.getReplies()[0] items = talkback._container.items() self.assertEqual( reply1.getId(), items[0][0] ) self.assertEqual( reply1.inReplyTo(), test ) self.assertEqual( reply1.listCreators(), ('dummy',) ) parents = reply1.parentsInThread() assert len( parents ) == 1 assert test in parents talkback1 = dtool.getDiscussionFor(reply1) assert talkback == talkback1 assert len( talkback1.getReplies() ) == 0 assert len( talkback.getReplies() ) == 1 talkback1.createReply( title='test2' , text='blah2' ) assert len( talkback._container ) == 2 assert talkback1.hasReplies( reply1 ) assert len( talkback1.getReplies() ) == 1 assert len( talkback.getReplies() ) == 1 reply2 = talkback1.getReplies()[0] assert reply2.inReplyTo() == reply1 parents = reply2.parentsInThread() assert len( parents ) == 2 assert parents[ 0 ] == test assert parents[ 1 ] == reply1 parents = reply2.parentsInThread( 1 ) assert len( parents ) == 1 assert parents[ 0 ] == reply1 def test_itemCataloguing( self ): ctool = self.site._setObject( 'portal_catalog', CatalogTool() ) ctool.addColumn('in_reply_to') dtool = self.site.portal_discussion catalog = ctool._catalog test = self._makeDummyContent('test', catalog=1) test.allow_discussion = 1 self.assertEqual( len(ctool), 1 ) self.failUnless( has_path( catalog, test.getPhysicalPath() ) ) talkback = dtool.getDiscussionFor(test) self.assertEqual( talkback.getPhysicalPath(), ('', 'bar', 'site', 'test', 'talkback') ) talkback.createReply( title='test' , text='blah' ) self.assertEqual( len(ctool), 2 ) for reply in talkback.getReplies(): self.failUnless( has_path( catalog, reply.getPhysicalPath() ) ) self.failUnless( has_path( catalog, '/bar/site/test/talkback/%s' % reply.getId() ) ) reply1 = talkback.getReplies()[0] path1 = '/'.join(reply1.getPhysicalPath()) self.assertEqual( ctool.getMetadataForUID(path1), {'in_reply_to': None} ) talkback1 = dtool.getDiscussionFor(reply1) talkback1.createReply( title='test2' , text='blah2' ) for reply in talkback.getReplies(): self.failUnless( has_path( catalog, reply.getPhysicalPath() ) ) self.failUnless( has_path( catalog, '/bar/site/test/talkback/%s' % reply.getId() ) ) for reply in talkback1.getReplies(): self.failUnless( has_path( catalog, reply.getPhysicalPath() ) ) self.failUnless( has_path( catalog, '/bar/site/test/talkback/%s' % reply.getId() ) ) reply2 = talkback1.getReplies()[0] path2 = '/'.join(reply2.getPhysicalPath()) self.assertEqual( ctool.getMetadataForUID(path2), {'in_reply_to': reply1.getId()} ) def test_itemWorkflowNotification(self): from Products.CMFDefault.DiscussionItem import DiscussionItem dtool = self.site.portal_discussion test = self._makeDummyContent('test') test.allow_discussion = 1 talkback = dtool.getDiscussionFor(test) # Monkey patch into the class to test, urgh. def notifyWorkflowCreated(self): self.test_wf_notified = 1 DiscussionItem.inheritedAttribute('notifyWorkflowCreated')(self) old_method = getattr(DiscussionItem, 'notifyWorkflowCreated', None) DiscussionItem.notifyWorkflowCreated = notifyWorkflowCreated DiscussionItem.test_wf_notified = 0 try: reply_id = talkback.createReply(title='test', text='blah') reply = talkback.getReplies()[0] self.assertEqual(reply.test_wf_notified, 1) finally: delattr(DiscussionItem, 'test_wf_notified') if old_method is None: delattr(DiscussionItem, 'notifyWorkflowCreated') else: DiscussionItem.notifyWorkflowCreated = old_method def test_deletePropagation( self ): ctool = self.site._setObject( 'portal_catalog', CatalogTool() ) dtool = self.site.portal_discussion test = self._makeDummyContent('test', catalog=1) test.allow_discussion = 1 talkback = dtool.getDiscussionFor(test) talkback.createReply( title='test' , text='blah' ) self.assertEqual( len(ctool), 2 ) self.site._delObject('test') self.assertEqual( len(ctool), 0 ) def test_deleteReplies(self): dtool = self.site.portal_discussion ctool = self.site._setObject( 'portal_catalog', CatalogTool() ) test = self._makeDummyContent('test') test.allow_discussion = 1 # Create a structure 6 levels deep for testing talkback = dtool.getDiscussionFor(test) id1 = talkback.createReply(title='test1', text='blah') reply1 = talkback.getReply(id1) talkback1 = dtool.getDiscussionFor(reply1) id2 = talkback1.createReply(title='test2', text='blah') reply2 = talkback1.getReply(id2) talkback2 = dtool.getDiscussionFor(reply2) id3 = talkback2.createReply(title='test3', text='blah') reply3 = talkback2.getReply(id3) talkback3 = dtool.getDiscussionFor(reply3) id4 = talkback3.createReply(title='test4', text='blah') reply4 = talkback3.getReply(id4) talkback4 = dtool.getDiscussionFor(reply4) id5 = talkback4.createReply(title='test5', text='blah') reply5 = talkback4.getReply(id5) talkback5 = dtool.getDiscussionFor(reply5) id6 = talkback5.createReply(title='test6', text='blah') reply6 = talkback5.getReply(id6) talkback6 = dtool.getDiscussionFor(reply6) self.assertEqual(len(talkback.getReplies()), 1) self.assertEqual(len(talkback1.getReplies()), 1) self.assertEqual(len(talkback2.getReplies()), 1) self.assertEqual(len(talkback3.getReplies()), 1) self.assertEqual(len(talkback4.getReplies()), 1) self.assertEqual(len(talkback5.getReplies()), 1) self.assertEqual(len(talkback6.getReplies()), 0) self.assertEqual(len(ctool), 7) talkback3.deleteReply(id4) self.assertEqual(len(talkback.getReplies()), 1) self.assertEqual(len(talkback1.getReplies()), 1) self.assertEqual(len(talkback2.getReplies()), 1) self.assertEqual(len(talkback3.getReplies()), 0) self.assertEqual(len(ctool), 4) talkback.deleteReply(id1) self.assertEqual(len(talkback.getReplies()), 0) self.assertEqual(len(ctool), 1) def test_newTalkbackIsWrapped(self): test = self._makeDummyContent('test') test.allow_discussion = 1 dtool = self.site.portal_discussion talkback = dtool.getDiscussionFor(test) self.failUnless(hasattr(talkback, 'aq_base')) # Acquire a portal tool self.failUnless(getToolByName(talkback, 'portal_discussion')) def test_existingTalkbackIsWrapped(self): test = self._makeDummyContent('test') test.allow_discussion = 1 dtool = self.site.portal_discussion talkback = dtool.getDiscussionFor(test) talkback = dtool.getDiscussionFor(test) self.failUnless(hasattr(talkback, 'aq_base')) # Acquire a portal tool self.failUnless(getToolByName(talkback, 'portal_discussion'))
def setUp(self): self.site = DummySite('site') self.site._setObject('portal_types', DummyTool()) self.site._setObject('portal_workflow', WorkflowTool()) self._constructDummyWorkflow()
class DynamicTypeDefaultTraversalTests(unittest.TestCase): def setUp(self): self.site = DummySite('site') self.site._setObject('portal_types', TypesTool()) fti = FTIDATA_CMF[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()) def tearDown(self): cleanUp() def test_default_view_from_fti(self): response = HTTPResponse() environment = { 'URL': '', 'PARENTS': [self.site], 'REQUEST_METHOD': 'GET', 'SERVER_PORT': '80', 'REQUEST_METHOD': 'GET', 'steps': [], 'SERVER_NAME': 'localhost', '_hacked_path': 0 } r = HTTPRequest(StringIO(), environment, response) r.other.update(environment) alsoProvides(r, IBrowserRequest) r.traverse('foo') self.assertEqual(r.URL, '/foo/dummy_view') self.assertEqual( r.response.base, '/foo/', 'CMF Collector issue #192 (wrong base): %s' % (r.response.base or 'empty', )) def test_default_viewname_but_no_view_doesnt_override_fti(self): response = HTTPResponse() environment = { 'URL': '', 'PARENTS': [self.site], 'REQUEST_METHOD': 'GET', 'SERVER_PORT': '80', 'REQUEST_METHOD': 'GET', 'steps': [], 'SERVER_NAME': 'localhost', '_hacked_path': 0 } r = HTTPRequest(StringIO(), environment, response) r.other.update(environment) alsoProvides(r, IBrowserRequest) # we define a Zope3-style default view name, but no # corresponding view, no change in behaviour expected defineDefaultViewName('index.html', DummyContent) r.traverse('foo') self.assertEqual(r.URL, '/foo/dummy_view') self.assertEqual(r.response.base, '/foo/') def test_default_viewname_overrides_fti(self): response = HTTPResponse() environment = { 'URL': '', 'PARENTS': [self.site], 'REQUEST_METHOD': 'GET', 'SERVER_PORT': '80', 'REQUEST_METHOD': 'GET', 'steps': [], 'SERVER_NAME': 'localhost', '_hacked_path': 0 } r = HTTPRequest(StringIO(), environment, response) r.other.update(environment) alsoProvides(r, IBrowserRequest) # we define a Zope3-style default view name for which a view # actually exists defineDefaultViewName('index.html', DummyContent) provideAdapter(DummyView, (DummyContent, IBrowserRequest), IBrowserView, 'index.html') r.traverse('foo') self.assertEqual(r.URL, '/foo/index.html') self.assertEqual(r.response.base, '/foo/')
def setUp(self): RequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject('portal_membership', DummyTool())
class ActionProviderBaseTests(SecurityRequestTest): def setUp(self): SecurityRequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) utool = self.site._setObject('portal_url', DummyTool()) mtool = self.site._setObject('portal_membership', DummyTool()) def _makeProvider(self, dummy=0): klass = dummy and DummyProvider or ActionProviderBase return klass() def test_z2interfaces(self): from Interface.Verify import verifyClass from Products.CMFCore.interfaces.portal_actions \ import ActionProvider as IActionProvider verifyClass(IActionProvider, ActionProviderBase) def test_z3interfaces(self): from zope.interface.verify import verifyClass from Products.CMFCore.interfaces import IActionProvider verifyClass(IActionProvider, ActionProviderBase) def test_addAction(self): apb = self._makeProvider() self.failIf(apb._actions) old_actions = apb._actions apb.addAction(id='foo', name='foo_action', action='', condition='', permission='', category='') self.failUnless(apb._actions) self.failIf(apb._actions is old_actions) def test_addActionBlankPermission(self): # make sure a blank permission gets stored as an empty tuple # '' and () and ('',) should mean no permission. apb = self._makeProvider() apb.addAction( id='foo', name='foo_action', action='', condition='', permission='', category='', ) self.assertEqual(apb._actions[0].permissions, ()) apb.addAction( id='foo', name='foo_action', action='', condition='', permission=('', ), category='', ) self.assertEqual(apb._actions[1].permissions, ()) apb.addAction( id='foo', name='foo_action', action='', condition='', permission=(), category='', ) self.assertEqual(apb._actions[2].permissions, ()) def test_extractActionBlankPermission(self): # make sure a blank permission gets stored as an empty tuple # both () and ('',) should mean no permission. apb = self._makeProvider() index = 5 properties = { 'id_5': 'foo', 'name_5': 'foo_action', 'permission_5': (), } action = apb._extractAction(properties, index) self.assertEqual(action.permissions, ()) index = 2 properties = { 'id_2': 'foo', 'name_2': 'foo_action', 'permission_2': ('', ), } action = apb._extractAction(properties, index) self.assertEqual(action.permissions, ()) def test_changeActions(self): apb = DummyTool() old_actions = list(apb._actions) keys = [('id_%d', None), ('name_%d', None), ('action_%d', ''), ('condition_%d', ''), ('permission_%d', None), ('category_%d', None), ('visible_%d', 0)] properties = {} for i in range(len(old_actions)): for key, value in keys: token = key % i if value is None: value = token properties[token] = value apb.changeActions(properties=properties) marker = [] for i in range(len(apb._actions)): for key, value in keys: attr = key[:-3] if value is None: value = key % i if attr == 'name': # WAAAA attr = 'title' if attr == 'permission': # WAAAA attr = 'permissions' value = (value, ) attr_value = getattr(apb._actions[i], attr, marker) self.assertEqual( attr_value, value, '%s, %s != %s, %s' % (attr, attr_value, key, value)) self.failIf(apb._actions is old_actions) def test_deleteActions(self): apb = self._makeProvider() apb._actions = tuple(map(DummyAction, ['0', '1', '2'])) apb.deleteActions(selections=(0, 2)) self.assertEqual(len(apb._actions), 1) self.failUnless(DummyAction('1') in apb._actions) def test_DietersNastySharingBug(self): one = self._makeProvider(dummy=1) another = self._makeProvider(dummy=1) def idify(x): return id(x) old_ids = one_ids = map(idify, one.listActions()) another_ids = map(idify, another.listActions()) self.assertEqual(one_ids, another_ids) one.changeActions({ 'id_0': 'different_id', 'name_0': 'A Different Title', 'action_0': 'arise_shine', 'condition_0': 'always', 'permissions_0': 'granted', 'category_0': 'quality', 'visible_0': 1 }) one_ids = map(idify, one.listActions()) another_ids = map(idify, another.listActions()) self.failIf(one_ids == another_ids) self.assertEqual(old_ids, another_ids) def test_listActionInfos(self): wanted = [{ 'id': 'an_id', 'title': 'A Title', 'description': '', 'url': '', 'category': 'object', 'visible': False, 'available': True, 'allowed': True }] apb = self.site._setObject('portal_apb', self._makeProvider(1)) rval = apb.listActionInfos() self.assertEqual(rval, []) rval = apb.listActionInfos(check_visibility=0) self.assertEqual(rval, wanted) rval = apb.listActionInfos('foo/another_id', check_visibility=0) self.assertEqual(rval, []) def test_getActionObject(self): apb = self.site._setObject('portal_apb', self._makeProvider(1)) rval = apb.getActionObject('object/an_id') self.assertEqual(rval, apb._actions[0]) rval = apb.getActionObject('object/not_existing_id') self.assertEqual(rval, None) self.assertRaises(ValueError, apb.getActionObject, 'wrong_format') def test_getActionInfo(self): wanted = { 'id': 'an_id', 'title': 'A Title', 'description': '', 'url': '', 'category': 'object', 'visible': False, 'available': True, 'allowed': True } apb = self.site._setObject('portal_apb', self._makeProvider(1)) rval = apb.getActionInfo(('object/an_id', )) self.assertEqual(rval, wanted) rval = apb.getActionInfo('object/an_id') self.assertEqual(rval, wanted) self.assertRaises(ValueError, apb.getActionInfo, 'object/an_id', check_visibility=1) # The following is nasty, but I want to make sure the ValueError # carries some useful information INVALID_ID = 'invalid_id' try: rval = apb.getActionInfo('object/%s' % INVALID_ID) except ValueError, e: message = e.args[0] detail = '"%s" does not offer action "%s"' % (message, INVALID_ID) self.failUnless(message.find(INVALID_ID) != -1, detail)
class FavoriteTests(ConformsToContent, unittest.TestCase): def _getTargetClass(self): from Products.CMFDefault.Favorite import Favorite return Favorite def _makeOne(self, *args, **kw): return self._getTargetClass()(*args, **kw) def setUp(self): self.site = DummySite('site') self.site._setObject('portal_membership', DummyTool()) self.site._setObject('portal_url', DummyTool()) def test_Empty(self): utool = self.site.portal_url f = self.site._setObject('foo', self._makeOne('foo')) self.assertEqual(f.getId(), 'foo') self.assertEqual(f.Title(), '') self.assertEqual(f.Description(), '') self.assertEqual(f.getRemoteUrl(), utool.root) self.assertEqual(f.getObject(), self.site) self.assertEqual(f.getIcon(), self.site.getIcon()) self.assertEqual(f.getIcon(1), self.site.getIcon(1)) def test_CtorArgs(self): utool = self.site.portal_url self.assertEqual(self._makeOne('foo', title='Title').Title(), 'Title') self.assertEqual( self._makeOne('bar', description='Description').Description(), 'Description') baz = self.site._setObject( 'foo', self._makeOne('baz', remote_url='portal_url')) self.assertEqual(baz.getObject(), utool) self.assertEqual(baz.getRemoteUrl(), '%s/portal_url' % utool.root) self.assertEqual(baz.getIcon(), utool.getIcon()) def test_edit(self): utool = self.site.portal_url f = self.site._setObject('foo', self._makeOne('foo')) f.edit('portal_url') self.assertEqual(f.getObject(), utool) self.assertEqual(f.getRemoteUrl(), '%s/portal_url' % utool.root) self.assertEqual(f.getIcon(), utool.getIcon()) def test_editEmpty(self): utool = self.site.portal_url f = self.site._setObject('gnnn', self._makeOne('gnnn')) f.edit('') self.assertEqual(f.getObject(), self.site) self.assertEqual(f.getRemoteUrl(), utool.root) self.assertEqual(f.getIcon(), self.site.getIcon())
class NewsItemTests(RequestTest): def setUp(self): RequestTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject( 'portal_membership', DummyTool() ) def _makeOne(self, id, *args, **kw): return self.site._setObject( id, NewsItem(id, *args, **kw) ) def test_Empty_html(self): d = self._makeOne('empty', text_format='html') self.assertEqual( d.Title(), '' ) self.assertEqual( d.Description(), '' ) self.assertEqual( d.Format(), 'text/html' ) self.assertEqual( d.text_format, 'html' ) self.assertEqual( d.text, '' ) def test_Empty_stx(self): d = self._makeOne('foo', text_format='structured-text') self.assertEqual( d.Title(), '' ) self.assertEqual( d.Description(), '' ) self.assertEqual( d.Format(), 'text/plain' ) self.assertEqual( d.text_format, 'structured-text' ) self.assertEqual( d.text, '' ) def test_PUT_basic_html(self): self.REQUEST['BODY']=BASIC_HTML d = self._makeOne('foo') d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual( d.Title(), 'Title in tag' ) self.assertEqual( d.Description(), 'Describe me' ) self.assertEqual( d.Format(), 'text/html' ) self.assertEqual( d.text_format, 'html' ) self.assertEqual( d.text.find('</body>'), -1 ) self.assertEqual( len(d.Contributors()), 3 ) def test_PUT_uppered_html(self): self.REQUEST['BODY'] = BASIC_HTML.upper() d = self._makeOne('foo') d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual( d.Title(), 'TITLE IN TAG' ) self.assertEqual( d.Description(), 'DESCRIBE ME' ) self.assertEqual( d.Format(), 'text/html' ) self.assertEqual( d.text_format, 'html' ) self.assertEqual( d.text.find('</BODY'), -1 ) self.assertEqual( len(d.Contributors()), 3 ) def test_PUT_entity_in_title(self): self.REQUEST['BODY'] = ENTITY_IN_TITLE d = self._makeOne('foo') d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual( d.Title(), '&Auuml;rger' ) def test_PUT_html_with_doctype(self): self.REQUEST['BODY'] = '%s\n%s' % (DOCTYPE, BASIC_HTML) d = self._makeOne('foo') d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual( d.Description(), 'Describe me' ) def test_PUT_html_without_newlines(self): self.REQUEST['BODY'] = ''.join(BASIC_HTML.split('\n')) d = self._makeOne('foo') d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual( d.Title(), 'Title in tag' ) self.assertEqual( d.Description(), 'Describe me' ) self.assertEqual( d.Format(), 'text/html' ) self.assertEqual( d.text_format, 'html' ) self.assertEqual( d.text.find('</body>'), -1 ) self.assertEqual( len(d.Contributors()), 3 ) def test_PUT_structured_text(self): self.REQUEST['BODY'] = BASIC_STRUCTUREDTEXT d = self._makeOne('foo') d.PUT( self.REQUEST, self.RESPONSE ) self.assertEqual( d.Title(), 'My Document') self.assertEqual( d.Description(), 'A document by me') self.assertEqual( d.Format(), 'text/plain' ) self.assertEqual( d.text_format, 'structured-text' ) self.assertEqual( len(d.Contributors()), 3 ) self.failUnless( d.cooked_text.find('<p>') >= 0 ) def test_Init(self): self.REQUEST['BODY'] = BASIC_STRUCTUREDTEXT d = self._makeOne('foo', text='') d.PUT(self.REQUEST, self.RESPONSE) self.assertEqual( d.Title(), 'My Document' ) self.assertEqual( d.Description(), 'A document by me' ) self.assertEqual( d.Format(), 'text/plain' ) self.assertEqual( d.text_format, 'structured-text' ) self.assertEqual( len(d.Contributors()), 3 ) self.failUnless( d.cooked_text.find('<p>') >= 0 ) def test_Init_with_stx( self ): d = self._makeOne('foo', text_format='structured-text', title='Foodoc') self.assertEqual( d.Title(), 'Foodoc' ) self.assertEqual( d.Description(), '' ) self.assertEqual( d.Format(), 'text/plain' ) self.assertEqual( d.text_format, 'structured-text' ) self.assertEqual( d.text, '' )
class TypesToolTests(SecurityTest, WarningInterceptor): def _makeOne(self): from Products.CMFCore.TypesTool import TypesTool return TypesTool() def setUp(self): from Products.CMFCore.TypesTool import FactoryTypeInformation as FTI 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)) def tearDown(self): SecurityTest.tearDown(self) self._free_warning_output() def test_z2interfaces(self): from Interface.Verify import verifyClass from Products.CMFCore.interfaces.portal_actions \ import ActionProvider as IActionProvider from Products.CMFCore.interfaces.portal_types \ import portal_types as ITypesTool from Products.CMFCore.TypesTool import TypesTool verifyClass(IActionProvider, TypesTool) verifyClass(ITypesTool, TypesTool) def test_z3interfaces(self): try: from zope.interface.verify import verifyClass from Products.CMFCore.interfaces import IActionProvider from Products.CMFCore.interfaces import ITypesTool except ImportError: # BBB: for Zope 2.7 return from Products.CMFCore.TypesTool import TypesTool verifyClass(IActionProvider, TypesTool) verifyClass(ITypesTool, TypesTool) def test_processActions(self): """ Are the correct, permitted methods returned for actions? """ site = self.site portal = site._setObject('portal', PortalFolder(id='portal')) portal.manage_addProduct = {'FooProduct': DummyFactory(portal)} portal.invokeFactory('Dummy Content', 'actions_dummy') dummy = portal._getOb('actions_dummy') # so we can traverse to it: dummy.view = DummyObject("view") dummy.view2 = DummyObject("view2") dummy.edit = DummyObject("edit") default_view = dummy() self._trap_warning_output() custom_view = _getViewFor(dummy, view='view2')() unpermitted_view = _getViewFor(dummy, view='edit')() self.failUnlessEqual(default_view, 'view') self.failUnlessEqual(custom_view, 'view2') self.failIf(unpermitted_view == 'edit') self.failUnlessEqual(unpermitted_view, 'view') def test_allMetaTypes(self): """ Test that everything returned by allMetaTypes can be traversed to. """ tool = self.ttool 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(): meta_types[factype['name']] = 1 # The url_quote below is necessary 'cos of the one in # main.dtml. Could be removed once that is gone. act = tool.unrestrictedTraverse(url_quote(factype['action'])) self.failIf(type(aq_base(act)) is NullResource) # Check the ones we're expecting are there self.failUnless(meta_types.has_key('Scriptable Type Information')) self.failUnless(meta_types.has_key('Factory-based Type Information')) def test_constructContent(self): from Products.CMFCore.TypesTool \ import ScriptableTypeInformation as STI site = self.site acl_users = self.acl_users ttool = self.ttool setSecurityPolicy(self._oldPolicy) newSecurityManager(None, acl_users.all_powerful_Oz) self.site._owner = (['acl_users'], 'all_powerful_Oz') 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) f = site._setObject('folder', PortalFolder(id='folder')) f.manage_addProduct = {'FooProduct': DummyFactory(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') except Unauthorized: self.fail('CMF Collector issue #165 (Ownership bug): ' 'Unauthorized raised') def test_CMFCollector_49(self): #http://www.zope.org/Collectors/CMF/49 #If you have two FTIs on the file system, both with the same meta_type #but with different id values, the way listDefaultTypeInformation #listed them in the dropdown list made it impossible to distinguish #the two because the identifier string only contained the CMF package #name and the meta_type # Extreme nastiness: Fake out a /Control_Panel/Products registry # inside the fake site by putting dummy objects with a # factory_type_information attribute on them... import copy fti1 = copy.deepcopy(FTIDATA_DUMMY) fti2 = copy.deepcopy(FTIDATA_DUMMY) fti2[0]['id'] = 'Other Content' product1 = DummyObject('product1') product1.factory_type_information = fti1 + fti2 self.site._setObject('product1', product1) def fakeGetProducts(*ign, **igntoo): return self.site def fakeObjectValues(*ign, **igntoo): return (self.site.product1, ) self.ttool._getProducts = fakeGetProducts self.site.objectValues = fakeObjectValues types = self.ttool.listDefaultTypeInformation() dropdown_representation = [x[0] for x in types] self.failIf(dropdown_representation[0] == dropdown_representation[1]) # Backwards-compatibility tests # Make sure the old representation still works, for now ti_factory = self.ttool.manage_addTypeInformation ti_type = 'Factory-based Type Information' new_repr = 'product1: Dummy Content (Dummy)' old_repr = 'product1: Dummy' # This one uses the new representation. We do not expect an Exception ti_factory(ti_type, id='NewType1', typeinfo_name=new_repr) self.failUnless('NewType1' in self.ttool.objectIds()) # Now try with the old representation, which will throw a BadRequest # unless the workaround in the code is used self._trap_warning_output() ti_factory(ti_type, id='NewType2', typeinfo_name=old_repr) self.failUnless('NewType2' in self.ttool.objectIds()) self.failUnless( 'DeprecationWarning' in self._our_stderr_stream.getvalue())
def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root)
class CachingPolicyManager304Tests(RequestTest, FSDVTest): def setUp(self): from Products.CMFCore import CachingPolicyManager RequestTest.setUp(self) FSDVTest.setUp(self) zcml.load_config('meta.zcml', Products.Five) zcml.load_config('permissions.zcml', Products.Five) zcml.load_config('configure.zcml', Products.CMFCore) zcml.load_string(_TRAVERSE_ZCML) now = DateTime() # Create a fake portal and the tools we need self.portal = DummySite(id='portal').__of__(self.root) self.portal._setObject('portal_types', DummyTool()) # This is a FSPageTemplate that will be used as the View for # our content objects. It doesn't matter what it returns. path = os.path.join(self.skin_path_name, 'testPT2.pt') self.portal._setObject('dummy_view', FSPageTemplate('dummy_view', path)) uf = self.root.acl_users password = '******' uf.userFolderAddUser(portal_owner, password, ['Manager'], []) user = uf.getUserById(portal_owner) if not hasattr(user, 'aq_base'): user = user.__of__(uf) newSecurityManager(None, user) owner_auth = '%s:%s' % (portal_owner, password) self.auth_header = "Basic %s" % base64.encodestring(owner_auth) self.portal._setObject('doc1', DummyContent('doc1')) self.portal._setObject('doc2', DummyContent('doc2')) self.portal._setObject('doc3', DummyContent('doc3')) self.portal.doc1.modified_date = now self.portal.doc2.modified_date = now self.portal.doc3.modified_date = now CachingPolicyManager.manage_addCachingPolicyManager(self.portal) cpm = self.portal.caching_policy_manager # This policy only applies to doc1. It will not emit any ETag header # but it enables If-modified-since handling. cpm.addPolicy(policy_id='policy_no_etag', predicate='python:object.getId()=="doc1"', mtime_func='', max_age_secs=0, no_cache=0, no_store=0, must_revalidate=0, vary='', etag_func='', enable_304s=1) # This policy only applies to doc2. It will emit an ETag with # the constant value "abc" and also enable if-modified-since handling. cpm.addPolicy(policy_id='policy_etag', predicate='python:object.getId()=="doc2"', mtime_func='', max_age_secs=0, no_cache=0, no_store=0, must_revalidate=0, vary='', etag_func='string:abc', enable_304s=1) # This policy only applies to doc3. Etags with constant values of # "abc" are emitted, but if-modified-since handling is turned off. cpm.addPolicy(policy_id='policy_disabled', predicate='python:object.getId()=="doc3"', mtime_func='', max_age_secs=0, no_cache=0, no_store=0, must_revalidate=0, vary='', etag_func='string:abc', enable_304s=0) def tearDown(self): RequestTest.tearDown(self) FSDVTest.tearDown(self) cleanUp() def _cleanup(self): # Clean up request and response req = self.portal.REQUEST for header in ('IF_MODIFIED_SINCE', 'HTTP_AUTHORIZATION', 'IF_NONE_MATCH'): if req.environ.get(header, None) is not None: del req.environ[header] req.RESPONSE.setStatus(200) def testUnconditionalGET(self): # In this case the Request does not specify any if-modified-since # value to take into account, thereby completely circumventing any # if-modified-since handling. This must not produce a response status # of 304, regardless of any other headers. self.portal.doc1() response = self.portal.REQUEST.RESPONSE self.assertEqual(response.getStatus(), 200) def testConditionalGETNoETag(self): yesterday = DateTime() - 1 doc1 = self.portal.doc1 request = doc1.REQUEST response = request.RESPONSE # If doc1 has beeen modified since yesterday (which it has), we want # the full rendering. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(yesterday) request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc1() self.assertEqual(response.getStatus(), 200) self._cleanup() # If doc1 has been modified since its creation (which it hasn't), we # want the full rendering. This must return a 304 response. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(doc1.modified_date) request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc1() self.assertEqual(response.getStatus(), 304) self._cleanup() # ETag handling is not enabled in the policy for doc1, so asking for # one will not produce any matches. We get the full rendering. request.environ['IF_NONE_MATCH'] = '"123"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc1() self.assertEqual(response.getStatus(), 200) self._cleanup() # We are asking for an ETag as well as modifications after doc2 has # been created. Both won't match and wwe get the full rendering. request.environ['IF_NONE_MATCH'] = '"123"' request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(doc1.modified_date) request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc1() self.assertEqual(response.getStatus(), 200) self._cleanup() def testConditionalGETETag(self): yesterday = DateTime() - 1 doc2 = self.portal.doc2 request = doc2.REQUEST response = request.RESPONSE # Has doc2 been modified since yesterday? Yes it has, so we get the # full rendering. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(yesterday) request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 200) self._cleanup() # If doc2 has not been modified since its creation (which it hasn't), # we would get a 304 here. However, the policy for doc2 also expects # to get an ETag in the request, which we are not setting here. So # the policy fails and we get a full rendering. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(doc2.modified_date) request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 200) self._cleanup() # Now we are setting an ETag in our request, but an ETag that does not # match the policy's expected value. The policy fails and we get the # full rendering. request.environ['IF_NONE_MATCH'] = '"123"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 200) self._cleanup() # Here we provide the correct and matching ETag value, and we don't # specify any if-modified-since condition. This is enough for our # policy to trigger 304. request.environ['IF_NONE_MATCH'] = '"abc"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 304) self._cleanup() # We specify an ETag and a modification time condition that dooes not # match, so we get the full rendering request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(doc2.modified_date) request.environ['IF_NONE_MATCH'] = '"123"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 200) self._cleanup() # We hand in a matching modified time condition which is supposed to # trigger full rendering. This will lead the ETag condition to be # overrridden. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(yesterday) request.environ['IF_NONE_MATCH'] = '"abc"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 200) self._cleanup() # Now we pass an ETag that matches the policy and a modified time # condition that is not fulfilled. It is safe to serve a 304. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(doc2.modified_date) request.environ['IF_NONE_MATCH'] = '"abc"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc2() self.assertEqual(response.getStatus(), 304) self._cleanup() def testConditionalGETDisabled(self): yesterday = DateTime() - 1 doc3 = self.portal.doc3 request = doc3.REQUEST response = request.RESPONSE # Our policy disables any 304-handling, so even though the ETag matches # the policy, we will get the full rendering. request.environ['IF_NONE_MATCH'] = '"abc"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc3() self.assertEqual(response.getStatus(), 200) self._cleanup() # Now both the ETag and the modified condition would trigger a 304 # response *if* 304-handling was enabled. It is not in our policy, so # we get the full rendering again. request.environ['IF_MODIFIED_SINCE'] = rfc1123_date(doc3.modified_date) request.environ['IF_NONE_MATCH'] = '"abc"' request.environ['HTTP_AUTHORIZATION'] = self.auth_header doc3() self.assertEqual(response.getStatus(), 200) self._cleanup()
def setUp(self): SecurityTest.setUp(self) self.site = DummySite('site').__of__(self.root) self.site._setObject('portal_membership', DummyMembershipTool())
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
class PortalFolderTests(ConformsToFolder, SecurityTest): def _getTargetClass(self): from Products.CMFCore.PortalFolder import PortalFolder return PortalFolder def _makeOne(self, id, *args, **kw): return self.site._setObject(id, self._getTargetClass()(id, *args, **kw)) def setUp(self): import Products from Products.CMFCore.PortalFolder import PortalFolderFactory SecurityTest.setUp(self) setUpEvents() zcml.load_config('permissions.zcml', Products.Five) zcml.load_config('content.zcml', Products.CMFCore) gsm = getGlobalSiteManager() gsm.provideUtility(IFactory, PortalFolderFactory, 'cmf.folder') self.site = DummySite('site').__of__(self.root) def tearDown(self): SecurityTest.tearDown(self) cleanUp() def test_z2interfaces(self): from Interface.Verify import verifyClass from OFS.IOrderSupport import IOrderedContainer verifyClass(IOrderedContainer, self._getTargetClass()) def test_z3interfaces(self): from zope.interface.verify import verifyClass from OFS.interfaces import IOrderedContainer verifyClass(IOrderedContainer, self._getTargetClass()) 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() self.failIf(foo.after_add_called) self.failIf(foo.before_delete_called) test._setObject('foo', foo) self.failUnless(foo.after_add_called) self.failIf(foo.before_delete_called) foo.reset() test._delObject('foo') self.failIf(foo.after_add_called) self.failUnless(foo.before_delete_called) 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) foo.reset() test.manage_delObjects(ids=['foo']) self.failIf(foo.after_add_called) self.failUnless(foo.before_delete_called) 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 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', CatalogTool()) wftool = self.site._setObject('portal_workflow', WorkflowTool()) test = self._makeOne('test') wftool.notifyCreated(test) self.assertEqual(len(ctool), 0) def test_tracker261(self): # # Tracker issue #261 says that content in a deleted folder # is not being uncatalogued. Try creating a subfolder with # content object, and test. # from Products.CMFCore.PortalFolder import PortalFolder 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 sub._setObject('foo', DummyContent('foo', catalog=1)) foo = sub.foo self.failUnless(foo.after_add_called) self.failIf(foo.before_delete_called) self.assertEqual(len(ctool), 1) foo.reset() test._delObject('sub') self.failIf(foo.after_add_called) self.failUnless(foo.before_delete_called) self.assertEqual(len(ctool), 0) 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, factory='cmf.folder', filter_content_types=0)) ttool._setObject( 'Grabbed', FTI('Grabbed', title='Grabbed Content', meta_type=PortalFolder.meta_type, factory='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.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 test_contentPasteAllowedTypes(self): # # _verifyObjectPaste() should honor allowed content types # ttool = self.site._setObject('portal_types', TypesTool()) 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_setObjectRaisesBadRequest(self): # # _setObject() should raise BadRequest on duplicate id # test = self._makeOne('test') test._setObject('foo', DummyContent('foo')) self.assertRaises(BadRequest, test._setObject, 'foo', DummyContent('foo')) def test__checkId_Duplicate(self): # # _checkId() should raise BadRequest on duplicate id # test = self._makeOne('test') test._setObject('foo', DummyContent('foo')) self.assertRaises(BadRequest, test._checkId, 'foo') def test__checkId_PortalRoot(self): test = self._makeOne('test') acl_users = self.site._setObject('acl_users', DummyUserFolder()) test._checkId('acl_users') newSecurityManager(None, acl_users.user_foo) self.assertRaises(BadRequest, test._checkId, 'acl_users') def test__checkId_MethodAlias(self): test = self._makeOne('test') test._setPortalTypeName('Dummy Content 15') ttool = self.site._setObject('portal_types', TypesTool()) 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__checkId_starting_with_dot(self): # # doted prefixed names at the root of the portal can be overriden # # Create a .foo at the root self.site._setObject('.foo', DummyContent('.foo')) # Create a sub-folder sub = self._makeOne('sub') # It should be possible to create another .foo object in the # sub-folder acl_users = self.site._setObject('acl_users', DummyUserFolder()) newSecurityManager(None, acl_users.user_foo) self.assert_(sub.checkIdAvailable('.foo')) def test__checkId_Five(self): test = self._makeOne('test') self.assertRaises(BadRequest, test._checkId, '@@view.html') self.assertRaises(BadRequest, test._checkId, '++resource++icon.png') def test_checkIdAvailableCatchesBadRequest(self): # # checkIdAvailable() should catch BadRequest # test = self._makeOne('test') test._setObject('foo', DummyContent('foo')) self.failIf(test.checkIdAvailable('foo'))
def setUp(self): SecurityTest.setUp(self) setUpEvents() self.root._setObject('site', DummySite('site')) self.site = self.root.site
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() )
def setUp(self): self.site = DummySite(id='foo')