ConfiguratorTestMixin.py 90.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
##############################################################################
# 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
Rafael Monnerat's avatar
Rafael Monnerat committed
32
from AccessControl import Unauthorized
33 34 35 36 37 38 39 40 41 42
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase
from AccessControl.SecurityManagement import newSecurityManager

class TestLiveConfiguratorWorkflowMixin(SecurityTestCase):
  """
    Configurator Mixin Class
  """
  # The list of standard business templates that the configurator should force
  # to install
43
  expected_bt5_list = ('erp5_simulation',
44 45 46 47 48 49 50 51 52 53 54 55 56
                       'erp5_dhtml_style',
                       'erp5_jquery',
                       'erp5_jquery_ui',
                       'erp5_ingestion_mysql_innodb_catalog',
                       'erp5_ingestion',
                       'erp5_web',
                       'erp5_dms',
                       'erp5_crm',
                       'erp5_pdm',
                       'erp5_trade',
                       'erp5_knowledge_pad',
                       'erp5_accounting',
                       'erp5_invoicing',
57 58 59 60
                       'erp5_configurator_standard_solver',
                       'erp5_configurator_standard_trade_template',
                       'erp5_configurator_standard_accounting_template',
                       'erp5_configurator_standard_invoicing_template',
61 62 63 64 65 66 67
                       'erp5_trade_knowledge_pad',
                       'erp5_crm_knowledge_pad',
                       'erp5_simplified_invoicing',
                       'erp5_ods_style',
                       'erp5_odt_style',
                       'erp5_ooo_import')

68 69 70 71
  standard_bt5_list = ('erp5_dhtml_style',
                         'erp5_jquery_ui',
                         'erp5_ingestion_mysql_innodb_catalog',
                         'erp5_dms',
72
                         'erp5_accounting',
73 74 75 76
                         'erp5_crm',
                         'erp5_simplified_invoicing',
                         'erp5_trade_knowledge_pad',
                         'erp5_crm_knowledge_pad',
77 78 79 80
                         'erp5_configurator_standard_solver',
                         'erp5_configurator_standard_trade_template',
                         'erp5_configurator_standard_accounting_template',
                         'erp5_configurator_standard_invoicing_template',
81 82 83 84
                         'erp5_ods_style',
                         'erp5_odt_style',
                         'erp5_ooo_import')

85 86
  def getBusinessTemplateList(self):
    return ('erp5_core_proxy_field_legacy',
87
        'erp5_full_text_mroonga_catalog',
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
        '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()
103
    self.loginByUserName(user_name='test_configurator_user')
104 105 106 107 108 109 110 111 112 113
    # 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
114 115
    self.setupAutomaticBusinessTemplateRepository(
                 searchable_business_template_list=["erp5_core", "erp5_base"])
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

    # it is required by SecurityTestCase
    self.workflow_tool = self.portal.portal_workflow
    self.portal.portal_activities.unsubscribe()

  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)
149

150 151 152 153 154 155 156 157 158 159 160 161 162
  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']
163
    self.assertEqual(
164
      set(self.standard_bt5_list),
165
      {x.bt5_id for x in standard_bt5_config_save.contentValues()})
166 167 168 169

    # 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']
170
    self.assertEqual(custom_bt5_config_item.getPortalType(),
171
                      'Customer BT5 Configurator Item')
172
    self.assertEqual(custom_bt5_config_item.bt5_title,
173 174 175 176 177 178
          '_'.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:
179 180
      self.assertEqual('show', response_dict['command'])
    self.assertEqual('Configure Organisation', response_dict['next'])
181 182
    self.assertCurrentStep('Your organisation', response_dict)

183
  def stepSetupOrganisationConfiguratorItem(self, sequence=None, sequence_list=None, **kw):
184
    """ Create one Organisation """
185 186
    default_address_city = sequence.get('organisation_default_address_city')
    default_address_region = sequence.get('organisation_default_address_region')
187 188 189 190 191
    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='.',
192 193 194
        field_your_default_address_zip_code='59000',
        field_your_default_address_city=default_address_city,
        field_your_default_address_region=default_address_region)
195 196 197 198 199 200 201
    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:
202 203 204
      self.assertEqual('show', response_dict['command'])
    self.assertEqual('Configure user accounts number', response_dict['next'])
    self.assertEqual('Previous', response_dict['previous'])
205 206 207 208 209 210 211 212 213 214 215 216
    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:
217 218 219
      self.assertEqual('show', response_dict['command'])
    self.assertEqual('Previous', response_dict['previous'])
    self.assertEqual('Configure user accounts', response_dict['next'])
220 221 222 223 224 225 226 227 228 229
    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)

230 231 232 233 234 235 236 237 238 239 240
  def _getUserIdList(self, login_list):
    user_id_dict = {
      x['login']: x['id'] for x in self.portal.acl_users.searchUsers(
        login=login_list,
        exact_match=True,
      )
    }
    self.assertSameSet(user_id_dict, login_list)
    return user_id_dict.values()


241
  def stepCheckMultiplePersonConfigurationItem(self, sequence=None, sequence_list=None, **kw):
242
    """
243 244 245 246
      Check if multiple Person Configuration Item of the Business
      Configuration have been created successfully.
    """
    business_configuration = sequence.get("business_configuration")
247
    self.assertEqual(int(self.company_employees_number),
248 249 250 251 252 253 254 255 256 257 258 259 260 261
                          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


262
    self.assertEqual(int(self.company_employees_number),
263 264 265 266 267 268 269
        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:
270
      self.assertEqual('show', response_dict['command'])
271 272
    self.assertEqual('Previous', response_dict['previous'])
    self.assertEqual('Configure accounting', response_dict['next'])
273 274
    self.assertCurrentStep('Accounting', response_dict)

275
  def stepSetupAccountingConfiguration(self, sequence=None, sequence_list=None, **kw):
276
    """ Setup up the accounting configuration """
277 278
    accounting_plan=sequence.get('configuration_accounting_plan')
    next_dict = dict(field_your_accounting_plan=accounting_plan,
279 280 281 282 283 284
                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',
285
                field_your_period_title='2008'
286 287 288 289 290 291 292
           )
    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:
293 294 295
      self.assertEqual('show', response_dict['command'])
    self.assertEqual('Previous', response_dict['previous'])
    self.assertEqual('Configure ERP5 Preferences', response_dict['next'])
296 297 298 299 300 301 302 303 304 305 306 307
    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']
308
    self.assertEqual('Standard BT5 Configurator Item',
309
            bt5_business_configuration_item.getPortalType())
310
    self.assertEqual(bt5_id, bt5_business_configuration_item.bt5_id)
311 312 313 314 315

    # 2. a preference
    preference_buisiness_configurator_item_list =\
       accounting_business_configuration_save.contentValues(
           portal_type='Preference Configurator Item')
316
    self.assertEqual(1, len(preference_buisiness_configurator_item_list))
317 318
    preference_buisiness_configurator_item = \
        preference_buisiness_configurator_item_list[0]
319
    self.assertEqual(accounting_transaction_gap,
320 321
           preference_buisiness_configurator_item.getProperty(
              'preferred_accounting_transaction_gap'))
322
    self.assertEqual(self.preference_group,
323 324
           preference_buisiness_configurator_item.getProperty(
              'preferred_accounting_transaction_section_category'))
325

326 327 328
    # 3. some pre-configured accounts
    account_business_configuration_item =\
          accounting_business_configuration_save['2']
329
    self.assertEqual('Account Configurator Item',
330
            account_business_configuration_item.getPortalType())
331
    self.assertEqual('capital',
332
        getattr(account_business_configuration_item, 'account_id', 'not set'))
333
    self.assertEqual('equity',
334
            account_business_configuration_item.getAccountType())
335 336
    self.assertEqual(gap, account_business_configuration_item.getGap())
    self.assertEqual('equity/share_capital',
337 338 339
            account_business_configuration_item.getFinancialSection())

    # title is translated here
340
    title = account_business_configuration_item.getTitle()
341
    self.assertTrue(title in ('Capital', 'Gezeichnetes Kapital',
342 343
        '\xd0\xa3\xd1\x81\xd1\x82\xd0\xb0\xd0\xb2\xd0\xbd\xd1\x8b\xd0\xb9 ' \
                  '\xd0\xba\xd0\xb0\xd0\xbf\xd0\xb8\xd1\x82\xd0\xb0\xd0\xbb'))
344 345 346 347 348

    # 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
349
    self.assertEqual('Accounting Period Configurator Item',
350
        accounting_period_configuration_item.getPortalType())
351

352
    self.assertEqual(DateTime(2008, 1, 1),
353
        accounting_period_configuration_item.getStartDate())
354
    self.assertEqual(DateTime(2008, 12, 31),
355
        accounting_period_configuration_item.getStopDate())
356
    self.assertEqual('2008',
357 358 359 360 361 362 363 364 365 366
        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')

367 368 369 370 371 372 373 374
  def stepCheckAccountingConfigurationItemListGermany(self, sequence=None, sequence_list=None, **kw):
    """ Check the German accounting configuration item """
    self._stepCheckAccountingConfigurationItemList(
                business_configuration=sequence.get("business_configuration"),
                bt5_id='erp5_accounting_l10n_de_skr04',
                accounting_transaction_gap='gap/de/skr04',
                gap='de/skr04/3/1/2/1/1')

375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
  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')

391
  def stepSetupPreferenceConfiguration(self, sequence=None, sequence_list=None, **kw):
392
    """ Setup the preference configuration """
393 394 395 396

    lang = sequence.get('configuration_lang')
    price_currency = sequence.get('configuration_price_currency')
    next_dict = dict(field_your_price_currency=price_currency,
397 398 399 400
                field_your_preferred_date_order='dmy',
                field_your_lang=lang,
                default_field_your_lang=1,)

401 402
    currency_id = sequence.get('configuration_currency_reference')
    sequence.edit(next_dict=next_dict, currency_id=currency_id)
403

404
  def stepCheckPreferenceConfigurationItemList(self, sequence=None, sequence_list=None, **kw):
405 406 407 408 409 410 411
    """
      Check the creation of:
      - Currency Configurator Item
      - Service Configurator Item
      - System Preference Configurator Item
      - Standard BT5 Configurator Item
    """
412 413 414 415 416
    currency_title = sequence.get('configuration_currency_title')
    currency_reference = sequence.get('configuration_currency_reference')
    bt5_id = sequence.get('configuration_lang')
    business_configuration = sequence.get("business_configuration")

417 418 419
    # this created a currency
    preferences_business_configuration_save = business_configuration.\
                      contentValues(portal_types='Configuration Save')[-1]
420

421 422
    currency_business_configuration_item =\
          preferences_business_configuration_save['1']
423
    self.assertEqual('Currency Configurator Item',
424
          currency_business_configuration_item.getPortalType())
425
    self.assertEqual(currency_title,
426
          currency_business_configuration_item.getTitle())
427
    self.assertEqual(0.01,
428
          currency_business_configuration_item.getBaseUnitQuantity())
429
    self.assertEqual(currency_reference,
430 431 432 433 434
          currency_business_configuration_item.getReference())
    # some services
    # TODO
    service_business_configuration_item =\
          preferences_business_configuration_save['2']
435
    self.assertEqual('Service Configurator Item',
436 437 438 439
                     service_business_configuration_item.getPortalType())
    # and a preference
    preference_business_configuration_item =\
          preferences_business_configuration_save['3']
440
    self.assertEqual('Preference Configurator Item',
441 442
        preference_business_configuration_item.getPortalType())
    # that uses the currency
443
    self.assertEqual('currency_module/%s' % currency_reference,
444 445 446 447 448 449
        preference_business_configuration_item.getProperty(
             'preferred_accounting_transaction_currency'))

    # system preferences
    system_pref_configurator_item =\
        preferences_business_configuration_save['4']
450
    self.assertEqual('System Preference Configurator Item',
451 452 453 454 455
        system_pref_configurator_item.getPortalType())

    # a standard bt5 for localisation
    bt5_business_configuration_item =\
          preferences_business_configuration_save['5']
456
    self.assertEqual('Standard BT5 Configurator Item',
457
            bt5_business_configuration_item.getPortalType())
458
    self.assertEqual(bt5_id,
459 460 461 462 463 464
            bt5_business_configuration_item.bt5_id)

  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.
465 466 467
    self.assertEqual('show', response_dict['command'])
    self.assertEqual('Previous', response_dict['previous'])
    self.assertEqual('Install', response_dict['next'])
468

469
    self.assertCurrentStep('Download', response_dict)
470 471 472

  def stepSetupInstallConfiguration(self, sequence=None, sequence_list=None, **kw):
    """ Install the Configuration """
473
    sequence.edit(next_dict={})
474 475 476 477

  def stepCheckInstallConfiguration(self, sequence=None, sequence_list=None, **kw):
    """ Check the installation of the configuration """
    response_dict = sequence.get("response_dict")
478
    self.assertEqual('install', response_dict['command'])
479 480 481 482 483 484 485 486

  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()
487
    expected_list = self.expected_bt5_list + bt5_tuple
488
    self.assertEqual([i for i in expected_list if i not in bt5_title_list], [])
489

490 491 492
    self.assertFalse(bc_id in bt5_title_list)

    bt = business_configuration.getSpecialiseValue(portal_type="Business Template")
493 494
    self.assertEqual(bc_id, bt.getTitle())
    self.assertEqual(bt.getInstallationState(), 'not_installed')
495 496 497 498 499 500 501 502 503 504

  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',))

505 506 507 508 509 510
  def stepCheckInstanceIsConfiguredGermany(self, sequence=None,  sequence_list=None, **kw):
    """ Check if the instance is configured with German business templates """
    self._stepCheckInstanceIsConfigured(
                business_configuration=sequence.get('business_configuration'),
                bt5_tuple=('erp5_accounting_l10n_de_skr04', 'erp5_l10n_de',))

511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
  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)

Rafael Monnerat's avatar
Rafael Monnerat committed
529 530 531 532 533 534 535 536

  ###################################
  ## Test Configurator Security
  ###################################
  def stepViewAddGadget(self, sequence=None, sequence_list=None, **kw):
    """
       Test if gadget system is working.
    """
537
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
538 539 540 541 542 543 544 545 546 547 548 549 550
      self._loginAsUser(user_id)
      knowledge_pad_module = self.portal.knowledge_pad_module
      knowledge_pad = knowledge_pad_module.newContent(portal_type='Knowledge Pad')
      self.failUnlessUserCanViewDocument(user_id, knowledge_pad)
      self.failUnlessUserCanAccessDocument(user_id, knowledge_pad)
      # only in visible state we can add Gadgets (i.e. Knowledge Boxes)
      knowledge_pad.visible()
      knowledge_box = knowledge_pad.newContent(portal_type='Knowledge Box')
      self.failUnlessUserCanViewDocument(user_id, knowledge_box)
      self.failUnlessUserCanAccessDocument(user_id, knowledge_box)

  def stepViewEventModule(self, sequence=None, sequence_list=None, **kw):
    """ Everybody can view events. """
551 552 553
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, self.portal.event_module)
      self.failUnlessUserCanAccessDocument(user_id, self.portal.event_module)
Rafael Monnerat's avatar
Rafael Monnerat committed
554 555 556

  def stepAddEvent(self, sequence=None, sequence_list=None, **kw):
    """ Everybody can add events. """
557 558
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanAddDocument(user_id, self.portal.event_module)
Rafael Monnerat's avatar
Rafael Monnerat committed
559 560
      for event_type in ('Visit', 'Web Message', 'Letter', 'Note',
                         'Phone Call', 'Mail Message', 'Fax Message'):
561
        self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
562
        event = self.portal.event_module.newContent(portal_type=event_type)
563 564
        self.failUnlessUserCanViewDocument(user_id, event)
        self.failUnlessUserCanAccessDocument(user_id, event)
Rafael Monnerat's avatar
Rafael Monnerat committed
565 566 567 568 569 570

  def stepSentEventWorkflow(self, sequence=None, sequence_list=None, **kw):
    for event_type in ('Visit', 'Web Message', 'Letter', 'Note',
                       'Phone Call', 'Mail Message', 'Fax Message'):
      event = self.portal.event_module.newContent(portal_type=event_type)
      # in draft state, we can view & modify
571 572 573 574
      for user_id in self._getUserIdList(self.all_username_list):
        self.failUnlessUserCanAccessDocument(user_id, event)
        self.failUnlessUserCanViewDocument(user_id, event)
        self.failUnlessUserCanModifyDocument(user_id, event)
Rafael Monnerat's avatar
Rafael Monnerat committed
575 576

      # everybody can cancel from draft
577
      for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
578
        self.failUnlessUserCanPassWorkflowTransition(
579
                    user_id, 'cancel_action', event)
Rafael Monnerat's avatar
Rafael Monnerat committed
580

581
      # everybody can plan
582
      for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
583
        self.failUnlessUserCanPassWorkflowTransition(
584
                    user_id, 'plan_action', event)
Rafael Monnerat's avatar
Rafael Monnerat committed
585 586

      event.plan()
587
      self.assertEqual('planned', event.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
588

589
      # everybody can confirm or send a planned event
590
      for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
591
        self.failUnlessUserCanPassWorkflowTransition(
592
                    user_id, 'confirm_action', event)
Rafael Monnerat's avatar
Rafael Monnerat committed
593
        self.failUnlessUserCanPassWorkflowTransition(
594
                    user_id, 'start_action', event)
Rafael Monnerat's avatar
Rafael Monnerat committed
595 596

      event.start()
597
      self.assertEqual('started', event.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
598

599
      # everybody can deliver a sent event
600
      for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
601
        self.failUnlessUserCanPassWorkflowTransition(
602
                    user_id, 'deliver_action', event)
Rafael Monnerat's avatar
Rafael Monnerat committed
603
      event.deliver()
604
      self.assertEqual('delivered', event.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
605 606 607 608

  ## Accounts {{{
  def stepViewAccountModule(self, sequence=None, sequence_list=None, **kw):
    """ everybody can view and access account module. """
609 610
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
611
                              self.portal.account_module)
612
      self.failUnlessUserCanAccessDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
613 614 615 616
                              self.portal.account_module)

  def stepAddAccountModule(self, sequence=None, sequence_list=None, **kw):
    """ only accountants can add accounts. """
617 618
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanAddDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
619 620
                    self.portal.account_module)
    if self.restricted_security:
621 622
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanAddDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
623 624 625 626 627 628
                      self.portal.account_module)

  def stepViewAccount(self, sequence=None, sequence_list=None, **kw):
    account = self.portal.account_module.newContent(
                                      portal_type='Account')
    # in draft state,
629
    self.assertEqual('draft', account.getValidationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
630
    # everybody can see
631 632 633
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, account)
      self.failUnlessUserCanAccessDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
634 635

    # only accountants can modify
636 637
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
638
    if self.restricted_security:
639 640
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
641 642

    # only accountants can validate
643
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
644
      self.failUnlessUserCanPassWorkflowTransition(
645
                  user_id, 'validate_action', account)
Rafael Monnerat's avatar
Rafael Monnerat committed
646
    if self.restricted_security:
647
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
648
        self.failIfUserCanPassWorkflowTransition(
649
                    user_id, 'validate_action', account)
Rafael Monnerat's avatar
Rafael Monnerat committed
650 651

    account.validate()
652
    self.assertEqual('validated', account.getValidationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
653
    # in validated state, every body can view, but *nobody* can modify
654 655 656 657
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, account)
      self.failUnlessUserCanAccessDocument(user_id, account)
      self.failIfUserCanModifyDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
658 659

    # only accountants can invalidate
660
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
661
      self.failUnlessUserCanPassWorkflowTransition(
662
                  user_id, 'invalidate_action', account)
Rafael Monnerat's avatar
Rafael Monnerat committed
663
    if self.restricted_security:
664
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
665
        self.failIfUserCanPassWorkflowTransition(
666
                  user_id, 'invalidate_action', account)
Rafael Monnerat's avatar
Rafael Monnerat committed
667 668

    account.invalidate()
669
    self.assertEqual('invalidated', account.getValidationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
670
    # back in invalidated state, everybody can view
671 672 673
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, account)
      self.failUnlessUserCanAccessDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
674
    # only accountants can modify
675 676
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
677
    if self.restricted_security:
678 679
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
680 681 682

    account.delete()
    # nobody can view delete object, but we can still access, for safety
683 684
    for user_id in self._getUserIdList(self.all_username_list):
      self.failIfUserCanViewDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
685 686 687 688 689 690

  def stepCopyPasteAccount(self, sequence=None, sequence_list=None, **kw):
    # tests copy / pasting accounts from account module
    account = self.portal.account_module.newContent(
                                      portal_type='Account')
    # in draft state,
691
    self.assertEqual('draft', account.getValidationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
692 693

    # everybody can see
694 695 696
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, account)
      self.failUnlessUserCanAccessDocument(user_id, account)
Rafael Monnerat's avatar
Rafael Monnerat committed
697 698 699

  def stepViewEntityModules(self, sequence=None, sequence_list=None, **kw):
    # Everybody can view entities.
700
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
701 702
      for module in [self.portal.person_module,
                     self.portal.organisation_module]:
703 704
        self.failUnlessUserCanViewDocument(user_id, module)
        self.failUnlessUserCanAccessDocument(user_id, module)
Rafael Monnerat's avatar
Rafael Monnerat committed
705 706 707

  def stepAddEntityModules(self, sequence=None, sequence_list=None, **kw):
    # Everybody can add entities.
708
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
709 710
      for module in [self.portal.person_module,
                     self.portal.organisation_module]:
711
        self.failUnlessUserCanAddDocument(user_id, module)
Rafael Monnerat's avatar
Rafael Monnerat committed
712 713 714 715 716 717

  def stepCopyAndPastePerson(self, sequence=None, sequence_list=None, **kw):
    # copy & paste in person module
    person = self.portal.person_module.newContent(
                                    portal_type='Person')

718 719
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
720 721 722 723 724 725
      person.Base_createCloneDocument()

  def stepCopyAndPasteOrganisation(self, sequence=None, sequence_list=None, **kw):
    # copy & paste in organisation module
    organisation = self.portal.organisation_module.newContent(
                                    portal_type='Organisation')
726 727
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
728 729 730 731 732 733 734
      organisation.Base_createCloneDocument()

  def stepEntityWorkflow(self, sequence=None, sequence_list=None, **kw):
    for module in [self.portal.person_module,
                   self.portal.organisation_module]:
      entity = module.newContent()
      # in draft state, we can view, modify & add
735 736 737 738 739
      for user_id in self._getUserIdList(self.all_username_list):
        self.failUnlessUserCanAccessDocument(user_id, entity)
        self.failUnlessUserCanViewDocument(user_id, entity)
        self.failUnlessUserCanModifyDocument(user_id, entity)
        self.failUnlessUserCanAddDocument(user_id, entity)
Rafael Monnerat's avatar
Rafael Monnerat committed
740 741

      # everybody can validate
742
      for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
743
        self.failUnlessUserCanPassWorkflowTransition(
744
                    user_id, 'validate_action', entity)
Rafael Monnerat's avatar
Rafael Monnerat committed
745
      entity.validate()
746
      self.assertEqual('validated', entity.getValidationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
747 748

      # in validated state, we can still modify
749 750 751 752 753
      for user_id in self._getUserIdList(self.all_username_list):
        self.failUnlessUserCanAccessDocument(user_id, entity)
        self.failUnlessUserCanViewDocument(user_id, entity)
        self.failUnlessUserCanModifyDocument(user_id, entity)
        self.failUnlessUserCanAddDocument(user_id, entity)
Rafael Monnerat's avatar
Rafael Monnerat committed
754 755

      # and invalidate
756
      for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
757
        self.failUnlessUserCanPassWorkflowTransition(
758
                    user_id, 'invalidate_action', entity)
Rafael Monnerat's avatar
Rafael Monnerat committed
759 760

  def stepViewCreatedPersons(self, sequence=None, sequence_list=None, **kw):
761
    self.loginByUserName(user_name='test_configurator_user')
Rafael Monnerat's avatar
Rafael Monnerat committed
762 763 764 765 766
    business_configuration = sequence.get('business_configuration')
    person_list = self.getBusinessConfigurationObjectList(business_configuration, 'Person')
    self.assertNotEquals(0, len(person_list))

    for entity in person_list:
767 768 769
      for user_id in self._getUserIdList(self.all_username_list):
        self.failUnlessUserCanAccessDocument(user_id, entity)
        self.failUnlessUserCanViewDocument(user_id, entity)
Rafael Monnerat's avatar
Rafael Monnerat committed
770 771

  def stepViewCreatedOrganisations(self, sequence=None, sequence_list=None, **kw):
772
    self.loginByUserName(user_name='test_configurator_user')
Rafael Monnerat's avatar
Rafael Monnerat committed
773 774 775 776 777
    business_configuration = sequence.get('business_configuration')
    organisation_list = self.getBusinessConfigurationObjectList(business_configuration, 'Organisation')
    self.assertNotEquals(0, len(organisation_list))

    for entity in organisation_list:
778 779 780
      for user_id in self._getUserIdList(self.all_username_list):
        self.failUnlessUserCanAccessDocument(user_id, entity)
        self.failUnlessUserCanViewDocument(user_id, entity)
Rafael Monnerat's avatar
Rafael Monnerat committed
781 782

  def stepViewCreatedAssignemnts(self, sequence=None, sequence_list=None, **kw):
783
    self.loginByUserName(user_name='test_configurator_user')
Rafael Monnerat's avatar
Rafael Monnerat committed
784 785 786 787 788 789 790 791
    business_configuration = sequence.get('business_configuration')
    person_list = self.getBusinessConfigurationObjectList(business_configuration, 'Person')
    self.assertNotEquals(0, len(person_list))

    for person in person_list:
      found_one = 0
      for assignment in person.contentValues(portal_type='Assignment'):
        found_one = 1
792 793 794
        for user_id in self._getUserIdList(self.all_username_list):
          self.failUnlessUserCanAccessDocument(user_id, assignment)
          self.failUnlessUserCanViewDocument(user_id, assignment)
Rafael Monnerat's avatar
Rafael Monnerat committed
795 796 797 798 799 800 801 802 803
      self.assertTrue(found_one, 'No assignment found in %s' % person)

  # }}}

  ## Accounting Periods {{{
  def stepAddAccoutingPeriod(self, sequence=None, sequence_list=None, **kw):
    # Everybody can add accounting periods.
    organisation = self.portal.organisation_module.newContent(
                          portal_type='Organisation')
804 805
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
806 807 808 809
      self.assertTrue('Accounting Period' in
            organisation.getVisibleAllowedContentTypeList())

  def stepValidatedAccountingPeriods(self, sequence=None, sequence_list=None, **kw):
810 811 812 813

    currency_id = sequence.get("currency_id")
    currency_value = getattr(self.portal.currency_module, currency_id)

Rafael Monnerat's avatar
Rafael Monnerat committed
814 815
    organisation = self.portal.organisation_module.newContent(
                          portal_type='Organisation',
816
                          price_currency_value=currency_value,
Rafael Monnerat's avatar
Rafael Monnerat committed
817 818 819 820 821
                          group='my_group')
    accounting_period = organisation.newContent(
                          portal_type='Accounting Period',
                          start_date=DateTime(2001, 01, 01),
                          stop_date=DateTime(2002, 12, 31))
822
    self.assertEqual(accounting_period.getSimulationState(), 'draft')
Rafael Monnerat's avatar
Rafael Monnerat committed
823 824

    # accountants can modify the period
825 826
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
827
    # accountants can cancel the period
828
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
829
      self.failUnlessUserCanPassWorkflowTransition(
830
          user_id, 'cancel_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
831
    # accountants can start the period
832
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
833
      self.failUnlessUserCanPassWorkflowTransition(
834
          user_id, 'start_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
835 836 837

    # once the period is started, nobody can modify
    accounting_period.start()
838
    self.assertEqual('started', accounting_period.getSimulationState())
839 840
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failIfUserCanModifyDocument(user_id, accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
841
    # accountants can still cancel the period
842
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
843
      self.failUnlessUserCanPassWorkflowTransition(
844
          user_id, 'cancel_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
845
    # accountants can stop the period
846
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
847
      self.failUnlessUserCanPassWorkflowTransition(
848
          user_id, 'stop_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
849 850
    # and reopen it
    accounting_period.stop()
851
    self.assertEqual('stopped', accounting_period.getSimulationState())
852
    for user_id in self._getUserIdList(self.accountant_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
853
      self.failUnlessUserCanPassWorkflowTransition(
854
          user_id, 'restart_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
855
    # but only accounting manager can close it
856
    accounting_manager_id, = self._getUserIdList([self.accounting_manager_reference])
Rafael Monnerat's avatar
Rafael Monnerat committed
857
    self.failUnlessUserCanPassWorkflowTransition(
858
          accounting_manager_id, 'deliver_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
859
    if self.restricted_security:
860
      accounting_agent_id, = self._getUserIdList([self.accounting_agent_reference])
Rafael Monnerat's avatar
Rafael Monnerat committed
861
      self.failIfUserCanPassWorkflowTransition(
862
          accounting_agent_id, 'deliver_action', accounting_period)
Rafael Monnerat's avatar
Rafael Monnerat committed
863 864 865 866 867 868 869 870 871 872

  # }}}

  ## Payment Nodes (Bank Account & Credit Cards) {{{
  def stepViewBankAccount(self, sequence=None, sequence_list=None, **kw):
    # Everybody can view bank accounts.
    entity = self.portal.organisation_module.newContent(
                                               portal_type='Organisation')
    bank_account = entity.newContent(portal_type='Bank Account')
    # everybody can view in draft ...
873
    self.assertEqual('draft', bank_account.getValidationState())
874 875 876
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, bank_account)
      self.failUnlessUserCanAccessDocument(user_id, bank_account)
Rafael Monnerat's avatar
Rafael Monnerat committed
877 878
    # ... and validated states
    bank_account.validate()
879
    self.assertEqual('validated', bank_account.getValidationState())
880 881 882
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, bank_account)
      self.failUnlessUserCanAccessDocument(user_id, bank_account)
Rafael Monnerat's avatar
Rafael Monnerat committed
883 884 885 886 887 888 889

  def stepViewCreditCard(self, sequence=None, sequence_list=None, **kw):
    # Everybody can view credit cards
    entity = self.portal.organisation_module.newContent(
                                               portal_type='Organisation')
    ext_payment = entity.newContent(portal_type='Credit Card')
    # every body can view in draft ...
890
    self.assertEqual('draft', ext_payment.getValidationState())
891 892 893
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, ext_payment)
      self.failUnlessUserCanAccessDocument(user_id, ext_payment)
Rafael Monnerat's avatar
Rafael Monnerat committed
894 895
    # ... and validated states
    ext_payment.validate()
896
    self.assertEqual('validated', ext_payment.getValidationState())
897 898 899
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id, ext_payment)
      self.failUnlessUserCanAccessDocument(user_id, ext_payment)
Rafael Monnerat's avatar
Rafael Monnerat committed
900 901 902 903 904 905 906

  def stepValidateAndModifyBankAccount(self, sequence=None, sequence_list=None, **kw):
    # Every body can modify Bank Accounts
    entity = self.portal.organisation_module.newContent(
                                               portal_type='Organisation')
    bank_account = entity.newContent(portal_type='Bank Account')
    # draft
907 908 909 910
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, bank_account)
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
911 912 913
                'validate_action', bank_account)
    # validated
    bank_account.validate()
914
    self.assertEqual('validated', bank_account.getValidationState())
915 916 917 918
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, bank_account)
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
919 920 921
                'invalidate_action', bank_account)
    # invalidated
    bank_account.invalidate()
922
    self.assertEqual('invalidated', bank_account.getValidationState())
923 924 925 926
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, bank_account)
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
927 928 929 930 931 932 933 934
                'validate_action', bank_account)

  def stepValidateAndModifyCreditCard(self, sequence=None, sequence_list=None, **kw):
    # Every body can modify Credit Card
    entity = self.portal.organisation_module.newContent(
                                               portal_type='Organisation')
    credit_card = entity.newContent(portal_type='Credit Card')
    # draft
935 936 937 938
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, credit_card)
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
939 940 941
                'validate_action', credit_card)
    # validated
    credit_card.validate()
942
    self.assertEqual('validated', credit_card.getValidationState())
943 944 945 946
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, credit_card)
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
947 948 949
                'invalidate_action', credit_card)
    # invalidated
    credit_card.invalidate()
950
    self.assertEqual('invalidated', credit_card.getValidationState())
951 952 953 954
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, credit_card)
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
955 956 957 958
                'validate_action', credit_card)

  def stepAddPaymentNodeInPerson(self, sequence=None, sequence_list=None, **kw):
    person = self.portal.person_module.newContent(portal_type='Person')
959 960 961
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
      self.failUnlessUserCanAddDocument(user_id, person)
962
      self.assertTrue('Bank Account' in
Rafael Monnerat's avatar
Rafael Monnerat committed
963
                    person.getVisibleAllowedContentTypeList())
964
      self.assertTrue('Credit Card' in
Rafael Monnerat's avatar
Rafael Monnerat committed
965 966 967 968
                    person.getVisibleAllowedContentTypeList())
    # when the entity is validated, we can still add some payment nodes
    person.validate()
    self.portal.portal_caches.clearAllCache()
969 970 971
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
      self.failUnlessUserCanAddDocument(user_id, person)
972
      self.assertTrue('Bank Account' in
Rafael Monnerat's avatar
Rafael Monnerat committed
973
                    person.getVisibleAllowedContentTypeList())
974
      self.assertTrue('Credit Card' in
Rafael Monnerat's avatar
Rafael Monnerat committed
975 976 977 978 979
                    person.getVisibleAllowedContentTypeList())

  def stepAddPaymentNodeInOrganisation(self, sequence=None, sequence_list=None, **kw):
    org = self.portal.organisation_module.newContent(
                                    portal_type='Organisation')
980 981 982
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
      self.failUnlessUserCanAddDocument(user_id, org)
983
      self.assertTrue('Bank Account' in
Rafael Monnerat's avatar
Rafael Monnerat committed
984
                    org.getVisibleAllowedContentTypeList())
985
      self.assertTrue('Credit Card' in
Rafael Monnerat's avatar
Rafael Monnerat committed
986 987 988 989
                    org.getVisibleAllowedContentTypeList())
    # when the entity is validated, we can still add some payment nodes
    org.validate()
    self.portal.portal_caches.clearAllCache()
990 991 992
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
      self.failUnlessUserCanAddDocument(user_id, org)
993
      self.assertTrue('Bank Account' in
Rafael Monnerat's avatar
Rafael Monnerat committed
994
                    org.getVisibleAllowedContentTypeList())
995
      self.assertTrue('Credit Card' in
Rafael Monnerat's avatar
Rafael Monnerat committed
996 997 998 999 1000 1001 1002 1003
                    org.getVisibleAllowedContentTypeList())

  def stepCopyAndPasteBankAccountInPerson(self, sequence=None, sequence_list=None, **kw):
    # everybody can cp bank accounts in persons
    person = self.portal.organisation_module.newContent(
                                    portal_type='Organisation')
    bank_account = person.newContent(
                              portal_type='Bank Account')
1004 1005
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1006 1007 1008 1009 1010 1011 1012 1013
      bank_account.Base_createCloneDocument()

  def stepCopyAndPasteBankAccountInOrganisation(self, sequence=None, sequence_list=None, **kw):
    # everybody can cp bank accounts in organisation
    organisation = self.portal.organisation_module.newContent(
                                    portal_type='Organisation')
    bank_account = organisation.newContent(
                              portal_type='Bank Account')
1014 1015
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1016 1017 1018 1019 1020 1021
      bank_account.Base_createCloneDocument()

  # }}}

  ## Accounting Module {{{
  def stepViewAccountingTransactionModule(self, sequence=None, sequence_list=None, **kw):
1022 1023
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanViewDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1024
              self.portal.accounting_module)
1025
      self.failUnlessUserCanAccessDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1026 1027 1028 1029
              self.portal.accounting_module)

  def stepAddAccountingTransactionModule(self, sequence=None, sequence_list=None, **kw):
    # Anyone can adds accounting transactions
1030 1031
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanAddDocument(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1032 1033 1034 1035 1036 1037 1038 1039
              self.portal.accounting_module)

  def stepCopyAndPasteAccountingTransactions(self, sequence=None, sequence_list=None, **kw):
    # Anyone can copy and paste accounting transaction.
    for portal_type in self._getAccountingTransactionTypeList():
      if portal_type != 'Balance Transaction':
        transaction = self.portal.accounting_module.newContent(
                                        portal_type=portal_type)
1040 1041
        for user_id in self._getUserIdList(self.all_username_list):
          self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
          transaction.Base_createCloneDocument()

  def _getAccountingTransactionTypeList(self):
    module = self.portal.accounting_module
    return [ti for ti in module.getVisibleAllowedContentTypeList()
               if ti not in ('Balance Transaction', )]

  def stepAccountingTransaction(self, sequence=None, sequence_list=None, **kw):
    transaction = self.portal.accounting_module.newContent(
                      portal_type='Accounting Transaction',
                      start_date=DateTime(2001, 01, 01),
                      stop_date=DateTime(2001, 01, 01))
1054
    self.assertEqual('draft', transaction.getSimulationState())
1055 1056 1057
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1058
    if self.restricted_security:
1059 1060 1061 1062 1063
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1064
    if self.restricted_security:
1065 1066
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1067 1068
                                                 'cancel_action',
                                                 transaction)
1069
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1070 1071
                                                 'plan_action',
                                                 transaction)
1072
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1073 1074
                                                 'confirm_action',
                                                 transaction)
1075
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1076 1077
                                                 'start_action',
                                                 transaction)
1078
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1079 1080
                                                 'stop_action',
                                                 transaction)
1081 1082
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1083 1084
                                               'cancel_action',
                                               transaction)
1085
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1086 1087
                                               'plan_action',
                                               transaction)
1088
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1089 1090
                                               'confirm_action',
                                               transaction)
1091
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1092 1093 1094
                                               'stop_action',
                                               transaction)
      # TODO
1095
      ### self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1096 1097 1098 1099 1100
      ###                                          'delete_action',
      ###                                          transaction)

    # (skip some states)
    transaction.start()
1101
    self.assertEqual('started', transaction.getSimulationState())
1102
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1103

1104
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1105
      # everybody can view
1106 1107
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1108 1109 1110

    # only accountant can modify
    if self.restricted_security:
1111 1112 1113
      for user_id in  self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
        self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1114 1115 1116

    if self.restricted_security:
      # only accountant can "stop"
1117 1118
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1119 1120
                                                 'stop_action',
                                                 transaction)
1121
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1122 1123
                                                 'deliver_action',
                                                 transaction)
1124 1125
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1126 1127 1128 1129
                                               'stop_action',
                                               transaction)

    transaction.stop()
1130
    self.assertEqual('stopped', transaction.getSimulationState())
1131
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1132
      # everybody can view
1133 1134
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1135
      # nobody can modify
1136 1137
      self.failIfUserCanModifyDocument(user_id, transaction)
      self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1138 1139

    if self.restricted_security:
1140 1141
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1142 1143
                                                 'restart_action',
                                                 transaction)
1144
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1145 1146
                                                 'deliver_action',
                                                 transaction)
1147
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1148 1149 1150
                                                 'cancel_action',
                                                 transaction)

1151 1152
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1153 1154 1155 1156
                                               'restart_action',
                                               transaction)
    # in started state, we can modify again, and go back to stopped state
    transaction.restart()
1157
    self.assertEqual('started', transaction.getSimulationState())
1158
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1159

1160 1161 1162
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1163 1164 1165 1166 1167
                                                  'stop_action',
                                                  transaction)

    # go back to stopped state
    transaction.stop()
1168
    self.assertEqual('stopped', transaction.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
1169 1170

    # only accounting_manager can validate
1171 1172
    accounting_manager_id, = self._getUserIdList([self.accounting_manager_reference])
    self.failUnlessUserCanPassWorkflowTransition(accounting_manager_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1173 1174 1175
                                            'deliver_action',
                                             transaction)
    if self.restricted_security:
1176 1177
      accounting_agent_id, = self._getUserIdList([self.accounting_agent_reference])
      self.failIfUserCanPassWorkflowTransition(accounting_agent_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1178 1179 1180 1181 1182 1183 1184 1185
                                              'deliver_action',
                                               transaction)

  def stepSaleInvoiceTransaction(self, sequence=None, sequence_list=None, **kw):
    transaction = self.portal.accounting_module.newContent(
                      portal_type='Sale Invoice Transaction',
                      start_date=DateTime(2001, 01, 01),
                      stop_date=DateTime(2001, 01, 01))
1186
    self.assertEqual('draft', transaction.getSimulationState())
1187 1188 1189
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1190
    if self.restricted_security:
1191 1192 1193 1194 1195
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1196
    if self.restricted_security:
1197
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list -
Rafael Monnerat's avatar
Rafael Monnerat committed
1198
                       self.sales_and_purchase_username_list):
1199
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1200 1201
                                                 'cancel_action',
                                                 transaction)
1202
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1203 1204
                                                 'plan_action',
                                                 transaction)
1205
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1206 1207
                                                 'confirm_action',
                                                 transaction)
1208
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1209 1210 1211
                                                 'stop_action',
                                                 transaction)

1212 1213
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1214 1215
                                                   'cancel_action',
                                                    transaction)
1216
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1217 1218
                                                   'plan_action',
                                                    transaction)
1219
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1220 1221 1222
                                                   'confirm_action',
                                                    transaction)

1223 1224
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1225 1226
                                               'cancel_action',
                                               transaction)
1227
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1228 1229
                                               'plan_action',
                                               transaction)
1230
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1231 1232
                                               'confirm_action',
                                               transaction)
1233
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1234 1235 1236
                                               'stop_action',
                                               transaction)
      # TODO
1237
      ### self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1238 1239 1240 1241 1242
      ###                                          'delete_action',
      ###                                          transaction)

    # (skip some states)
    transaction.start()
1243
    self.assertEqual('started', transaction.getSimulationState())
1244
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1245

1246
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1247
      # everybody can view
1248 1249
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1250 1251 1252

    # only accountant can modify
    if self.restricted_security:
1253 1254 1255
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
        self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1256 1257 1258

    if self.restricted_security:
      # only accountant can "stop"
1259 1260
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1261 1262
                                                 'stop_action',
                                                 transaction)
1263
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1264 1265
                                                 'deliver_action',
                                                 transaction)
1266 1267
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1268 1269 1270 1271
                                               'stop_action',
                                               transaction)

    transaction.stop()
1272
    self.assertEqual('stopped', transaction.getSimulationState())
1273
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1274
      # everybody can view
1275 1276
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1277
      # nobody can modify
1278 1279
      self.failIfUserCanModifyDocument(user_id, transaction)
      self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1280 1281

    if self.restricted_security:
1282 1283
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1284 1285
                                                 'restart_action',
                                                 transaction)
1286
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1287 1288
                                                 'deliver_action',
                                                 transaction)
1289
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1290 1291 1292
                                                 'cancel_action',
                                                 transaction)

1293 1294
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1295 1296 1297 1298
                                               'restart_action',
                                               transaction)
    # in started state, we can modify again, and go back to stopped state
    transaction.restart()
1299
    self.assertEqual('started', transaction.getSimulationState())
1300
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1301

1302 1303 1304
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1305 1306 1307 1308 1309
                                                  'stop_action',
                                                  transaction)

    # go back to stopped state
    transaction.stop()
1310
    self.assertEqual('stopped', transaction.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
1311 1312

    # only accounting_manager can validate
1313 1314
    accounting_manager_id, = self._getUserIdList([self.accounting_manager_reference])
    self.failUnlessUserCanPassWorkflowTransition(accounting_manager_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1315 1316 1317
                                            'deliver_action',
                                             transaction)
    if self.restricted_security:
1318 1319
      accounting_agent_id, = self._getUserIdList([self.accounting_agent_reference])
      self.failIfUserCanPassWorkflowTransition(accounting_agent_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1320 1321 1322 1323 1324 1325 1326 1327 1328
                                              'deliver_action',
                                               transaction)


  def stepPurchaseInvoiceTransaction(self, sequence=None, sequence_list=None, **kw):
    transaction = self.portal.accounting_module.newContent(
                      portal_type='Purchase Invoice Transaction',
                      start_date=DateTime(2001, 01, 01),
                      stop_date=DateTime(2001, 01, 01))
1329
    self.assertEqual('draft', transaction.getSimulationState())
1330 1331 1332
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1333
    if self.restricted_security:
1334 1335 1336 1337 1338
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1339
    if self.restricted_security:
1340
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list -
Rafael Monnerat's avatar
Rafael Monnerat committed
1341
                       self.sales_and_purchase_username_list):
1342
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1343 1344
                                                 'cancel_action',
                                                 transaction)
1345
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1346 1347
                                                 'plan_action',
                                                 transaction)
1348
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1349 1350
                                                 'confirm_action',
                                                 transaction)
1351
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1352 1353 1354
                                                 'stop_action',
                                                 transaction)

1355 1356
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1357 1358
                                                   'cancel_action',
                                                    transaction)
1359
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1360 1361
                                                   'plan_action',
                                                    transaction)
1362
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1363 1364 1365
                                                   'confirm_action',
                                                    transaction)
      # XXX would require to go to confirmed state first
1366
      # self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1367 1368 1369 1370
      #                                         'start_action',
      #                                         transaction)


1371 1372
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1373 1374
                                               'cancel_action',
                                               transaction)
1375
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1376 1377
                                               'plan_action',
                                               transaction)
1378
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1379 1380
                                               'confirm_action',
                                               transaction)
1381
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1382 1383 1384
                                               'stop_action',
                                               transaction)
      # TODO
1385
      ### self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1386 1387 1388 1389 1390
      ###                                          'delete_action',
      ###                                          transaction)

    # (skip some states)
    transaction.start()
1391
    self.assertEqual('started', transaction.getSimulationState())
1392
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1393

1394
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1395
      # everybody can view
1396 1397
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1398 1399 1400

    # only accountant can modify
    if self.restricted_security:
1401 1402 1403
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
        self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1404 1405 1406

    if self.restricted_security:
      # only accountant can "stop"
1407 1408
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1409 1410
                                                 'stop_action',
                                                 transaction)
1411
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1412 1413
                                                 'deliver_action',
                                                 transaction)
1414 1415
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1416 1417 1418 1419
                                               'stop_action',
                                               transaction)

    transaction.stop()
1420
    self.assertEqual('stopped', transaction.getSimulationState())
1421
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1422
      # everybody can view
1423 1424
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1425
      # nobody can modify
1426 1427
      self.failIfUserCanModifyDocument(user_id, transaction)
      self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1428 1429

    if self.restricted_security:
1430 1431
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1432 1433
                                                 'restart_action',
                                                 transaction)
1434
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1435 1436
                                                 'deliver_action',
                                                 transaction)
1437
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1438 1439 1440
                                                 'cancel_action',
                                                 transaction)

1441 1442
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1443 1444 1445 1446
                                               'restart_action',
                                               transaction)
    # in started state, we can modify again, and go back to stopped state
    transaction.restart()
1447
    self.assertEqual('started', transaction.getSimulationState())
1448
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1449

1450 1451 1452
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1453 1454 1455 1456 1457
                                                  'stop_action',
                                                  transaction)

    # go back to stopped state
    transaction.stop()
1458
    self.assertEqual('stopped', transaction.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
1459 1460

    # only accounting_manager can validate
1461 1462
    accounting_manager_id, = self._getUserIdList([self.accounting_manager_reference])
    self.failUnlessUserCanPassWorkflowTransition(accounting_manager_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1463 1464 1465
                                            'deliver_action',
                                             transaction)
    if self.restricted_security:
1466 1467
      accounting_agent_id, = self._getUserIdList([self.accounting_agent_reference])
      self.failIfUserCanPassWorkflowTransition(accounting_agent_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1468 1469 1470 1471 1472 1473 1474 1475
                                              'deliver_action',
                                               transaction)

  def stepPaymentTransaction(self, sequence=None, sequence_list=None, **kw):
    transaction = self.portal.accounting_module.newContent(
                      portal_type='Payment Transaction',
                      start_date=DateTime(2001, 01, 01),
                      stop_date=DateTime(2001, 01, 01))
1476
    self.assertEqual('draft', transaction.getSimulationState())
1477 1478 1479
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1480
    if self.restricted_security:
1481 1482 1483 1484 1485
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1486
    if self.restricted_security:
1487 1488
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1489 1490
                                                 'cancel_action',
                                                 transaction)
1491
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1492 1493
                                                 'plan_action',
                                                 transaction)
1494
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1495 1496
                                                 'confirm_action',
                                                 transaction)
1497
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1498 1499
                                                 'start_action',
                                                 transaction)
1500
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1501 1502
                                                 'stop_action',
                                                 transaction)
1503 1504
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1505 1506
                                               'cancel_action',
                                               transaction)
1507
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1508 1509
                                               'plan_action',
                                               transaction)
1510
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1511 1512
                                               'confirm_action',
                                               transaction)
1513
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1514 1515 1516
                                               'stop_action',
                                               transaction)
      # TODO
1517
      ### self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1518 1519 1520 1521 1522
      ###                                          'delete_action',
      ###                                          transaction)

    # (skip some states)
    transaction.start()
1523
    self.assertEqual('started', transaction.getSimulationState())
1524
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1525

1526
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1527
      # everybody can view
1528 1529
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1530 1531 1532

    # only accountant can modify
    if self.restricted_security:
1533 1534 1535
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanModifyDocument(user_id, transaction)
        self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1536 1537 1538

    # only accountant can "stop"
    if self.restricted_security:
1539 1540
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1541 1542
                                                 'stop_action',
                                                 transaction)
1543
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1544 1545
                                                 'deliver_action',
                                                 transaction)
1546 1547
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1548 1549 1550 1551
                                               'stop_action',
                                               transaction)

    transaction.stop()
1552
    self.assertEqual('stopped', transaction.getSimulationState())
1553
    for user_id in self._getUserIdList(self.all_username_list):
Rafael Monnerat's avatar
Rafael Monnerat committed
1554
      # everybody can view
1555 1556
      self.assertUserCanViewDocument(user_id, transaction)
      self.assertUserCanAccessDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1557
      # nobody can modify
1558 1559
      self.failIfUserCanModifyDocument(user_id, transaction)
      self.failIfUserCanAddDocument(user_id, transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1560 1561

    if self.restricted_security:
1562 1563
      for user_id in self._getUserIdList(self.all_username_list - self.accountant_username_list):
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1564 1565
                                                 'restart_action',
                                                 transaction)
1566
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1567 1568
                                                 'deliver_action',
                                                 transaction)
1569
        self.failIfUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1570 1571 1572
                                                 'cancel_action',
                                                 transaction)

1573 1574
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1575 1576 1577 1578
                                               'restart_action',
                                               transaction)
    # in started state, we can modify again, and go back to stopped state
    transaction.restart()
1579
    self.assertEqual('started', transaction.getSimulationState())
1580
    self.tic()
Rafael Monnerat's avatar
Rafael Monnerat committed
1581

1582 1583 1584
    for user_id in self._getUserIdList(self.accountant_username_list):
      self.failUnlessUserCanModifyDocument(user_id, transaction)
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1585 1586 1587 1588 1589
                                                  'stop_action',
                                                  transaction)

    # go back to stopped state
    transaction.stop()
1590
    self.assertEqual('stopped', transaction.getSimulationState())
Rafael Monnerat's avatar
Rafael Monnerat committed
1591 1592

    # only accounting_manager can validate
1593 1594
    accounting_manager_id, = self._getUserIdList([self.accounting_manager_reference])
    self.failUnlessUserCanPassWorkflowTransition(accounting_manager_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1595 1596 1597
                                            'deliver_action',
                                             transaction)
    if self.restricted_security:
1598 1599
      accounting_agent_id, = self._getUserIdList([self.accounting_agent_reference])
      self.failIfUserCanPassWorkflowTransition(accounting_agent_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1600 1601 1602 1603 1604 1605 1606 1607
                                              'deliver_action',
                                               transaction)

  def stepBalanceTransaction(self, sequence=None, sequence_list=None, **kw):
    # Balance Transaction must be viewable by users (creation & validation is
    # done from unrestricted code, so no problem)
    balance_transaction = self.portal.accounting_module.newContent(
                      portal_type='Balance Transaction')
1608 1609 1610
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, balance_transaction)
      self.assertUserCanAccessDocument(user_id, balance_transaction)
Rafael Monnerat's avatar
Rafael Monnerat committed
1611 1612 1613

  def stepAccountingTransaction_getCausalityGroupedAccountingTransactionList(
      self, sequence=None, sequence_list=None, **kw):
1614 1615
    accounting_manager_id, = self._getUserIdList([self.accounting_manager_reference])
    self._loginAsUser(accounting_manager_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631
    accounting_transaction_x_related_to_a = self.portal.\
                                    accounting_module.newContent(
                                    portal_type='Accounting Transaction',
                                    start_date=DateTime(2010, 06, 01),
                                    stop_date=DateTime(2010, 06, 01))

    accounting_transaction_y_related_to_a = self.portal.\
                                    accounting_module.newContent(
                                    portal_type='Accounting Transaction',
                                    start_date=DateTime(2010, 06, 01),
                                    stop_date=DateTime(2010, 06, 01))

    accounting_transaction_a = self.portal.accounting_module.newContent(
                                    portal_type='Accounting Transaction',
                                    start_date=DateTime(2010, 06, 01),
                                    stop_date=DateTime(2010, 06, 01))
1632

Rafael Monnerat's avatar
Rafael Monnerat committed
1633 1634 1635 1636
    accounting_transaction_b = self.portal.accounting_module.newContent(
                                    portal_type='Accounting Transaction',
                                    start_date=DateTime(2010, 06, 01),
                                    stop_date=DateTime(2010, 06, 01))
1637

Rafael Monnerat's avatar
Rafael Monnerat committed
1638 1639 1640 1641
    accounting_transaction_c = self.portal.accounting_module.newContent(
                                   portal_type='Accounting Transaction',
                                   start_date=DateTime(2010, 06, 01),
                                   stop_date=DateTime(2010, 06, 01))
1642

Rafael Monnerat's avatar
Rafael Monnerat committed
1643 1644 1645 1646 1647 1648 1649 1650 1651
    accounting_transaction_x_related_to_a.setCausalityValue(\
                                                   accounting_transaction_a)

    accounting_transaction_y_related_to_a.setCausalityValue(\
                                                   accounting_transaction_a)


    accounting_transaction_a.setCausalityValueList([accounting_transaction_b,
                                                    accounting_transaction_c])
1652
    self.tic()
1653

Rafael Monnerat's avatar
Rafael Monnerat committed
1654 1655
    accounting_transaction_list = accounting_transaction_a.\
          AccountingTransaction_getCausalityGroupedAccountingTransactionList()
1656

1657
    self.assertEqual(5, len(accounting_transaction_list))
1658

Rafael Monnerat's avatar
Rafael Monnerat committed
1659 1660 1661 1662 1663 1664 1665
    self.assertTrue(accounting_transaction_a in accounting_transaction_list)
    self.assertTrue(accounting_transaction_b in accounting_transaction_list)
    self.assertTrue(accounting_transaction_c in accounting_transaction_list)
    self.assertTrue(accounting_transaction_x_related_to_a in \
                                                accounting_transaction_list)
    self.assertTrue(accounting_transaction_y_related_to_a in \
                                                accounting_transaction_list)
1666

Rafael Monnerat's avatar
Rafael Monnerat committed
1667 1668
    accounting_transaction_x_related_to_a.delete()
    accounting_transaction_y_related_to_a.cancel()
1669
    self.tic()
1670

Rafael Monnerat's avatar
Rafael Monnerat committed
1671 1672
    accounting_transaction_list = accounting_transaction_a.\
          AccountingTransaction_getCausalityGroupedAccountingTransactionList()
1673

1674
    self.assertEqual(3, len(accounting_transaction_list))
1675

Rafael Monnerat's avatar
Rafael Monnerat committed
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686
    self.assertFalse(accounting_transaction_x_related_to_a in \
                                                accounting_transaction_list)
    self.assertFalse(accounting_transaction_y_related_to_a in \
                                                accounting_transaction_list)

  # }}}

  ## Assignments / Login and Password {{{
  def stepAddAssignments(self, sequence=None, sequence_list=None, **kw):
    # for now, anybody can add assignements
    person = self.portal.person_module.newContent(portal_type='Person')
1687 1688
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
1689
      self.assertTrue('Assignment' in
Rafael Monnerat's avatar
Rafael Monnerat committed
1690
                  person.getVisibleAllowedContentTypeList())
1691
      self.failUnlessUserCanAddDocument(user_id, person)
Rafael Monnerat's avatar
Rafael Monnerat committed
1692 1693 1694 1695 1696

  def stepAssignmentTI(self, sequence=None, sequence_list=None, **kw):
    ti = self.getTypesTool().getTypeInfo('Assignment')
    self.assertNotEquals(None, ti)
    # Acquire local roles on Assignment ? no
1697
    self.assertFalse(ti.getProperty('type_acquire_local_role', 1))
Rafael Monnerat's avatar
Rafael Monnerat committed
1698 1699 1700 1701 1702

  def stepEditAssignments(self, sequence=None, sequence_list=None, **kw):
    # everybody can open assignments in express
    person = self.portal.person_module.newContent(portal_type='Person')
    assignment = person.newContent(portal_type='Assignment')
1703 1704 1705
    for user_id in self._getUserIdList(self.all_username_list):
      self.failUnlessUserCanModifyDocument(user_id, assignment)
      self.failUnlessUserCanPassWorkflowTransition(user_id,
Rafael Monnerat's avatar
Rafael Monnerat committed
1706 1707 1708 1709 1710 1711 1712
                                                   'open_action',
                                                   assignment)
  # }}}

  # {{{ Trade
  def stepViewAcessAddPurchaseTradeCondition(self, sequence=None, sequence_list=None, **kw):
    module = self.portal.purchase_trade_condition_module
1713 1714 1715 1716 1717 1718
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, module)
      self.assertUserCanAccessDocument(user_id, module)
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.assertUserCanAddDocument(user_id, module)
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1719
      tc = module.newContent(portal_type='Purchase Trade Condition')
1720
      self.assertUserCanViewDocument(user_id, tc)
Rafael Monnerat's avatar
Rafael Monnerat committed
1721
      self.failUnlessUserCanPassWorkflowTransition(
1722
                    user_id, 'validate_action', tc)
Rafael Monnerat's avatar
Rafael Monnerat committed
1723 1724
      self.portal.portal_workflow.doActionFor(tc, 'validate_action')
      self.failUnlessUserCanPassWorkflowTransition(
1725
                    user_id, 'invalidate_action', tc)
Rafael Monnerat's avatar
Rafael Monnerat committed
1726 1727 1728

  def stepViewAccessAddSaleTradeCondition(self, sequence=None, sequence_list=None, **kw):
    module = self.portal.sale_trade_condition_module
1729 1730 1731 1732 1733 1734
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, module)
      self.assertUserCanAccessDocument(user_id, module)
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.assertUserCanAddDocument(user_id, module)
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1735
      tc = module.newContent(portal_type='Sale Trade Condition')
1736
      self.assertUserCanViewDocument(user_id, tc)
Rafael Monnerat's avatar
Rafael Monnerat committed
1737
      self.failUnlessUserCanPassWorkflowTransition(
1738
                    user_id, 'validate_action', tc)
Rafael Monnerat's avatar
Rafael Monnerat committed
1739 1740
      self.portal.portal_workflow.doActionFor(tc, 'validate_action')
      self.failUnlessUserCanPassWorkflowTransition(
1741
                    user_id, 'invalidate_action', tc)
Rafael Monnerat's avatar
Rafael Monnerat committed
1742 1743 1744

  def stepViewAccessAddSaleOrder(self, sequence=None, sequence_list=None, **kw):
    module = self.portal.sale_order_module
1745 1746 1747 1748 1749 1750
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, module)
      self.assertUserCanAccessDocument(user_id, module)
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.assertUserCanAddDocument(user_id, module)
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1751
      order = module.newContent(portal_type='Sale Order')
1752
      self.assertUserCanViewDocument(user_id, order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1753
      self.failUnlessUserCanPassWorkflowTransition(
1754
                    user_id, 'plan_action', order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1755
      self.failUnlessUserCanPassWorkflowTransition(
1756
                    user_id, 'confirm_action', order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1757
      self.failUnlessUserCanPassWorkflowTransition(
1758
                    user_id, 'cancel_action', order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1759 1760

      order.confirm()
1761
      self.assertEqual('confirmed', order.getSimulationState())
1762 1763
      self.assertUserCanViewDocument(user_id, order)
      self.failIfUserCanModifyDocument(user_id, order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1764 1765 1766 1767


  def stepViewAccessAddSalePackingList(self, sequence=None, sequence_list=None, **kw):
    module = self.portal.sale_packing_list_module
1768 1769 1770 1771 1772 1773
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, module)
      self.assertUserCanAccessDocument(user_id, module)
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.assertUserCanAddDocument(user_id, module)
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1774
      pl = module.newContent(portal_type='Sale Packing List')
1775
      self.assertUserCanViewDocument(user_id, pl)
Rafael Monnerat's avatar
Rafael Monnerat committed
1776
      self.failUnlessUserCanPassWorkflowTransition(
1777
                    user_id, 'confirm_action', pl)
Rafael Monnerat's avatar
Rafael Monnerat committed
1778 1779 1780

  def stepViewAccessPurchaseOrder(self, sequence=None, sequence_list=None, **kw):
    module = self.portal.purchase_order_module
1781 1782 1783 1784 1785 1786
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, module)
      self.assertUserCanAccessDocument(user_id, module)
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.assertUserCanAddDocument(user_id, module)
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1787
      order = module.newContent(portal_type='Purchase Order')
1788
      self.assertUserCanViewDocument(user_id, order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1789
      self.failUnlessUserCanPassWorkflowTransition(
1790
                    user_id, 'plan_action', order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1791
      self.failUnlessUserCanPassWorkflowTransition(
1792
                    user_id, 'confirm_action', order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1793
      self.failUnlessUserCanPassWorkflowTransition(
1794
                    user_id, 'cancel_action', order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1795 1796

      order.confirm()
1797
      self.assertEqual('confirmed', order.getSimulationState())
1798 1799
      self.assertUserCanViewDocument(user_id, order)
      self.failIfUserCanModifyDocument(user_id, order)
Rafael Monnerat's avatar
Rafael Monnerat committed
1800 1801 1802

  def stepPurchasePackingList(self, sequence=None, sequence_list=None, **kw):
    module = self.portal.purchase_packing_list_module
1803 1804 1805 1806 1807 1808
    for user_id in self._getUserIdList(self.all_username_list):
      self.assertUserCanViewDocument(user_id, module)
      self.assertUserCanAccessDocument(user_id, module)
    for user_id in self._getUserIdList(self.sales_and_purchase_username_list):
      self.assertUserCanAddDocument(user_id, module)
      self._loginAsUser(user_id)
Rafael Monnerat's avatar
Rafael Monnerat committed
1809
      pl = module.newContent(portal_type='Purchase Packing List')
1810
      self.assertUserCanViewDocument(user_id, pl)
Rafael Monnerat's avatar
Rafael Monnerat committed
1811
      self.failUnlessUserCanPassWorkflowTransition(
1812
                    user_id, 'confirm_action', pl)
Rafael Monnerat's avatar
Rafael Monnerat committed
1813 1814 1815 1816 1817 1818 1819 1820 1821

  # }}}
  # web
  def stepWebSiteModule(self, sequence=None, sequence_list=None, **kw):
    """Anonymous should not be able to access web_site_module."""
    web_site_module = self.portal.web_site_module
    checkPermission = self.portal.portal_membership.checkPermission
    # switch to Anonymous user
    self.logout()
1822 1823
    self.assertEqual(None, checkPermission('View', web_site_module))
    self.assertEqual(None, checkPermission('Access Contents Information',web_site_module))
Rafael Monnerat's avatar
Rafael Monnerat committed
1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
    self.assertRaises(Unauthorized,  web_site_module)

  # DMS
  def stepPortalContributionsTool(self, sequence=None, sequence_list=None, **kw):
    """
      TioLive user should be able to contribute from this tool
      (i.e. has Manage portal content).
    """
    portal_contributions = self.portal.portal_contributions
    checkPermission = self.portal.portal_membership.checkPermission
1834 1835
    for user_id in self._getUserIdList(self.all_username_list):
      self._loginAsUser(user_id)
1836
      self.assertEqual(True,  \
Rafael Monnerat's avatar
Rafael Monnerat committed
1837
                        checkPermission('Modify portal content', portal_contributions))