diff --git a/product/ERP5/tests/testWorklist.py b/product/ERP5/tests/testWorklist.py new file mode 100644 index 0000000000000000000000000000000000000000..b7dc729bac50af652929a0b2a144bf69024d091e --- /dev/null +++ b/product/ERP5/tests/testWorklist.py @@ -0,0 +1,274 @@ +############################################################################## +# +# Copyright (c) 2007 Nexedi SA and Contributors. +# All Rights Reserved. +# Romain Courteaud <romain@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +import unittest + +from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase +from AccessControl.SecurityManagement import newSecurityManager +from Products.ERP5Type.tests.Sequence import SequenceList +from zExceptions import BadRequest +from Products.ERP5Type.Tool.ClassTool import _aq_reset +from Testing.ZopeTestCase.PortalTestCase import PortalTestCase + +class TestWorklist(ERP5TypeTestCase): + + run_all_test = 1 + quiet = 1 + login = PortalTestCase.login + + checked_portal_type = 'Organisation' + checked_workflow = 'validation_workflow' + worklist_assignor_id = 'assignor_worklist' + actbox_assignor_name = 'assignor_todo' + worklist_owner_id = 'owner_worklist' + actbox_owner_name = 'owner_todo' + + def getTitle(self): + return "Worklist" + + def getBusinessTemplateList(self): + """ + Return list of bt5 to install + """ + return ('erp5_base',) + + def getUserFolder(self): + """ + Return the user folder + """ + return getattr(self.getPortal(), 'acl_users', None) + + def createManagerAndLogin(self): + """ + Create a simple user in user_folder with manager rights. + This user will be used to initialize data in the method afterSetup + """ + self.getUserFolder()._doAddUser('manager', '', ['Manager'], []) + self.login('manager') + + def createERP5Users(self, user_dict): + """ + Create all ERP5 users needed for the test. + ERP5 user = Person object + Assignment object in erp5 person_module. + """ + portal = self.getPortal() + module = portal.getDefaultModule("Person") + # Create the Person. + for user_login, user_data in user_dict.items(): + # Create the Person. + self.logMessage("Create user: %s" % user_login) + person = module.newContent( + portal_type='Person', + reference=user_login, + password='hackme', + ) + # Create the Assignment. + assignment = person.newContent( + portal_type = 'Assignment', + group = "%s" % user_data[0], + function = "%s" % user_data[1], + start_date = '01/01/1900', + stop_date = '01/01/2900', + ) + assignment.openAction() + # Reindexing is required for the security to work + get_transaction().commit() + self.tic() + + def createUsers(self): + """ + Create all users needed for the test + """ + self.createERP5Users(self.getUserDict()) + + def getUserDict(self): + """ + Return dict of users needed for the test + """ + user_dict = { + 'foo': [None, None], + 'bar': [None, None], + } + return user_dict + + def stepLoginAsFoo(self, sequence=None, sequence_list=None, **kw): + self.login("foo") + + def stepLoginAsBar(self, sequence=None, + sequence_list=None, **kw): + self.login("bar") + + def createDocument(self): + module = self.getPortal().getDefaultModule(self.checked_portal_type) + return module.newContent(portal_type=self.checked_portal_type) + + def createWorklist(self): + workflow = self.getWorkflowTool()[self.checked_workflow] + worklists = workflow.worklists + + for worklist_id, actbox_name, role in [ + (self.worklist_assignor_id, self.actbox_assignor_name, 'Assignor'), + (self.worklist_owner_id, self.actbox_owner_name, 'Owner')]: + worklists.addWorklist(worklist_id) + worklist_definition = worklists._getOb(worklist_id) + worklist_definition.setProperties('', actbox_name=actbox_name, + props={'guard_roles': role, + 'var_match_portal_type': self.checked_portal_type}) + + def test_01_worklist(self, quiet=0, run=run_all_test): + """ + Test the permission of the building module. + """ + if not run: + return + + workflow_tool = self.portal.portal_workflow + + self.logMessage("Create Manager") + self.createManagerAndLogin() + self.createUsers() + self.logMessage("Create worklist") + self.createWorklist() + self.logMessage("Create document as Manager") + document = self.createDocument() + + get_transaction().commit() + self.tic() + self.portal.portal_caches.clearAllCache() + + result = workflow_tool.listActions(object=document) + self.logout() + + # Users can not see worklist as they are not Assignor + for user_id in ('manager', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 0) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 1) + self.logout() + for user_id in ('foo', 'bar'): + self.logMessage("Check %s worklist" % user_id) + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.assertEquals(result, []) + self.logout() + + # Define foo as Assignor + self.login('manager') + self.logMessage("Give foo Assignor role") + document.manage_addLocalRoles('foo', ['Assignor']) + document.reindexObject() + get_transaction().commit() + self.tic() + self.portal.portal_caches.clearAllCache() + self.logout() + + for user_id in ('manager', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 0) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 1) + self.logout() + for user_id in ('bar', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 0) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 0) + self.logout() + for user_id in ('foo', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 1) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 0) + self.logout() + + # Define foo and bar as Assignee + self.login('manager') + self.logMessage("Give foo Assignee role") + document.manage_addLocalRoles('foo', ['Assignee']) + self.logMessage("Give bar Assignee role") + document.manage_addLocalRoles('bar', ['Assignee']) + document.reindexObject() + get_transaction().commit() + self.tic() + self.portal.portal_caches.clearAllCache() + self.logout() + + # Users can not see worklist as they are not Assignor + for user_id in ('manager', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 0) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 1) + self.logout() + for user_id in ('bar', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 0) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 0) + self.logout() + for user_id in ('foo', ): + self.login(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Assignor" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_assignor_name] + self.assertEquals(len(entry_list), 1) + self.logMessage("Check %s worklist as Owner" % user_id) + entry_list = [x for x in result if x['name'] == self.actbox_owner_name] + self.assertEquals(len(entry_list), 0) + self.logout() + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestWorklist)) + return suite