testPreferences.py 28 KB
Newer Older
Łukasz Nowak's avatar
Łukasz Nowak committed
1
# -*- coding: utf-8 -*-
2 3
##############################################################################
#
Łukasz Nowak's avatar
Łukasz Nowak committed
4
# Copyright (c) 2005-2009 Nexedi SA and Contributors. All Rights Reserved.
5
#                    Jerome Perrin <jerome@nexedi.com>
Łukasz Nowak's avatar
Łukasz Nowak committed
6
#                    Łukasz Nowak <luke@nexedi.com>
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#
# 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.
#
##############################################################################

31
import unittest
32

33
import transaction
34 35
from AccessControl.SecurityManagement import noSecurityManager
from AccessControl.SecurityManagement import getSecurityManager
36
from zExceptions import Unauthorized
37
from AccessControl.ZopeGuards import guarded_hasattr
38
from DateTime import DateTime
39

40
from Products.ERP5Type.tests.testERP5Type import PropertySheetTestCase
41
from Products.ERP5Form.PreferenceTool import Priority
42 43 44 45 46
from Products.ERP5.PropertySheet.HtmlStylePreference import HtmlStylePreference

default_large_image_height, = [pref.get('default')
                               for pref in HtmlStylePreference._properties
                               if pref['id'] == 'preferred_large_image_height']
47 48


49
class TestPreferences(PropertySheetTestCase):
Łukasz Nowak's avatar
Łukasz Nowak committed
50

51
  def getTitle(self):
52
    return "Portal Preferences"
53 54 55

  def afterSetUp(self):
    uf = self.getPortal().acl_users
56
    uf._doAddUser('manager', '', ['Manager', 'Assignor', ], [])
57
    self.login('manager')
58
    self.createPreferences()
59

60 61 62
  def beforeTearDown(self):
    portal_preferences = self.getPreferenceTool()
    portal_preferences.manage_delObjects(list(portal_preferences.objectIds()))
63
    transaction.commit()
64
    self.tic()
65

Łukasz Nowak's avatar
Łukasz Nowak committed
66
  def createPreferences(self):
67 68 69 70 71 72 73 74 75 76 77 78 79
    """ create some preferences objects  """
    portal_preferences = self.getPreferenceTool()
    ## create initial preferences
    person1 = portal_preferences.newContent(
        id='person1', portal_type='Preference')
    person2 = portal_preferences.newContent(
        id='person2', portal_type='Preference')
    group = portal_preferences.newContent(
        id='group', portal_type='Preference')
    group.setPriority(Priority.GROUP)
    site = portal_preferences.newContent(
        id='site', portal_type='Preference')
    site.setPriority(Priority.SITE)
Łukasz Nowak's avatar
Łukasz Nowak committed
80

81
    # commit transaction
82
    transaction.commit()
83
    self.getPreferenceTool().recursiveReindexObject()
84
    self.tic()
Łukasz Nowak's avatar
Łukasz Nowak committed
85

86 87 88 89 90 91 92 93 94 95
    # check preference levels are Ok
    self.assertEquals(person1.getPriority(), Priority.USER)
    self.assertEquals(person2.getPriority(), Priority.USER)
    self.assertEquals(group.getPriority(),   Priority.GROUP)
    self.assertEquals(site.getPriority(),    Priority.SITE)
    # check initial states
    self.assertEquals(person1.getPreferenceState(), 'disabled')
    self.assertEquals(person2.getPreferenceState(), 'disabled')
    self.assertEquals(group.getPreferenceState(),   'disabled')
    self.assertEquals(site.getPreferenceState(),    'disabled')
Łukasz Nowak's avatar
Łukasz Nowak committed
96

97 98 99 100 101
  def test_PreferenceToolTitle(self):
    """Tests that the title of the preference tool is correct.
    """
    self.assertEquals('Preferences', self.getPreferenceTool().Title())

Łukasz Nowak's avatar
Łukasz Nowak committed
102
  def test_AllowedContentTypes(self):
103 104 105 106
    """Tests Preference can be added in Preference Tool.
    """
    self.failUnless('Preference' in [x.getId() for x in
           self.getPortal().portal_preferences.allowedContentTypes()])
107 108
    self.failUnless('System Preference' in [x.getId() for x in
           self.getPortal().portal_preferences.allowedContentTypes()])
109

Łukasz Nowak's avatar
Łukasz Nowak committed
110
  def test_EnablePreferences(self):
111 112 113 114 115 116
    """ tests preference workflow """
    portal_workflow = self.getWorkflowTool()
    person1 = self.getPreferenceTool()['person1']
    person2 = self.getPreferenceTool()['person2']
    group = self.getPreferenceTool()['group']
    site = self.getPreferenceTool()['site']
Łukasz Nowak's avatar
Łukasz Nowak committed
117

118
    self.assertEqual(None, self.getPreferenceTool().getActivePreference())
119 120
    self.assertEqual(None,
        self.getPreferenceTool().getActiveSystemPreference())
121

122 123
    person1.portal_workflow.doActionFor(
       person1, 'enable_action', wf_id='preference_workflow')
124
    transaction.commit()
125
    self.assertEquals(person1.getPreferenceState(), 'enabled')
Łukasz Nowak's avatar
Łukasz Nowak committed
126

127
    self.assertEqual( person1, self.getPreferenceTool().getActivePreference())
128 129
    self.assertEqual(None,
        self.getPreferenceTool().getActiveSystemPreference())
130

131 132 133
    portal_workflow.doActionFor(
       site, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(person1.getPreferenceState(), 'enabled')
134
    self.assertEquals(site.getPreferenceState(),    'global')
135

136
    self.assertEqual(person1, self.getPreferenceTool().getActivePreference())
137 138
    self.assertEqual(None,
        self.getPreferenceTool().getActiveSystemPreference())
139

140 141 142 143
    portal_workflow.doActionFor(
       group, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(person1.getPreferenceState(), 'enabled')
    self.assertEquals(group.getPreferenceState(),   'enabled')
144
    self.assertEquals(site.getPreferenceState(),    'global')
Łukasz Nowak's avatar
Łukasz Nowak committed
145

146
    self.assertEqual(person1, self.getPreferenceTool().getActivePreference())
147 148
    self.assertEqual(None,
        self.getPreferenceTool().getActiveSystemPreference())
149

150 151
    portal_workflow.doActionFor(
       person2, 'enable_action', wf_id='preference_workflow')
152
    transaction.commit()
153
    self.assertEqual(person2, self.getPreferenceTool().getActivePreference())
154 155
    self.assertEqual(None,
        self.getPreferenceTool().getActiveSystemPreference())
156 157 158 159
    self.assertEquals(person2.getPreferenceState(), 'enabled')
    # enabling a preference disable all other of the same level
    self.assertEquals(person1.getPreferenceState(), 'disabled')
    self.assertEquals(group.getPreferenceState(),   'enabled')
160
    self.assertEquals(site.getPreferenceState(),    'global')
161

Łukasz Nowak's avatar
Łukasz Nowak committed
162
  def test_GetPreference(self):
163 164 165 166 167 168
    """ checks that getPreference returns the good preferred value"""
    portal_workflow = self.getWorkflowTool()
    pref_tool = self.getPreferenceTool()
    person1 = self.getPreferenceTool()['person1']
    group = self.getPreferenceTool()['group']
    site = self.getPreferenceTool()['site']
Łukasz Nowak's avatar
Łukasz Nowak committed
169

170 171 172 173 174 175 176 177
    portal_workflow.doActionFor(
       person1, 'enable_action', wf_id='preference_workflow')
    portal_workflow.doActionFor(
       group, 'enable_action', wf_id='preference_workflow')
    portal_workflow.doActionFor(
       site, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(person1.getPreferenceState(), 'enabled')
    self.assertEquals(group.getPreferenceState(),   'enabled')
178
    self.assertEquals(site.getPreferenceState(),    'global')
179
    person1.setPreferredAccountingTransactionSimulationState([])
180 181
    self.assertEquals(
      person1.getPreferredAccountingTransactionSimulationState(), None)
182
    group.setPreferredAccountingTransactionSimulationState([])
183 184
    self.assertEquals(
      group.getPreferredAccountingTransactionSimulationState(), None)
185
    site.setPreferredAccountingTransactionSimulationState([])
186 187
    self.assertEquals(
      site.getPreferredAccountingTransactionSimulationState(), None)
188

189
    self.assertEquals(len(pref_tool.getPreference(
190
      'preferred_accounting_transaction_simulation_state_list')), 0)
Łukasz Nowak's avatar
Łukasz Nowak committed
191

192 193 194
    site.edit(
      preferred_accounting_transaction_simulation_state_list=
      ['stopped', 'delivered'])
195
    self.assertEquals(list(pref_tool.getPreference(
196
      'preferred_accounting_transaction_simulation_state_list')),
197
      list(site.getPreferredAccountingTransactionSimulationStateList()))
Łukasz Nowak's avatar
Łukasz Nowak committed
198

199 200 201 202 203 204 205
    # getPreference on the tool has the same behaviour as getProperty
    # on the preference (unless property is unset on this pref)
    for prop in ['preferred_accounting_transaction_simulation_state',
            'preferred_accounting_transaction_simulation_state_list']:

      self.assertEquals(pref_tool.getPreference(prop),
                        site.getProperty(prop))
Łukasz Nowak's avatar
Łukasz Nowak committed
206

207 208
    group.edit(
      preferred_accounting_transaction_simulation_state_list=['draft'])
209
    self.assertEquals(list(pref_tool.getPreference(
210
      'preferred_accounting_transaction_simulation_state_list')),
211
      list(group.getPreferredAccountingTransactionSimulationStateList()))
Łukasz Nowak's avatar
Łukasz Nowak committed
212

213
    person1.edit(preferred_accounting_transaction_simulation_state_list=
214 215
              ['cancelled'])
    self.assertEquals(list(pref_tool.getPreference(
216
      'preferred_accounting_transaction_simulation_state_list')),
217 218 219 220
      list(person1.getPreferredAccountingTransactionSimulationStateList()))
    # disable person -> group is selected
    self.getWorkflowTool().doActionFor(person1,
            'disable_action', wf_id='preference_workflow')
221
    transaction.commit()
222
    self.assertEquals(list(pref_tool.getPreference(
223
      'preferred_accounting_transaction_simulation_state_list')),
224 225
      list(group.getPreferredAccountingTransactionSimulationStateList()))

226 227 228 229
    self.assertEquals('default', pref_tool.getPreference(
                                        'this_does_not_exists', 'default'))


Łukasz Nowak's avatar
Łukasz Nowak committed
230
  def test_GetAttr(self):
231 232 233 234 235 236 237 238 239 240 241 242 243
    """ checks that preference methods can be called directly
      on portal_preferences """
    portal_workflow = self.getWorkflowTool()
    pref_tool = self.getPreferenceTool()
    person1 = self.getPreferenceTool()['person1']
    group = self.getPreferenceTool()['group']
    site = self.getPreferenceTool()['site']
    self.assertEquals(person1.getPreferenceState(), 'disabled')
    portal_workflow.doActionFor(
       group, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(group.getPreferenceState(),    'enabled')
    portal_workflow.doActionFor(
       site, 'enable_action', wf_id='preference_workflow')
244
    self.assertEquals(site.getPreferenceState(),     'global')
245
    group.setPreferredAccountingTransactionSimulationStateList(['cancelled'])
Łukasz Nowak's avatar
Łukasz Nowak committed
246

247 248 249 250 251 252 253
    self.assertNotEquals( None,
      pref_tool.getPreferredAccountingTransactionSimulationStateList())
    self.assertNotEquals( [],
      list(pref_tool.getPreferredAccountingTransactionSimulationStateList()))
    self.assertEquals(
      list(pref_tool.getPreferredAccountingTransactionSimulationStateList()),
      list(pref_tool.getPreference(
254
         'preferred_accounting_transaction_simulation_state_list')))
255 256 257
    # standards attributes must not be looked up on Preferences
    self.assertNotEquals(pref_tool.getTitleOrId(), group.getTitleOrId())
    self.assertNotEquals(pref_tool.objectValues(), group.objectValues())
258
    self.assertNotEquals(pref_tool.getParentValue(), group.getParentValue())
259 260
    try :
      pref_tool.getPreferredNotExistingPreference()
261
      self.fail('Attribute error should be raised for dummy methods')
262 263
    except AttributeError :
      pass
Łukasz Nowak's avatar
Łukasz Nowak committed
264 265 266

  def test_SetPreference(self):
    """ check setting a preference modifies
267 268 269 270
     the first enabled user preference """
    portal_workflow = self.getWorkflowTool()
    pref_tool = self.getPreferenceTool()
    person1 = self.getPreferenceTool()['person1']
Łukasz Nowak's avatar
Łukasz Nowak committed
271

272 273 274 275 276 277 278 279 280 281 282 283 284 285
    portal_workflow.doActionFor(
       person1, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(person1.getPreferenceState(),    'enabled')
    person1.setPreferredAccountingTransactionAtDate(DateTime(2005, 01, 01))
    pref_tool.setPreference(
      'preferred_accounting_transaction_at_date', DateTime(2004, 12, 31))
    self.tic()
    self.assertEquals(
      pref_tool.getPreferredAccountingTransactionAtDate(),
      DateTime(2004, 12, 31))
    self.assertEquals(
      person1.getPreferredAccountingTransactionAtDate(),
      DateTime(2004, 12, 31))

Łukasz Nowak's avatar
Łukasz Nowak committed
286
  def test_UserIndependance(self):
287 288 289 290 291
    """ check that the preferences are related to the user. """
    portal_workflow = self.getWorkflowTool()
    portal_preferences = self.getPreferenceTool()
    # create 2 users: user_a and user_b
    uf = self.getPortal().acl_users
292 293
    uf._doAddUser('user_a', '', ['Member', ], [])
    uf._doAddUser('user_b', '', ['Member', ], [])
Łukasz Nowak's avatar
Łukasz Nowak committed
294

295
    self.login('user_a')
Łukasz Nowak's avatar
Łukasz Nowak committed
296

297 298 299 300 301
    # create 2 prefs as user_a
    user_a_1 = portal_preferences.newContent(
        id='user_a_1', portal_type='Preference')
    user_a_2 = portal_preferences.newContent(
        id='user_a_2', portal_type='Preference')
302
    transaction.commit(); self.tic()
303 304 305 306 307 308

    # enable a pref
    portal_workflow.doActionFor(
       user_a_1, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(user_a_1.getPreferenceState(), 'enabled')
    self.assertEquals(user_a_2.getPreferenceState(), 'disabled')
Łukasz Nowak's avatar
Łukasz Nowak committed
309

310
    self.login('user_b')
Łukasz Nowak's avatar
Łukasz Nowak committed
311

312 313 314 315
    # create a pref for user_b
    user_b_1 = portal_preferences.newContent(
        id='user_b_1', portal_type='Preference')
    user_b_1.setPreferredAccountingTransactionAtDate(DateTime(2002, 02, 02))
316
    transaction.commit(); self.tic()
Łukasz Nowak's avatar
Łukasz Nowak committed
317

318 319 320 321
    # enable this preference
    portal_workflow.doActionFor(
       user_b_1, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(user_b_1.getPreferenceState(), 'enabled')
Łukasz Nowak's avatar
Łukasz Nowak committed
322

323 324 325
    # check user_a's preference is still enabled
    self.assertEquals(user_a_1.getPreferenceState(), 'enabled')
    self.assertEquals(user_a_2.getPreferenceState(), 'disabled')
Łukasz Nowak's avatar
Łukasz Nowak committed
326

327 328
    # Checks that a manager preference doesn't disable any other user
    # preferences
329
    self.login('manager')
Łukasz Nowak's avatar
Łukasz Nowak committed
330

331 332
    self.assert_('Manager' in
      getSecurityManager().getUser().getRolesInContext(portal_preferences))
Łukasz Nowak's avatar
Łukasz Nowak committed
333

334 335 336 337 338
    # create a pref for manager
    manager_pref = portal_preferences.newContent(
        id='manager_pref', portal_type='Preference')
    manager_pref.setPreferredAccountingTransactionAtDate(
                                DateTime(2012, 12, 12))
339
    transaction.commit(); self.tic()
340 341 342 343
    # enable this preference
    portal_workflow.doActionFor(
       manager_pref, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(manager_pref.getPreferenceState(), 'enabled')
344
    transaction.commit(); self.tic()
Łukasz Nowak's avatar
Łukasz Nowak committed
345

346 347 348 349
    # check users preferences are still enabled
    self.assertEquals(user_a_1.getPreferenceState(), 'enabled')
    self.assertEquals(user_b_1.getPreferenceState(), 'enabled')
    self.assertEquals(user_a_2.getPreferenceState(), 'disabled')
350

351 352 353 354 355 356 357 358 359 360 361
    # A user with Manager and Owner can view all preferences, because this user
    # is Manager and Owner, but for Manager, we have an exception, only
    # preferences actually owned by the user are taken into account.
    uf._doAddUser('manager_and_owner', '', ['Manager', 'Owner'], [])
    self.login('manager_and_owner')
    self.assert_('Owner' in
      getSecurityManager().getUser().getRolesInContext(manager_pref))
    self.assertEquals(None,
        portal_preferences.getPreferredAccountingTransactionAtDate())


362 363 364 365 366 367 368 369
  def test_GlobalPreference(self):
    # globally enabled preference are preference for anonymous users.
    ptool = self.getPreferenceTool()
    ptool.site.setPreferredAccountingTransactionSimulationStateList(
                          ['this_is_visible_by_anonymous'])
    self.getPortal().portal_workflow.doActionFor(
                  ptool.site, 'enable_action', wf_id='preference_workflow')
    self.assertEquals('global', ptool.site.getPreferenceState())
370
    transaction.commit()
371 372 373 374
    self.tic()
    noSecurityManager()
    self.assertEquals(['this_is_visible_by_anonymous'],
        ptool.getPreferredAccountingTransactionSimulationStateList())
375 376 377 378 379 380 381 382 383 384 385

  def test_GetDefault(self):
    portal_workflow = self.getWorkflowTool()
    pref_tool = self.getPreferenceTool()
    site = self.getPreferenceTool()['site']
    portal_workflow.doActionFor(
       site, 'enable_action', wf_id='preference_workflow')
    self.assertEquals(site.getPreferenceState(),    'global')

    method = pref_tool.getPreferredAccountingTransactionSimulationState
    state = method()
386
    self.assertEquals(state, [])
387 388 389
    state = method('default')
    self.assertEquals(state, 'default')

390 391
    method = lambda *args: pref_tool.getPreference('preferred_accounting_transaction_simulation_state', *args)
    state = method()
392
    self.assertEquals(state, [])
393 394 395
    state = method('default')
    self.assertEquals(state, 'default')

396 397
    method = pref_tool.getPreferredAccountingTransactionSimulationStateList
    state_list = method()
398
    self.assertEquals(state_list, [])
399
    state_list = method(('default',))
400 401 402
    # Initially, tuples were always casted to lists. This is not the case
    # anymore when preference_tool.getXxxList returns the default value.
    self.assertEquals(state_list, ('default',))
Łukasz Nowak's avatar
Łukasz Nowak committed
403

404 405
    method = lambda *args: pref_tool.getPreference('preferred_accounting_transaction_simulation_state_list', *args)
    state_list = method()
406
    self.assertEquals(state_list, [])
407 408 409
    state_list = method(('default',))
    self.assertEquals(state_list, ('default',))

410 411
  def test_Permissions(self):
    # create a new site preference for later
412 413
    preference_tool = self.portal.portal_preferences
    site_pref = preference_tool.newContent(
414 415 416 417
                          portal_type='Preference',
                          priority=Priority.SITE)
    self.portal.portal_workflow.doActionFor(site_pref, 'enable_action')
    self.assertEquals(site_pref.getPreferenceState(), 'global')
Łukasz Nowak's avatar
Łukasz Nowak committed
418

419 420 421 422
    # Members can add new preferences
    uf = self.getPortal().acl_users
    uf._doAddUser('member', '', ['Member', ], [])
    member = uf.getUserById('member').__of__(uf)
423
    self.login('member')
424
    user_pref = preference_tool.newContent(portal_type='Preference')
425 426 427

    # Members can copy & paste existing preferences
    user_pref.Base_createCloneDocument()
428 429 430 431 432 433
    # note that copy & pasting a site preference reset the priority to USER
    # preference.
    cp_data = preference_tool.manage_copyObjects(ids=[site_pref.getId()])
    copy_id = preference_tool.manage_pasteObjects(cp_data)[0]['new_id']
    self.assertEquals(Priority.USER, preference_tool[copy_id].getPriority())

434 435 436 437 438 439 440
    # Globally enabled preferences can be viewed by Members
    self.assertTrue(member.has_permission('View', site_pref))

    # Member does not have Manage properties on their own preferences, 
    # otherwise the "Metadata" tab is shown
    self.assertFalse(member.has_permission(
                         'Manage properties', user_pref))
441

Łukasz Nowak's avatar
Łukasz Nowak committed
442

443
  def test_SystemPreference(self):
444 445 446 447
    # We want to test a property with a default value defined
    self.assertTrue(default_large_image_height > 0)
    large_image_height = default_large_image_height + 1

448
    preference_tool = self.portal.portal_preferences
449
    system_pref = preference_tool.newContent(
450
                          portal_type='System Preference',
451
                          preferred_ooodoc_server_address='127.0.0.1',
452
                          priority=Priority.SITE)
453
    # check not taken into account if not enabled
454 455 456 457 458 459
    self.assertEqual(None,
                     preference_tool.getPreferredOoodocServerAddress())
    self.assertEqual('localhost',
                     preference_tool.getPreferredOoodocServerAddress('localhost'))
    self.assertEqual(default_large_image_height,
                     preference_tool.getPreferredLargeImageHeight())
460
    # enable it and check preference is returned
461 462
    self.portal.portal_workflow.doActionFor(system_pref, 'enable_action')
    self.assertEqual(system_pref.getPreferenceState(), 'global')
463
    transaction.commit()
464
    self.tic()
465 466 467 468 469 470
    self.assertEqual('127.0.0.1',
                     preference_tool.getPreferredOoodocServerAddress())
    self.assertEqual('127.0.0.1',
                     preference_tool.getPreferredOoodocServerAddress('localhost'))
    self.assertEqual(default_large_image_height,
                     preference_tool.getPreferredLargeImageHeight())
471 472 473 474
    # Default value passed by parameter has priority over the default in the
    # property sheet.
    self.assertEqual(large_image_height,
                     preference_tool.getPreferredLargeImageHeight(large_image_height))
Łukasz Nowak's avatar
Łukasz Nowak committed
475

476 477 478
    # Members can't add new system preferences
    uf = self.getPortal().acl_users
    uf._doAddUser('member', '', ['Member', ], [])
479
    self.login('member')
480 481
    self.assertRaises(Unauthorized, preference_tool.newContent, portal_type='System Preference')
    # But they can see others
482
    system_pref.view()
483
    # check accessors works
484
    system_pref.setPreferredOoodocServerAddress('1.2.3.4')
485
    transaction.commit()
486
    self.tic()
487 488 489 490 491 492
    self.assertEqual('1.2.3.4',
                     preference_tool.getPreferredOoodocServerAddress())
    self.assertEqual('1.2.3.4',
                     preference_tool.getPreferredOoodocServerAddress('localhost'))
    self.assertEqual(default_large_image_height,
                     preference_tool.getPreferredLargeImageHeight())
493

494
    # create a user pref and check it doesn't outranks the system one if
495 496 497 498
    # they both defined same pref
    user_pref = preference_tool.newContent(
                          portal_type='Preference',
                          priority=Priority.USER)
499
    user_pref.setPreferredLargeImageHeight(large_image_height)
500
    self.portal.portal_workflow.doActionFor(user_pref, 'enable_action')
501
    self.assertEqual(user_pref.getPreferenceState(), 'enabled')
502
    transaction.commit()
503
    self.tic()
504 505 506 507
    self.assertEqual('1.2.3.4',
                     preference_tool.getPreferredOoodocServerAddress('localhost'))
    self.assertEqual(large_image_height,
                     preference_tool.getPreferredLargeImageHeight())
508 509
    self.assertEqual(large_image_height,
                     preference_tool.getPreferredLargeImageHeight(0))
510 511 512

    # check a user can't edit preference which are marked for manager
    self.assertRaises(Unauthorized, user_pref.edit, preferred_ooodoc_server_address="localhost")
513 514 515
    # even if there is System Preference enabled getActivePreference shall return
    # user preference
    self.assertEqual(user_pref, preference_tool.getActivePreference())
516
    self.assertEqual(system_pref, preference_tool.getActiveSystemPreference())
517

518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
  def test_boolean_accessor(self):
    self._addPropertySheet('Preference', 'DummyPreference',
        '''class DummyPreference:
             _properties= ( {'id': 'dummy',
                             'preference': True,
                             'type': 'boolean',},)''')
    portal_preferences = self.portal.portal_preferences
    self.assertFalse(portal_preferences.getDummy())
    self.assertFalse(portal_preferences.isDummy())

    preference = portal_preferences.newContent(portal_type='Preference',
                                               dummy=True)
    preference.enable()
    transaction.commit()
    self.tic()

    self.assertTrue(portal_preferences.getDummy())
    self.assertTrue(portal_preferences.isDummy())
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553

  def test_property_sheet_security_on_permission(self):
    """ Added a test to make sure permissions are used into portal
        preference level. """
    write_permission = 'Modify portal content'
    read_permission = 'Manage portal'
    self._addPropertySheet('Preference', 'DummyPreference',
        '''class DummyPreference:
             _properties= ( {'id': 'preferred_toto',
                             'write_permission' : 'Modify portal content',
                             'read_permission'  : 'Manage portal',
                             'preference': 1,
                             'type': 'string',},)''')

    obj = self.portal.portal_preferences.newContent(portal_type='Preference')
    obj.enable()
    transaction.commit()
    self.tic()
554
    
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
    self.assertTrue(guarded_hasattr(obj, 'setPreferredToto'))
    obj.setPreferredToto("A TEST")
    self.assertTrue(guarded_hasattr(obj, 'getPreferredToto'))

    obj.manage_permission(write_permission, [], 0)
    self.assertFalse(guarded_hasattr(obj, 'setPreferredToto'))
    self.assertTrue(guarded_hasattr(obj, 'getPreferredToto'))

    obj.manage_permission(write_permission, ['Manager'], 1)
    obj.manage_permission(read_permission, [], 0)
    self.assertTrue(guarded_hasattr(obj, 'setPreferredToto'))
    self.assertFalse(guarded_hasattr(obj, 'getPreferredToto'))

    obj.manage_permission(read_permission, ['Manager'], 1)

    transaction.commit()
    self.tic()

    preference_tool = self.portal.portal_preferences
    self.assertTrue(guarded_hasattr(preference_tool, 'getPreferredToto'))
    self.assertEquals("A TEST", preference_tool.getPreferredToto())

    preference_tool.manage_permission(write_permission, [], 0)
    self.assertTrue(guarded_hasattr(preference_tool, 'getPreferredToto'))

    preference_tool.manage_permission(write_permission, ['Manager'], 1)
    preference_tool.manage_permission(read_permission, [], 0)
    obj.manage_permission(read_permission, [], 0)
    self.assertFalse(guarded_hasattr(preference_tool, 'getPreferredToto'))

    preference_tool.manage_permission(read_permission, ['Manager'], 1)
586

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610
  def test_system_preference_value_prefererred(self):
    default_preference_string = 'Default Name'
    normal_preference_string = 'Normal Preference'
    system_preference_string = 'System Preference'
    self._addPropertySheet('Preference', 'DummySystemPreference',
        '''class DummySystemPreference:
             _properties= ( {'id': 'dummystring',
                             'default': '%s',
                             'preference': True,
                             'type': 'string',},)''' % default_preference_string)
    portal_preferences = self.portal.portal_preferences
    self.assertEqual(default_preference_string,
        portal_preferences.getDummystring())

    preference = portal_preferences.newContent(portal_type='Preference',
                                               dummystring=normal_preference_string,
                                               priority=Priority.SITE)
    preference.enable()
    transaction.commit()
    self.tic()

    self.assertEqual(normal_preference_string,
        portal_preferences.getDummystring())

Łukasz Nowak's avatar
Łukasz Nowak committed
611
    system_preference = portal_preferences.newContent(portal_type='System Preference',
612 613 614 615 616 617 618 619
                                               dummystring=system_preference_string)
    system_preference.enable()
    transaction.commit()
    self.tic()

    self.assertEqual(system_preference_string,
        portal_preferences.getDummystring())

620
  def test_system_preference_value_prefererred_clear_cache_disabled(self):
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
    default_preference_string = 'Default Name'
    normal_preference_string = 'Normal Preference'
    system_preference_string = 'System Preference'
    self._addPropertySheet('Preference', 'DummySystemPreference',
        '''class DummySystemPreference:
             _properties= ( {'id': 'dummystring',
                             'default': '%s',
                             'preference': True,
                             'type': 'string',},)''' % default_preference_string)
    portal_preferences = self.portal.portal_preferences
    self.assertEqual(default_preference_string,
        portal_preferences.getDummystring())

    preference = portal_preferences.newContent(portal_type='Preference',
                                               dummystring=normal_preference_string,
                                               priority=Priority.SITE)
    preference.enable()
    transaction.commit()
    self.tic()

    self.assertEqual(normal_preference_string,
        portal_preferences.getDummystring())

644 645 646 647
    # simulate situation when _clearCache does nothing, for example in case
    # if memcached or any other non-deleteable cache is used
    from Products.ERP5Form.Document.Preference import Preference
    Preference._clearCache = lambda *args,**kwargs: None
648 649 650 651 652 653 654 655
    system_preference = portal_preferences.newContent(portal_type='System Preference',
                                               dummystring=system_preference_string)
    system_preference.enable()
    transaction.commit()
    self.tic()

    self.assertEqual(system_preference_string,
        portal_preferences.getDummystring())
656

657 658 659 660
def test_suite():
  suite = unittest.TestSuite()
  suite.addTest(unittest.makeSuite(TestPreferences))
  return suite