test.erp5.testERP5Administration.py 5.15 KB
Newer Older
1 2
##############################################################################
#
3
# Copyright (c) 2004, 2005, 2006 Nexedi SARL and Contributors.
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 32 33 34 35 36 37 38
# All Rights Reserved.
#          Sebastien Robin <seb@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################

import unittest
from Products.ERP5.tests.testInventoryAPI import InventoryAPITestCase

class TestERP5Administration(InventoryAPITestCase):
  """Test for erp5_administration business template.
  """
  def getTitle(self):
    return "ERP5Administration"

39 40 41 42 43
  def beforeTearDown(self):
    # InventoryAPITestCase.beforeTearDown clears everything.
    # We do not want this on a ZODB test.
    pass

44
  def getBusinessTemplateList(self):
45
    """
46 47
        Same list as for Inventory API and add erp5_administration
    """
48
    return InventoryAPITestCase.getBusinessTemplateList(self) + ('erp5_full_text_mroonga_catalog', 'erp5_administration')
49 50 51 52 53 54 55

  def test_01_RunCheckStockTableAlarm(self):
    """
    Create a new alarm and check that it is able to detect any divergence
    between the predicate table and zodb objects
    """
    portal = self.getPortal()
56
    sql_test = portal.erp5_sql_connection.manage_test
57
    alarm = portal.portal_alarms.check_stock
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

    def checkActiveProcess(failed):
      self.tic()
      self.assertEqual(alarm.getLastActiveProcess().ActiveProcess_sense(),
                       failed)
    def checkStock(row_count):
      alarm.activeSense()
      checkActiveProcess(1)
      alarm.solve()
      checkActiveProcess(1)
      alarm.activeSense()
      checkActiveProcess(0)
      self.assertEqual(row_count, sql_test("select count(*) from stock")[0][0])

    alarm.setAlarmNotificationMode('never')
    mvt = self._makeMovement(quantity=1.23)
74 75
    self.tic()
    alarm.activeSense()
76 77 78 79 80 81 82
    checkActiveProcess(0)

    row_count = sql_test("select count(*) from stock")[0][0]
    sql_test("update stock set quantity=5")
    checkStock(row_count)   # alarm.solve will reindex 'mvt'
    mvt.getParentValue()._delOb(mvt.getId())
    checkStock(row_count-2) # alarm.solve will unindex 'mvt'
83

Jérome Perrin's avatar
Jérome Perrin committed
84 85
  def test_check_consistency_alarm(self):
    alarm = self.portal.portal_alarms.check_consistency
86 87 88
    # Here we disable user_id so that Person_createUserPreference will not be called
    # automatically.
    person = self.portal.person_module.newContent(portal_type='Person', user_id=None)
Jérome Perrin's avatar
Jérome Perrin committed
89
    # this document will be non consistent, for PropertyTypeValidity
90
    person.title = 3
91 92
    # tic right now to make sure the person is indexed, indeed the alarm
    # could use catalog to retrieve objects to check
93
    self.tic()
94

Jérome Perrin's avatar
Jérome Perrin committed
95
    alarm.activeSense()
96
    self.tic()
97

Jérome Perrin's avatar
Jérome Perrin committed
98 99
    # some errors were detected
    self.assertTrue(alarm.sense())
100

Jérome Perrin's avatar
Jérome Perrin committed
101 102 103 104 105 106
    # this alarm has a custom report
    alarm.Alarm_viewConsistencyCheckReport()
    # which has a listbox showing all problem reported by constraints and
    # errors reported by property type validity constraint
    line_list = alarm.Alarm_viewConsistencyCheckReport.listbox.get_value(
                        'default', render_format='list')
107 108
    self.assertEqual(1, len([line for line in line_list if line.isDataLine()]))
    self.assertEqual(str(line_list[-1].getColumnProperty('getTranslatedMessage')),
Jérome Perrin's avatar
Jérome Perrin committed
109 110 111 112 113 114
      "Attribute title should be of type string but is of type <type 'int'>")

    # this alarm can solve, as long as the constraints can solve, this is the
    # case of PropertyTypeValidity
    alarm.solve()
    self.tic()
115
    self.assertEqual('3', person.title)
Jérome Perrin's avatar
Jérome Perrin committed
116

117 118 119 120 121 122 123 124 125 126 127 128 129 130
  def test_missing_category_document_constraint(self):
    person = self.portal.person_module.newContent(portal_type='Person')
    # This category does not exist
    person.setGroup('not/exist')

    # constraint reports one error
    consistency_error, = self.portal.portal_trash.newContent(
      portal_type='Missing Category Document Constraint',
      temp_object=True,
    ).checkConsistency(person)
    self.assertEquals(
      'Category group/not/exist on object %s is missing.' % person.getRelativeUrl(),
      str(consistency_error.getTranslatedMessage()))

131 132 133 134
def test_suite():
  suite = unittest.TestSuite()
  suite.addTest(unittest.makeSuite(TestERP5Administration))
  return suite