From eae9b218bf3bd6df50f417ac883b97fc5f8ddfa7 Mon Sep 17 00:00:00 2001 From: Lucas Carvalho <lucas@nexedi.com> Date: Tue, 29 Mar 2011 18:27:08 +0000 Subject: [PATCH] Moved the mixin class from testStandardConfigurationWorkflow.py to ConfiguratorTestMixin.py. It must be reused by other tests. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@44750 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../tests/ConfiguratorTestMixin.py | 577 ++++++++++++++++++ 1 file changed, 577 insertions(+) create mode 100644 product/ERP5Configurator/tests/ConfiguratorTestMixin.py diff --git a/product/ERP5Configurator/tests/ConfiguratorTestMixin.py b/product/ERP5Configurator/tests/ConfiguratorTestMixin.py new file mode 100644 index 0000000000..dd68629646 --- /dev/null +++ b/product/ERP5Configurator/tests/ConfiguratorTestMixin.py @@ -0,0 +1,577 @@ +############################################################################## +# Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved. +# Rafael Monnerat <rafael@nexedi.com> +# Ivan Tyagov <ivan@nexedi.com> +# Lucas Carvalho <lucas@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. +# +############################################################################## + + +from DateTime import DateTime +from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase +from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase +from Products.ERP5Type.tests.ERP5TypeTestCase import _getConversionServerDict +from AccessControl.SecurityManagement import newSecurityManager + +class TestLiveConfiguratorWorkflowMixin(SecurityTestCase): + """ + Configurator Mixin Class + """ + # The list of standard business templates that the configurator should force + # to install + standard_bt5_list = ('erp5_simulation', + 'erp5_dhtml_style', + 'erp5_jquery', + 'erp5_jquery_ui', + 'erp5_xhtml_jquery_style', + 'erp5_ingestion_mysql_innodb_catalog', + 'erp5_ingestion', + 'erp5_web', + 'erp5_dms', + 'erp5_crm', + 'erp5_pdm', + 'erp5_trade', + 'erp5_knowledge_pad', + 'erp5_accounting', + 'erp5_tax_resource', + 'erp5_discount_resource', + 'erp5_invoicing', + 'erp5_configurator_standard_categories', + 'erp5_trade_knowledge_pad', + 'erp5_crm_knowledge_pad', + 'erp5_simplified_invoicing', + 'erp5_ods_style', + 'erp5_odt_style', + 'erp5_ooo_import') + + def getBusinessTemplateList(self): + return ('erp5_core_proxy_field_legacy', + 'erp5_full_text_myisam_catalog', + 'erp5_base', + 'erp5_workflow', + 'erp5_configurator', + 'erp5_configurator_standard',) + + def stepLogin(self, quiet=0, run=1, **kw): + uf = self.getPortal().acl_users + uf._doAddUser('test_configurator_user', '', + ['Manager', 'Assignee', 'Assignor', + 'Associate', 'Auditor', 'Author'], []) + user = uf.getUserById('test_configurator_user').__of__(uf) + newSecurityManager(None, user) + + def afterSetUp(self): + self.stepLogin() + self.login(user_name='test_configurator_user') + # XXX (lucas): The request is not clean between tests. + # So, we need to force the test to use a clean REQUEST + # Otherwise the next test will fail trying to validate the form, + # because the REQUEST has data from the previous step/test. + if getattr(self.app.REQUEST, 'default_other', None) is None: + self.app.REQUEST.default_other = self.app.REQUEST.other.copy() + else: + self.stepCleanUpRequest() + + self.restricted_security = 0 + # information to know if a business template is a standard business + # template or a custom one + self.portal.portal_templates.updateRepositoryBusinessTemplateList( + ['http://www.erp5.org/dists/snapshot/bt5/']) + + # it is required by SecurityTestCase + self.workflow_tool = self.portal.portal_workflow + self.setDefaultSitePreference() + self.portal.portal_activities.unsubscribe() + + def setDefaultSitePreference(self): + default_pref = self.portal.portal_preferences.default_site_preference + conversion_dict = _getConversionServerDict() + default_pref.setPreferredOoodocServerAddress(conversion_dict['hostname']) + default_pref.setPreferredOoodocServerPortNumber(conversion_dict['port']) + if self.portal.portal_workflow.isTransitionPossible(default_pref, 'enable'): + default_pref.enable() + return default_pref + + def beforeTearDown(self): + self.portal.portal_activities.subscribe() + ERP5TypeTestCase.beforeTearDown(self) + + def setBusinessConfigurationWorkflow(self, business_configuration, workflow): + """ Set configurator workflow """ + business_configuration.setResource(workflow) + + def assertCurrentStep(self, step_title, server_response): + """ Checks the current step title. """ + self.assertTrue( + '<h2>%s</h2>' % step_title in server_response['data'], + 'Unable to guess current step title (expected:%s) in: \n%s' % + (step_title, server_response)) + + ### STEPS + + def stepCleanUpRequest(self, sequence=None, sequence_list=None, **kw): + """ Restore clean up the request """ + self.app.REQUEST.other = self.app.REQUEST.default_other.copy() + + def stepConfiguratorNext(self, sequence=None, sequence_list=None, **kw): + """ Go Next into Configuration """ + business_configuration = sequence.get("business_configuration") + next_dict = sequence.get("next_dict") + response_dict = self.portal.portal_configurator._next( + business_configuration, next_dict) + sequence.edit(response_dict=response_dict) + + def stepConfiguratorPrevious(self, sequence=None, sequence_list=None, **kw): + """ Go to the previous form. """ + business_configuration = sequence.get("business_configuration") + next_dict = sequence.get("next_dict") + response_dict = self.portal.portal_configurator._previous( + business_configuration, next_dict) + sequence.edit(response_dict=response_dict) + + def stepCheckBT5ConfiguratorItem(self, sequence=None, sequence_list=None, **kw): + """ Check if the Configuration Item list is correct """ + business_configuration = sequence.get("business_configuration") + # second one: install some standard business templates + standard_bt5_config_save = business_configuration['1'] + self.assertEquals(len(self.standard_bt5_list), + len(standard_bt5_config_save.contentValues( + portal_type='Standard BT5 Configurator Item'))) + self.assertEquals( + set(self.standard_bt5_list), + set([x.bt5_id for x in standard_bt5_config_save.contentValues()])) + + # third one: we create a business template to store customer configuration + custom_bt5_config_save = business_configuration['2'] + custom_bt5_config_item = custom_bt5_config_save['1'] + self.assertEquals(custom_bt5_config_item.getPortalType(), + 'Customer BT5 Configurator Item') + self.assertEquals(custom_bt5_config_item.bt5_title, + '_'.join(business_configuration.getTitle().strip().lower().split())) + + def stepCheckConfigureOrganisationForm(self, sequence=None, sequence_list=None, **kw): + """ Check if Confire Organisation step was showed """ + response_dict = sequence.get("response_dict") + if 'command' in response_dict: + self.assertEquals('show', response_dict['command']) + self.assertEquals('Configure Organisation', response_dict['next']) + self.assertCurrentStep('Your organisation', response_dict) + + def _stepSetupOrganisationConfiguratorItem(self, sequence=None, sequence_list=None, **kw): + """ Create one Organisation """ + next_dict = dict( + field_your_title='My Organisation', + field_your_default_email_text='me@example.com', + field_your_default_telephone_text='01234567890', + field_your_default_address_street_address='.', + field_your_default_address_zip_code='59000') + next_dict.update(**kw) + sequence.edit(next_dict=next_dict) + + def stepCheckConfigureUserAccountNumberForm(self, sequence=None, sequence_list=None, **kw): + """ Check if Configure Organisation step was showed """ + response_dict = sequence.get("response_dict") + if 'command' in response_dict: + self.assertEquals('show', response_dict['command']) + self.assertEquals('Configure user accounts number', response_dict['next']) + self.assertEquals('Previous', response_dict['previous']) + self.assertCurrentStep('Number of user accounts', response_dict) + + def stepSetupUserAccounNumberSix(self, sequence=None, sequence_list=None, **kw): + """ Create one more user account """ + next_dict = dict( + field_your_company_employees_number=self.company_employees_number) + sequence.edit(next_dict=next_dict) + + def stepCheckConfigureMultipleUserAccountForm(self, sequence=None, sequence_list=None, **kw): + """ Check the multiple user account form """ + response_dict = sequence.get("response_dict") + if 'command' in response_dict: + self.assertEquals('show', response_dict['command']) + self.assertEquals('Previous', response_dict['previous']) + self.assertEquals('Configure user accounts', response_dict['next']) + self.assertCurrentStep('User accounts configuration', response_dict) + + def stepSetupMultipleUserAccountSix(self, sequence=None, sequence_list=None, **kw): + """ Create multiple user account """ + next_dict = {} + for user in self.user_list: + for k, v in user.items(): + next_dict.setdefault(k, []).append(v) + sequence.edit(next_dict=next_dict) + + def stepCheckMultiplePersonConfigurationItem(self, sequence=None, sequence_list=None, **kw): + """ + Check if multiple Person Configuration Item of the Business + Configuration have been created successfully. + """ + business_configuration = sequence.get("business_configuration") + self.assertEquals(int(self.company_employees_number), + business_configuration.getGlobalConfigurationAttr( + "company_employees_number")) + + configuration_save_list = business_configuration.contentValues( + portal_type='Configuration Save') + person_business_configuration_save = None + for configuration_save in configuration_save_list: + person_item_list = configuration_save.contentValues( + portal_type='Person Configurator Item') + if person_item_list: + person_business_configuration_save = configuration_save + break + + + self.assertEquals(int(self.company_employees_number), + len(person_business_configuration_save.contentValues())) + return person_business_configuration_save + + def stepCheckConfigureAccountingForm(self, sequence=None, sequence_list=None, **kw): + """ Check the accounting form configuration. """ + response_dict = sequence.get("response_dict") + if 'command' in response_dict: + self.assertEquals('show', response_dict['command']) + self.assertEquals('Previous', response_dict['previous']) + self.assertEquals('Configure accounting', response_dict['next']) + self.assertCurrentStep('Accounting', response_dict) + + def _stepSetupAccountingConfiguration(self, accounting_plan): + """ Setup up the accounting configuration """ + return dict(field_your_accounting_plan=accounting_plan, + subfield_field_your_period_start_date_year='2008', + subfield_field_your_period_start_date_month='01', + subfield_field_your_period_start_date_day='01', + subfield_field_your_period_stop_date_year='2008', + subfield_field_your_period_stop_date_month='12', + subfield_field_your_period_stop_date_day='31', + field_your_period_title='2008', + ) + + def stepSetupAccountingConfigurationFrance(self, sequence=None, sequence_list=None, **kw): + """ Setup up the French accounting configuration """ + next_dict = self._stepSetupAccountingConfiguration(accounting_plan='fr') + sequence.edit(next_dict=next_dict) + + def stepSetupAccountingConfigurationBrazil(self, sequence=None, sequence_list=None, **kw): + """ Setup up the Brazilian accounting configuration """ + next_dict = self._stepSetupAccountingConfiguration(accounting_plan='br') + sequence.edit(next_dict=next_dict) + + def stepSetupAccountingConfigurationRussia(self, sequence=None, sequence_list=None, **kw): + """ Setup up the Russian accounting configuration """ + next_dict = self._stepSetupAccountingConfiguration(accounting_plan='ru') + sequence.edit(next_dict=next_dict) + + def stepCheckConfigurePreferenceForm(self, sequence=None, sequence_list=None, **kw): + """ Check the preference form """ + response_dict = sequence.get("response_dict") + if 'command' in response_dict: + self.assertEquals('show', response_dict['command']) + self.assertEquals('Previous', response_dict['previous']) + import pdb;pdb.set_trace() + self.assertEquals('Configure ERP5 Preferences', response_dict['next']) + self.assertCurrentStep('Application preferences', response_dict) + + def _stepCheckAccountingConfigurationItemList(self, business_configuration, + bt5_id, + accounting_transaction_gap, + gap): + """ Check the French accounting configuration item list """ + # 1. the localization business template + accounting_business_configuration_save = business_configuration.\ + contentValues(portal_types='Configuration Save')[-1] + bt5_business_configuration_item =\ + accounting_business_configuration_save['1'] + self.assertEquals('Standard BT5 Configurator Item', + bt5_business_configuration_item.getPortalType()) + self.assertEquals(bt5_id, bt5_business_configuration_item.bt5_id) + + # 2. a preference + preference_buisiness_configurator_item_list =\ + accounting_business_configuration_save.contentValues( + portal_type='Preference Configurator Item') + self.assertEquals(1, len(preference_buisiness_configurator_item_list)) + preference_buisiness_configurator_item = \ + preference_buisiness_configurator_item_list[0] + self.assertEquals(accounting_transaction_gap, + preference_buisiness_configurator_item.getProperty( + 'preferred_accounting_transaction_gap')) + self.assertEquals(self.preference_group, + preference_buisiness_configurator_item.getProperty( + 'preferred_accounting_transaction_section_category')) + + # 3. some pre-configured accounts + account_business_configuration_item =\ + accounting_business_configuration_save['2'] + self.assertEquals('Account Configurator Item', + account_business_configuration_item.getPortalType()) + self.assertEquals('capital', + getattr(account_business_configuration_item, 'account_id', 'not set')) + self.assertEquals('equity', + account_business_configuration_item.getAccountType()) + self.assertEquals(gap, account_business_configuration_item.getGap()) + self.assertEquals('equity/share_capital', + account_business_configuration_item.getFinancialSection()) + + # title is translated here + self.assertEquals('Capital', + account_business_configuration_item.getTitle()) + + # 4. An accounting period configuration item + accounting_period_configuration_item = \ + accounting_business_configuration_save['14'] + # this ['14'] will break when we'll add more accounts + self.assertEquals('Accounting Period Configurator Item', + accounting_period_configuration_item.getPortalType()) + + self.assertEquals(DateTime(2008, 1, 1), + accounting_period_configuration_item.getStartDate()) + self.assertEquals(DateTime(2008, 12, 31), + accounting_period_configuration_item.getStopDate()) + self.assertEquals('2008', + accounting_period_configuration_item.getShortTitle()) + + def stepCheckAccountingConfigurationItemListFrance(self, sequence=None, sequence_list=None, **kw): + """ Check the French accounting configuration item """ + self._stepCheckAccountingConfigurationItemList( + business_configuration=sequence.get("business_configuration"), + bt5_id='erp5_accounting_l10n_fr', + accounting_transaction_gap='gap/fr/pcg', + gap='fr/pcg/1/10/101') + + def stepCheckAccountingConfigurationItemListBrazil(self, sequence=None, sequence_list=None, **kw): + """ Check the Brazilian accounting configuration item """ + self._stepCheckAccountingConfigurationItemList( + business_configuration=sequence.get("business_configuration"), + bt5_id='erp5_accounting_l10n_br_extend', + accounting_transaction_gap='gap/br/pcg', + gap='br/pcg/2/2.4/2.4.1/2.4.1.01') + + def stepCheckAccountingConfigurationItemListRussia(self, sequence=None, sequence_list=None, **kw): + """ Check the Russian accounting configuration item """ + self._stepCheckAccountingConfigurationItemList( + business_configuration=sequence.get("business_configuration"), + bt5_id='erp5_accounting_l10n_ru', + accounting_transaction_gap='gap/ru/ru2000', + gap='ru/ru2000/80') + + def _stepSetupPreferenceConfiguration(self, price_currency, lang): + """ Setup the preference configuration """ + return dict(field_your_price_currency=price_currency, + field_your_preferred_date_order='dmy', + field_your_lang=lang, + default_field_your_lang=1,) + + def stepSetupPreferenceConfigurationFrance(self, sequence=None, sequence_list=None, **kw): + """ Setup the French preference configuration """ + next_dict = self._stepSetupPreferenceConfiguration( + price_currency='EUR;0.01;Euro', + lang='erp5_l10n_fr',) + sequence.edit(next_dict=next_dict) + + def stepSetupPreferenceConfigurationBrazil(self, sequence=None, sequence_list=None, **kw): + """ Setup the Brazil preference configuration """ + next_dict = self._stepSetupPreferenceConfiguration( + price_currency='BRL;0.01;Brazilian Real', + lang='erp5_l10n_pt-BR',) + sequence.edit(next_dict=next_dict) + + def stepSetupPreferenceConfigurationRussia(self, sequence=None, sequence_list=None, **kw): + """ Setup the Russian preference configuration """ + next_dict = self._stepSetupPreferenceConfiguration( + price_currency='BYR;0.01;Belarusian Rouble', + lang='erp5_l10n_ru',) + sequence.edit(next_dict=next_dict) + + def _stepCheckPreferenceConfigurationItemList(self, business_configuration, + currency_title, + currency_reference, + bt5_id): + """ + Check the creation of: + - Currency Configurator Item + - Service Configurator Item + - System Preference Configurator Item + - Standard BT5 Configurator Item + """ + # this created a currency + preferences_business_configuration_save = business_configuration.\ + contentValues(portal_types='Configuration Save')[-1] + + currency_business_configuration_item =\ + preferences_business_configuration_save['1'] + self.assertEquals('Currency Configurator Item', + currency_business_configuration_item.getPortalType()) + self.assertEquals(currency_title, + currency_business_configuration_item.getTitle()) + self.assertEquals(0.01, + currency_business_configuration_item.getBaseUnitQuantity()) + self.assertEquals(currency_reference, + currency_business_configuration_item.getReference()) + # some services + # TODO + service_business_configuration_item =\ + preferences_business_configuration_save['2'] + self.assertEquals('Service Configurator Item', + service_business_configuration_item.getPortalType()) + # and a preference + preference_business_configuration_item =\ + preferences_business_configuration_save['3'] + self.assertEquals('Preference Configurator Item', + preference_business_configuration_item.getPortalType()) + # that uses the currency + self.assertEquals('currency_module/%s' % currency_reference, + preference_business_configuration_item.getProperty( + 'preferred_accounting_transaction_currency')) + + # system preferences + system_pref_configurator_item =\ + preferences_business_configuration_save['4'] + self.assertEquals('System Preference Configurator Item', + system_pref_configurator_item.getPortalType()) + + # a standard bt5 for localisation + bt5_business_configuration_item =\ + preferences_business_configuration_save['5'] + self.assertEquals('Standard BT5 Configurator Item', + bt5_business_configuration_item.getPortalType()) + self.assertEquals(bt5_id, + bt5_business_configuration_item.bt5_id) + + def stepCheckPreferenceConfigurationItemListFrance(self, sequence=None, sequence_list=None, **kw): + """ + Check the creation of: + - Currency Configurator Item + - Service Configurator Item + - System Preference Configurator Item + - Standard BT5 Configurator Item + """ + self._stepCheckPreferenceConfigurationItemList( + business_configuration=sequence.get("business_configuration"), + currency_title='Euro', + currency_reference='EUR', + bt5_id='erp5_l10n_fr') + + def stepCheckPreferenceConfigurationItemListBrazil(self, sequence=None, sequence_list=None, **kw): + """ + Check the creation of: + - Currency Configurator Item + - Service Configurator Item + - System Preference Configurator Item + - Standard BT5 Configurator Item + """ + self._stepCheckPreferenceConfigurationItemList( + business_configuration=sequence.get("business_configuration"), + currency_title='Brazilian Real', + currency_reference='BRL', + bt5_id='erp5_l10n_pt-BR') + + def stepCheckPreferenceConfigurationItemListRussia(self, sequence=None, sequence_list=None, **kw): + """ + Check the creation of: + - Currency Configurator Item + - Service Configurator Item + - System Preference Configurator Item + - Standard BT5 Configurator Item + """ + self._stepCheckPreferenceConfigurationItemList( + business_configuration=sequence.get("business_configuration"), + currency_title='Belarusian Rouble', + currency_reference='BYR', + bt5_id='erp5_l10n_ru') + + def stepCheckConfigureInstallationForm(self, sequence=None, sequence_list=None, **kw): + """ Check the installation form """ + response_dict = sequence.get("response_dict") + # configuration is finished. We are at the Install state. + self.assertEquals('show', response_dict['command']) + self.assertEquals('Previous', response_dict['previous']) + self.assertEquals('Install', response_dict['next']) + + self.assertCurrentStep('ERP5 installation', response_dict) + + def stepSetupInstallConfiguration(self, sequence=None, sequence_list=None, **kw): + """ Install the Configuration """ + next_dict = {} + sequence.edit(next_dict=next_dict) + + def stepCheckInstallConfiguration(self, sequence=None, sequence_list=None, **kw): + """ Check the installation of the configuration """ + response_dict = sequence.get("response_dict") + self.assertEquals('install', response_dict['command']) + + def _stepCheckInstanceIsConfigured(self, business_configuration, bt5_tuple): + """ Check if the instance is configured with proper business templates """ + # XXX FIXME (lucas): it should be a property of business configuration + bc_id = '_'.join(business_configuration.getTitle().strip().lower().split()) + + # check if bt5 are installed. + bt5_title_list = self.portal.portal_templates.getInstalledBusinessTemplateTitleList() + expected_list = self.standard_bt5_list + bt5_tuple + self.assertEquals([i for i in expected_list if i not in bt5_title_list], []) + + + self.assertFalse(bc_id in bt5_title_list) + + bt = business_configuration.getSpecialiseValue(portal_type="Business Template") + self.assertEquals(bc_id, bt.getTitle()) + self.assertEquals(bt.getInstallationState(), 'not_installed') + self.assertEquals(bt.getBuildingState(), 'built') + + + # check for links + file_list = business_configuration.searchFolder(portal_type="File") + self.assertEquals(1, len(file_list)) + self.assertEquals(business_configuration.getSpecialiseTitle(), + file_list[0].getTitle()) + + file_title_list = ('%s' % bc_id,) + self.assertSameSet(file_title_list, [f.getTitle() for f in file_list]) + + def stepCheckConfiguredInstancePreference(sequence=None, sequence_list=None, **kw): + """ Check if the configured instance has appropriate configuration""" + + def stepCheckInstanceIsConfiguredFrance(self, sequence=None, sequence_list=None, **kw): + """ Check if the instance is configured with French business templates """ + self._stepCheckInstanceIsConfigured( + business_configuration=sequence.get('business_configuration'), + bt5_tuple=('erp5_accounting_l10n_fr', 'erp5_l10n_fr',)) + + def stepCheckInstanceIsConfiguredBrazil(self, sequence=None, sequence_list=None, **kw): + """ Check if the instance is configured with Brazilian business templates """ + self._stepCheckInstanceIsConfigured( + business_configuration=sequence.get('business_configuration'), + bt5_tuple=('erp5_accounting_l10n_br_extend', 'erp5_l10n_pt-BR',)) + + def stepCheckInstanceIsConfiguredRussia(self, sequence=None, sequence_list=None, **kw): + """ Check if the instance is configured with Russian business templates """ + self._stepCheckInstanceIsConfigured( + business_configuration=sequence.get('business_configuration'), + bt5_tuple=('erp5_accounting_l10n_ru', 'erp5_l10n_ru',)) + + def stepStartConfigurationInstallation(self, sequence=None, sequence_list=None, **kw): + """ Starts the installation """ + business_configuration = sequence.get("business_configuration") + self.portal.portal_configurator.startInstallation( + business_configuration, REQUEST=self.portal.REQUEST) + -- 2.30.9