import unittest from zope.interface import Interface from zope.interface.verify import verifyClass from zope.component import getMultiAdapter, provideAdapter from Products.CMFCore.utils import getToolByName from Products.CMFCore.ActionInformation import Action, ActionCategory from quintagroup.plonetabs.browser.interfaces import IPloneTabsControlPanel from quintagroup.plonetabs.browser.plonetabs import PloneTabsControlPanel as ptp from quintagroup.plonetabs.tests.base import PloneTabsTestCase from quintagroup.plonetabs.tests.data import PORTAL_ACTIONS class TestControlPanelHelperMethods(PloneTabsTestCase): """Test here configlet helper methods""" def afterSetUp(self): self.loginAsPortalOwner() # TODO: investigate why I can't work with it but # have to traverse my view #self.panel = getMultiAdapter((self.portal, self.portal.REQUEST), #name='plonetabs-controlpanel') self.panel = self.portal.restrictedTraverse('plonetabs-controlpanel') self.tool = getToolByName(self.portal, 'portal_actions') def test_redirect(self): response = self.portal.REQUEST.RESPONSE method = self.panel.redirect portal_url = getMultiAdapter((self.portal, self.portal.REQUEST), name=u"plone_portal_state").portal_url() url = '%s/%s' % (portal_url, "@@plonetabs-controlpanel") method() self.assertEquals(response.headers.get('location', ''), url, 'Redirect method is not working properly.') # check query string and anchor hash method('http://quintagroup.com', 'q=test', 'hash_code') self.assertEquals(response.headers.get('location', ''), 'http://quintagroup.com?q=test#hash_code', 'Redirect method is not working properly.') def test_fixExpression(self): method = self.panel.fixExpression self.assertEquals(method('/slash'), 'string:${portal_url}/slash') self.assertEquals(method('https://test.com'), 'string:https://test.com') self.assertEquals(method('python:True'), 'python:True') self.assertEquals(method('hello'), 'string:${object_url}/hello') def test_copyAction(self): data = PORTAL_ACTIONS[0][1]['children'][0][1] action = Action('act1', **data) info = self.panel.copyAction(action) self.assertEquals(len(info.keys()), 6) self.assertEquals(info['description'], 'The most important place') def test_validateActionFields(self): method = self.panel.validateActionFields good_data = PORTAL_ACTIONS[0][1]['children'][0][1].copy() good_data['id'] = 'new_one' errors = method('new_category', good_data) self.assertEquals(errors, {}, 'There should be no errors for valid data.') bad_data = {'id':'', 'title': ' ', 'available_expr': 'bad_type:test', 'url_expr': 'bad_type:test'} # Revert PloneTestCase's optimization # because this breaks our test def __init__(self, text): self.text = text if text.strip(): self._v_compiled = getEngine().compile(text) from Products.CMFCore.Expression import Expression optimized__init__ = Expression.__init__ Expression.__init__ = __init__ errors = method('new_category', bad_data) # rollback our patch Expression.__init__ = optimized__init__ self.assertEquals(len(errors.keys()), 4, 'validateActionFields method is not working properly.') def test_processErrors(self): method = self.panel.processErrors errors = {'error':'error message'} self.assertEquals(method(errors), errors, 'processErrors method is not working properly.') self.assertEquals(method(errors, 'pre_', '_post'), {'pre_error_post': 'error message'}, 'processErrors method is not working properly.') def test_parseEditForm(self): method = self.panel.parseEditForm form = {'orig_id': 'id1', 'category': 'cat1', 'visible_id1': True, 'id_id1': 'id_new', 'title_id1': 'title1', 'url_expr_id1': 'expr1', 'available_expr_id1': 'expr2'} self.assertEquals(method(form), ('id1', 'cat1', {'id': 'id_new', 'title': 'title1', 'url_expr': 'expr1', 'available_expr': 'expr2', 'visible': True}), 'parseEditForm method is not working properly.') del form['orig_id'] self.failUnlessRaises(KeyError, method, form) def test_parseAddForm(self): method = self.panel.parseAddForm form = {'id': 'id1', 'category': 'cat1', 'visible': True, 'title': 'title1', 'url_expr': 'string:expr1', 'available_expr': 'expr2'} self.assertEquals(method(form), ('id1', 'cat1', {'id': 'id1', 'visible': True, 'title': 'title1', 'url_expr': 'string:expr1', 'available_expr': 'expr2'}), 'parseAddForm method is not working properly.') del form['id'] self.failUnlessRaises(KeyError, method, form) def test_getActionCategory(self): method = self.panel.getActionCategory self.purgeActions() self.failUnlessRaises(KeyError, method, 'portal_tabs') self.setupActions(self.tool) self.assertEquals(method('portal_tabs').id, 'portal_tabs', 'getActionCategory is not working properly.') def test_getOrCreateCategory(self): method = self.panel.getOrCreateCategory self.purgeActions() self.assertEquals(method('portal_tabs').id, 'portal_tabs', 'getOrCreateCategory is not working properly.') def test_setSiteProperties(self): self.panel.setSiteProperties(title='Test Title') sp = getToolByName(self.portal, 'portal_properties').site_properties self.assertEquals(sp.getProperty('title'), 'Test Title', 'setSiteProperties method is not working properly.') def test_renderViewlet(self): # register test viewlet and it's manager from zope.viewlet.interfaces import IViewlet, IViewletManager from zope.viewlet.viewlet import ViewletBase from zope.viewlet.manager import ViewletManagerBase from zope.publisher.interfaces.browser import IDefaultBrowserLayer from zope.publisher.interfaces.browser import IBrowserView class TestViewlet(ViewletBase): def __of__(self, obj): return self def render(self): return 'test viewlet' provideAdapter( TestViewlet, (Interface, IDefaultBrowserLayer, IBrowserView, IViewletManager), IViewlet, name=u'test_viewlet') provideAdapter( ViewletManagerBase, (Interface, IDefaultBrowserLayer, IBrowserView), IViewletManager, name=u'test_manager') self.assertEquals( self.panel.renderViewlet('test_manager', 'test_viewlet'), 'test viewlet', 'renderViewlet method is not workig properly') def test_addAction(self): self.purgeActions() self.panel.addAction('new_category', {'id':'id1', 'title':'Test'}) self.failUnless('id1' in self.tool.new_category.objectIds(), 'addAction method is not workig properly') def test_updateAction(self): method = self.panel.updateAction self.purgeActions() self.failUnlessRaises(KeyError, method, 'id1', 'cat1', {'id':'new'}) self.setupActions(self.tool) # we need to commit transaction because # we are going to rename just added action now import transaction transaction.savepoint() method('home', 'portal_tabs', {'id':'new_home'}) self.failUnless('new_home' in self.tool.portal_tabs.objectIds(), 'updateAction method is not workig properly') def test_deleteAction(self): self.purgeActions() self.setupActions(self.tool) self.panel.deleteAction('home', 'portal_tabs') self.failIf('home' in self.tool.portal_tabs.objectIds(), 'deleteAction method is not workig properly') def test_moveAction(self): self.purgeActions() self.setupActions(self.tool) pos = self.tool.portal_tabs.getObjectPosition self.assertEquals(pos('home'), 0, 'moveAction method is not workig properly') self.panel.moveAction('home', 'portal_tabs', -1) self.assertEquals(pos('home'), 1, 'moveAction method is not workig properly') class TestControlPanelAPI(PloneTabsTestCase): """Test here interface methods of control panel class""" def afterSetUp(self): self.loginAsPortalOwner() self.panel = self.portal.restrictedTraverse('plonetabs-controlpanel') self.tool = getToolByName(self.portal, 'portal_actions') def test_interface(self): self.failUnless(IPloneTabsControlPanel.implementedBy(ptp), 'PloneTabs control panel does not implement required interface.') self.failUnless(verifyClass(IPloneTabsControlPanel, ptp), 'PloneTabs control panel does not implement required interface.') def test_getPageTitle(self): self.assertEquals(self.panel.getPageTitle(), 'Portal Tabs Configuration', 'getPageTitle method is broken') self.assertEquals(self.panel.getPageTitle(category='notexists'), "Plone '%s' Configuration" % 'notexists', 'getPageTitle method is broken') def test_hasActions(self): method = self.panel.hasActions # purge any default portal actions self.purgeActions() self.failIf(method(), 'There should be no portal_tab actions in portal') # setup our own actions self.setupActions(self.tool) self.failUnless(method(), 'There should be portal_tab actions in portal') def test_getPortalActions(self): method = self.panel.getPortalActions # purge any default portal actions self.purgeActions() self.assertEquals(len(method()), 0, 'There should be no actions in portal_tabs category.') # setup our own actions self.setupActions(self.tool) self.assertEquals(len(method()), 2, 'There should be 2 actions in portal_tabs category.') # marginal arguments self.assertEquals(len(method('notexistent_category')), 0, 'There should be no actions for not existed category.') def test_isGeneratedTabs(self): method = self.panel.isGeneratedTabs # prepare value sp = getToolByName(self.portal, 'portal_properties').site_properties sp.manage_changeProperties(disable_folder_sections=True) self.failIf(method(), 'But folder sections are disabled...') def test_isNotFoldersGenerated(self): method = self.panel.isNotFoldersGenerated # prepare value sp = getToolByName(self.portal, 'portal_properties').site_properties sp.manage_changeProperties(disable_nonfolderish_sections=True) self.failIf(method(), 'But non folderish sections are disabled...') def test_getActionsList(self): method = self.panel.getActionsList # purge any default portal actions self.purgeActions() self.failIf('class="editform"' in method(), 'There should no be actions in actions list template.') self.setupActions(self.tool) self.failUnless('class="editform"' in method(), 'There are no actions in actions list template.') def test_getAutoGenereatedSection(self): method = self.panel.getAutoGenereatedSection self.failIf('