[Erp5-report] r39489 arnaud.fontaine - /erp5/trunk/products/ERP5Type/tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Oct 25 09:51:24 CEST 2010


Author: arnaud.fontaine
Date: Mon Oct 25 09:51:19 2010
New Revision: 39489

URL: http://svn.erp5.org?rev=39489&view=rev
Log:
Add tests for ZODB Property Sheets and rename test file properly


Added:
    erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py
      - copied, changed from r39487, erp5/trunk/products/ERP5Type/tests/testMigration.py
Removed:
    erp5/trunk/products/ERP5Type/tests/testMigration.py

Copied: erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py (from r39487, erp5/trunk/products/ERP5Type/tests/testMigration.py)
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py?p2=erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py&p1=erp5/trunk/products/ERP5Type/tests/testMigration.py&r1=39487&r2=39489&rev=39489&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testMigration.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py [utf8] Mon Oct 25 09:51:19 2010
@@ -1,12 +1,42 @@
+##############################################################################
+#
+# Copyright (c) 2010 Nexedi SARL and Contributors. All Rights Reserved.
+#                    Nicolas Dumazet <nicolas.dumazet at nexedi.com>
+#                    Arnaud Fontaine <arnaud.fontaine at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility 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
+# guarantees 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., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+##############################################################################
+
 import os, shutil
 import unittest
 
 import transaction
 
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.backportUnittest import skip
 
-class TestNewStyleClasses(ERP5TypeTestCase):
-
+class TestPortalTypeClass(ERP5TypeTestCase):
   def getBusinessTemplateList(self):
     return 'erp5_base',
 
@@ -29,7 +59,6 @@ class TestNewStyleClasses(ERP5TypeTestCa
       os.mkdir(import_path)
     shutil.copy(zexp_path, import_path)
 
-
     person_module = self.getPortal().person_module
     person_module.manage_importObject(file_name)
 
@@ -101,6 +130,7 @@ class TestNewStyleClasses(ERP5TypeTestCa
     finally:
       # reset the type
       person_type.setTypeMixin(None)
+      transaction.commit()
 
   def testChangeDocument(self):
     """
@@ -125,8 +155,531 @@ class TestNewStyleClasses(ERP5TypeTestCa
     finally:
       # reset the type
       person_type.setTypeClass('Person')
+      transaction.commit()
+
+class TestZodbPropertySheet(ERP5TypeTestCase):
+  """
+  XXX: WORK IN PROGRESS
+  """
+  def getBusinessTemplateList(self):
+    return 'erp5_base',
+
+  def _newStandardProperty(self, operation_type):
+    """
+    Create a new Standard Property within test Property Sheet
+    """
+    return self.test_property_sheet.newContent(
+      portal_type='Standard Property',
+      reference='test_standard_property_' + operation_type,
+      elementary_type='string')
+
+  def _newAcquiredProperty(self, operation_type):
+    """
+    Create a new Acquired Property within test Property Sheet
+    """
+    return self.test_property_sheet.newContent(
+      portal_type='Acquired Property',
+      reference='test_acquired_property_' + operation_type,
+      elementary_type='content',
+      storage_id='default_address',
+      acquisition_mask_value=True,
+      acquisition_base_category=('subordination',),
+      acquisition_portal_type="python: ('Organisation',)",
+      acquisition_accessor_id='getDefaultAddressValue',
+      content_portal_type="python: ('Address',)",
+      content_acquired_property_id=('street_address',))
+
+  def _newCategoryTree(self, base_category_id, operation_type):
+    """
+    Create new categories for the tests (for the category accessors to
+    be created, it's necessary that the category properties referenced
+    in the web-based Property Sheet exist)
+    """
+    new_base_category = self.getPortal().portal_categories.newContent(
+      id=base_category_id, portal_type='Base Category')
+
+    # Create a dummy sub-category
+    new_base_category.newContent(reference='sub_category',
+                                 portal_type='Category')
+
+    if operation_type == 'change':
+      self.getPortal().portal_categories.newContent(
+        id=base_category_id + '_renamed',
+        portal_type='Base Category')
+
+  def _newCategoryProperty(self, operation_type):
+    """
+    Create a new Category Property within test Property Sheet
+    """
+    category_id = 'test_category_property_' + operation_type
+
+    self._newCategoryTree(category_id, operation_type)
+
+    return self.test_property_sheet.newContent(
+      reference=category_id,
+      portal_type='Category Property')
+
+  def _newDynamicCategoryProperty(self, operation_type):
+    """
+    Create a new Dynamic Category Property within test Property Sheet
+    """
+    category_id = 'test_dynamic_category_property_' + operation_type
+
+    self._newCategoryTree(category_id, operation_type)
+
+    expression = "python: ('%s',)" % category_id
+
+    return self.test_property_sheet.newContent(
+      portal_type='Dynamic Category Property',
+      category_expression=expression,
+      reference=category_id)
+
+  def _newPropertyExistenceConstraint(self):
+    """
+    Create a new Property Existence Constraint within test Property
+    Sheet
+    """
+    return self.test_property_sheet.newContent(
+      reference='test_property_existence_constraint',
+      portal_type='Property Existence Constraint',
+      constraint_property_list=('test_standard_property_constraint',))
+
+  def _newCategoryExistenceConstraint(self):
+    """
+    Create a new Category Existence Constraint within test Property
+    Sheet
+    """
+    self._newCategoryProperty('constraint')
+
+    return self.test_property_sheet.newContent(
+      reference='test_category_existence_constraint',
+      portal_type='Category Existence Constraint',
+      constraint_base_category_list=('test_category_property_constraint',))
+      # XXX
+      # constraint_portal_type=('TODO',))
+
+  def afterSetUp(self):
+    """
+    Create a test Property Sheet (and its properties)
+    """
+    portal = self.getPortal()
+
+    # Create the test Property Sheet
+    try:
+      self.test_property_sheet = portal.portal_property_sheets.TestMigration
+      do_create = False
+    except AttributeError:
+      self.test_property_sheet = \
+        portal.portal_property_sheets.newContent(id='TestMigration',
+                                                 portal_type='Property Sheet')
+      do_create = True
+
+    if do_create:
+      # Create a new Standard Property to test constraints and a
+      # Property Existence Constraint in the test Property Sheet
+      self._newStandardProperty('constraint')
+      self._newPropertyExistenceConstraint()
+
+      # Create a Category Existence Constraint in the test Property
+      # Sheet
+      self._newCategoryExistenceConstraint()
+
+      # Create all the test Properties
+      for op in ('change', 'delete', 'assign'):
+        self._newStandardProperty(op)
+        self._newAcquiredProperty(op)
+        self._newCategoryProperty(op)
+        self._newDynamicCategoryProperty(op)
+
+    # Bind all test properties to this instance, so they can be
+    # accessed easily in further tests
+    for prop in self.test_property_sheet.contentValues():
+      setattr(self, prop.getReference(), prop)
+
+    # Create a Portal Type for the tests, this is necessary, otherwise
+    # there will be no accessor holder generated
+    try:
+      self.test_portal_type = getattr(portal.portal_types, 'Test Migration')
+    except AttributeError:
+      self.test_portal_type = portal.portal_types.newContent(
+        id='Test Migration',
+        portal_type='Base Type',
+        type_class='Folder',
+        # XXX: to be renamed to type_property_sheet_list as soon as
+        #      the migration has been finished
+        type_zodb_property_sheet_list=('TestMigration',),
+        type_base_category_list=('test_category_existence_constraint',))
+
+    # Create a test module, meaningful to force generation of
+    # TestMigration accessor holders and check the constraints
+    try:
+      self.test_module = getattr(portal, 'Test Migration')
+    except AttributeError:
+      self.test_module = portal.newContent(id='Test Migration',
+                                           portal_type='Test Migration')
+
+    # Make sure there is no pending transaction which could interfere
+    # with the tests
+    transaction.commit()
+    self.tic()
+
+    # Ensure that erp5.acessor_holder is empty
+    from Products.ERP5Type.Dynamic.portaltypeclass import \
+        synchronizeDynamicModules
+
+    synchronizeDynamicModules(portal, force=True)
+
+    # Make sure there is no pending transaction which could interfere
+    # with the tests
+    transaction.commit()
+    self.tic()
+
+  def _forceTestAccessorHolderGeneration(self):
+    """
+    Force generation of TestMigration accessor holder by accessing any
+    accessor, which will run the interaction workflow trigger, on
+    commit at the latest
+    """
+    self.test_module.getId()
+    transaction.commit()
+
+  def assertHasAttribute(self, obj, attribute, msg=None):
+    self.failIfEqual(None, getattr(obj, attribute, None),
+                     msg or '%s: no attribute %s' % (obj.__name__,
+                                                     attribute))
+
+  def failIfHasAttribute(self, obj, attribute, msg=None):
+    self.assertEquals(None, getattr(obj, attribute, None),
+                      msg or '%s: attribute %s present' % (obj.__name__,
+                                                           attribute))
+
+  def testAssignUnassignZodbPropertySheet(self):
+    """
+    From an existing portal type, assign ZODB Property Sheets and
+    check that
+    """
+    import erp5
+
+    portal = self.getPortal()
+    person_type = portal.portal_types.Person
+
+    self.failIf('TestMigration' in \
+                (person_type.getTypeZodbPropertySheetList() or []))
+
+    new_person = None
+    try:
+      # Assign ZODB test Property Sheet to the existing Person type
+      # and create a new Person, this should generate the test
+      # accessor holder which should be in the Person type inheritance
+      person_type.setTypeZodbPropertySheetList('TestMigration')
+
+      transaction.commit()
+
+      self.assertTrue('TestMigration' in \
+                      person_type.getTypeZodbPropertySheetList())
+
+      # The accessor holder will be generated once the new Person will
+      # be created as Person type has test Property Sheet
+      self.failIfHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+
+      new_person = portal.person_module.newContent(
+        id='testAssignZodbPropertySheet', portal_type='Person')
+
+      self.assertHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+
+      self.assertTrue(erp5.zodb_accessor_holder.TestMigration in \
+                      erp5.portal_type.Person.mro())
+
+      # Check that the accessors have been properly created for all
+      # the properties of the test Property Sheet and set a new value
+      # to make sure that everything is fine
+      #
+      # Standard Property
+      self.assertHasAttribute(new_person, 'setTestStandardPropertyAssign')
+
+      new_person.setTestStandardPropertyAssign('value')
+
+      self.assertEquals(new_person.getTestStandardPropertyAssign(), 'value')
+
+      # Acquired Property
+      self.assertHasAttribute(
+        new_person, 'setDefaultTestAcquiredPropertyAssignStreetAddress')
+
+      new_person.setDefaultTestAcquiredPropertyAssignStreetAddress('value')
+
+      self.assertHasAttribute(new_person, 'default_address')
+      self.assertHasAttribute(new_person.default_address, 'getDefaultAddress')
+      self.failIfEqual(None, new_person.default_address.getDefaultAddress())
+
+      self.assertEquals(
+        new_person.getDefaultTestAcquiredPropertyAssignStreetAddress(),
+        'value')
+
+      # Category Property
+      self.assertHasAttribute(new_person, 'setTestCategoryPropertyAssign')
+
+      new_person.setTestCategoryPropertyAssign('sub_category')
+
+      self.assertEquals(new_person.getTestCategoryPropertyAssign(),
+                        'sub_category')
+
+      # Dynamic Category Property
+      self.assertHasAttribute(new_person,
+                              'setTestDynamicCategoryPropertyAssign')
+
+      new_person.setTestDynamicCategoryPropertyAssign('sub_category')
+
+      self.assertEquals(new_person.getTestDynamicCategoryPropertyAssign(),
+                        'sub_category')
+
+    finally:
+      # Perform a commit here because Workflow interactions keeps a
+      # TransactionalVariable whose key is computed from the ID of the
+      # workflow and the ID of the interaction and where the value is
+      # a boolean stating whether the transition method has already
+      # been called before.  Thus, the next statement may not reset
+      # erp5.zodb_accessor_holder as loading Person portal type calls
+      # '_setType*'
+      transaction.commit()
+
+      person_type.setTypeZodbPropertySheetList(None)
+
+      if new_person is not None:
+        portal.person_module.deleteContent(new_person.getId())
+
+      new_person = None
+
+    # Check that the new-style Property Sheet has been properly
+    # unassigned by creating a new person in Person module
+    transaction.commit()
+
+    self.failIf('TestMigration' in \
+                (person_type.getTypeZodbPropertySheetList() or []))
+
+    try:
+      new_person = portal.person_module.newContent(
+        id='testAssignZodbPropertySheet', portal_type='Person')
+
+      self.failIfHasAttribute(new_person, 'getTestStandardPropertyAssign')
+      self.failIfHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+
+    finally:
+      if new_person is not None:
+        portal.person_module.deleteContent(new_person.getId())
+
+  def _checkAddPropertyToZodbPropertySheet(self,
+                                          new_property_function,
+                                          added_accessor_name):
+    import erp5.zodb_accessor_holder
+
+    self.failIfHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+
+    new_property_function('add')
+    self._forceTestAccessorHolderGeneration()
+
+    self.assertHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+    self.assertHasAttribute(erp5.zodb_accessor_holder.TestMigration,
+                            added_accessor_name)
+
+  def testAddStandardPropertyToZodbPropertySheet(self):
+    """
+    Take an existing new-style Property Sheet, add a new Standard
+    Property and check that it has been properly added
+    """
+    self._checkAddPropertyToZodbPropertySheet(
+      self._newStandardProperty,
+      'getTestStandardPropertyAdd')
+
+  def testAddAcquiredPropertyToZodbPropertySheet(self):
+    """
+    Take an existing new-style Property Sheet, add a new Acquired
+    Property and check that it has been properly added
+    """
+    self._checkAddPropertyToZodbPropertySheet(
+      self._newAcquiredProperty,
+      'getDefaultTestAcquiredPropertyAddStreetAddress')
+
+  def testAddCategoryPropertyToZodbPropertySheet(self):
+    """
+    Take an existing ZODB Property Sheet, add a new Category Property
+    and check that it has been properly added
+    """
+    self._checkAddPropertyToZodbPropertySheet(
+      self._newCategoryProperty,
+      'getTestCategoryPropertyAdd')
+
+  def testAddDynamicCategoryPropertyToZodbPropertySheet(self):
+    """
+    Take an existing ZODB Property Sheet, add a new Dynamic Category
+    Property and check that it has been properly added
+    """
+    self._checkAddPropertyToZodbPropertySheet(
+      self._newDynamicCategoryProperty,
+      'getTestDynamicCategoryPropertyAdd')
+
+  def _checkChangePropertyOfZodbPropertySheet(self,
+                                             change_setter_func,
+                                             new_value,
+                                             changed_accessor_name):
+    import erp5.zodb_accessor_holder
+
+    self.failIfHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+
+    change_setter_func(new_value)
+    self._forceTestAccessorHolderGeneration()
+
+    self.assertHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+    self.assertHasAttribute(erp5.zodb_accessor_holder.TestMigration,
+                            changed_accessor_name)
+
+  def testChangeStandardPropertyOfZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, change the 'reference' field of a
+    Standard Property and check that the accessor name has changed
+    """
+    self._checkChangePropertyOfZodbPropertySheet(
+      self.test_standard_property_change.setReference,
+      'test_standard_property_change_renamed',
+      'getTestStandardPropertyChangeRenamed')
+
+  def testChangeAcquiredPropertyOfZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, change the 'reference' field of an
+    Acquired Property and check that the accessor name has changed
+    """
+    self._checkChangePropertyOfZodbPropertySheet(
+      self.test_acquired_property_change.setReference,
+      'test_acquired_property_change_renamed',
+      'getDefaultTestAcquiredPropertyChangeRenamedStreetAddress')
+
+  def testChangeCategoryPropertyOfZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, change the 'id' field of a Category
+    Property to another existing category and check that the accessor
+    name has changed
+    """
+    self._checkChangePropertyOfZodbPropertySheet(
+      self.test_category_property_change.setReference,
+      'test_category_property_change_renamed',
+      'getTestCategoryPropertyChangeRenamed')
+
+  def testChangeDynamicCategoryPropertyOfZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, change the 'category_expression'
+    field of a Dynamic Category Property to another existing category
+    and check that the accessor name has changed
+    """
+    self._checkChangePropertyOfZodbPropertySheet(
+      self.test_dynamic_category_property_change.setCategoryExpression,
+      "python: ('test_dynamic_category_property_change_renamed',)",
+      'getTestDynamicCategoryPropertyChangeRenamed')
+
+  def _checkDeletePropertyFromZodbPropertySheet(self,
+                                               property_id,
+                                               accessor_name):
+    """
+    Delete the given property from the test Property Sheet and check
+    whether its corresponding accessor is not there anymore
+    """
+    import erp5.zodb_accessor_holder
+
+    self.failIfHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+
+    # Delete the property and force re-generation of TestMigration
+    # accessor holder
+    self.test_property_sheet.deleteContent(property_id)
+    self._forceTestAccessorHolderGeneration()
+
+    self.assertHasAttribute(erp5.zodb_accessor_holder, 'TestMigration')
+    self.failIfHasAttribute(erp5.zodb_accessor_holder.TestMigration,
+                            accessor_name)
+
+  def testDeleteStandardPropertyFromZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, delete a Standard Property and check
+    that the accessor is not there anymore
+    """
+    self._checkDeletePropertyFromZodbPropertySheet(
+      self.test_standard_property_delete.getId(),
+      'getTestStandardPropertyDelete')
+
+  def testDeleteAcquiredPropertyFromZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, delete an Acquired Property and
+    check that the accessor is not there anymore
+    """
+    self._checkDeletePropertyFromZodbPropertySheet(
+      self.test_acquired_property_delete.getId(),
+      'getTestAcquiredPropertyDelete')
+
+  def testDeleteCategoryPropertyFromZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, delete a Category Property and check
+    that the accessor is not there anymore
+    """
+    self._checkDeletePropertyFromZodbPropertySheet(
+      self.test_category_property_delete.getId(),
+      'getTestCategoryPropertyDelete')
+
+  def testDeleteDynamicCategoryPropertyFromZodbPropertySheet(self):
+    """
+    Take the test Property Sheet, delete a Category Property and check
+    that the accessor is not there anymore
+    """
+    self._checkDeletePropertyFromZodbPropertySheet(
+      self.test_dynamic_category_property_delete.getId(),
+      'getTestDynamicCategoryPropertyDelete')
+
+  def _getConstraintByReference(self, reference):
+    for constraint in self.test_module.constraints:
+      try:
+        if constraint.getReference() == reference:
+          return constraint
+      except AttributeError:
+        pass
+
+    return None
+
+  def testPropertyExistenceConstraint(self):
+    """
+    Take the test module and check whether the Property Existence
+    Constraint is available. Until the property has been set to a
+    value, the constraint should fail
+    """
+    constraint = self._getConstraintByReference(
+      'test_property_existence_constraint')
+
+    self.failIfEqual(None, constraint)
+
+    self.assertEquals(1, len(constraint.checkConsistency(self.test_module)))
+
+    # See ERP5Type.Base.Base.hasProperty()
+    self.test_module.setTestStandardPropertyConstraint('foobar')
+
+    self.assertEquals([], constraint.checkConsistency(self.test_module))
+
+  def testCategoryExistenceConstraint(self):
+    """
+    Take the test module and check whether the Property Existence
+    Constraint is available. Until the category has been set to an
+    existing category, the constraint should fail
+    """
+    constraint = self._getConstraintByReference(
+      'test_category_existence_constraint')
+
+    self.failIfEqual(None, constraint)
+
+    self.assertEquals(1, len(constraint.checkConsistency(self.test_module)))
+
+    self.test_module.setTestCategoryPropertyConstraint('sub_category')
+
+    self.assertEquals([], constraint.checkConsistency(self.test_module))
+
+TestZodbPropertySheet = skip("ZODB Property Sheets code is not enabled yet")(
+  TestZodbPropertySheet)
 
 def test_suite():
   suite = unittest.TestSuite()
-  suite.addTest(unittest.makeSuite(TestNewStyleClasses))
+  suite.addTest(unittest.makeSuite(TestPortalTypeClass))
+  suite.addTest(unittest.makeSuite(TestZodbPropertySheet))
   return suite

Removed: erp5/trunk/products/ERP5Type/tests/testMigration.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testMigration.py?rev=39488&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testMigration.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testMigration.py (removed)
@@ -1,132 +0,0 @@
-import os, shutil
-import unittest
-
-import transaction
-
-from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-
-class TestNewStyleClasses(ERP5TypeTestCase):
-
-  def getBusinessTemplateList(self):
-    return 'erp5_base',
-
-  def testImportNonMigratedPerson(self):
-    """
-    Import a .zexp containing a Person created with an old
-    Products.ERP5Type.Document.Person.Person type
-    """
-    file_name = 'non_migrated_person.zexp'
-    import Products.ERP5Type.tests as test_module
-    test_path = test_module.__path__
-    if isinstance(test_path, list):
-      test_path = test_path[0]
-
-    zexp_path = os.path.join(test_path, 'input', file_name)
-    self.assertTrue(os.path.exists(zexp_path))
-
-    import_path = os.path.join(os.environ['INSTANCE_HOME'], 'import')
-    if not os.path.exists(import_path):
-      os.mkdir(import_path)
-    shutil.copy(zexp_path, import_path)
-
-
-    person_module = self.getPortal().person_module
-    person_module.manage_importObject(file_name)
-
-    transaction.commit()
-
-    non_migrated_person = person_module.non_migrated_person
-    # check that object unpickling instanciated a new style object
-    from erp5.portal_type import Person as erp5_document_person
-    self.assertEquals(non_migrated_person.__class__, erp5_document_person)
-
-  def testMigrateOldObjectFromZODB(self):
-    """
-    Load an object with ERP5Type.Document.Person.Person from the ZODB
-    and check that migration works well
-    """
-    from Products.ERP5Type.Document.Person import Person
-
-    # remove temporarily the migration
-    from Products.ERP5Type.Utils import PersistentMigrationMixin
-    PersistentMigrationMixin.migrate = 0
-
-    person_module = self.getPortal().person_module
-    obj_id = "this_object_is_old"
-    old_object = Person(obj_id)
-    person_module._setObject(obj_id, old_object)
-    old_object = person_module._getOb(obj_id)
-
-    transaction.commit()
-    self.assertEquals(old_object.__class__.__module__, 'Products.ERP5Type.Document.Person')
-    self.assertEquals(old_object.__class__.__name__, 'Person')
-
-    self.assertTrue(hasattr(old_object.__class__, '__setstate__'))
-
-    # unload/deactivate the object
-    old_object._p_invalidate()
-
-    # From now on, everything happens as if the object was a old, non-migrated
-    # object with an old Products.ERP5Type.Document.Person.Person
-
-    # now turn on migration
-    PersistentMigrationMixin.migrate = 1
-
-    # reload the object
-    old_object._p_activate()
-
-    self.assertEquals(old_object.__class__.__module__, 'erp5.portal_type')
-    self.assertEquals(old_object.__class__.__name__, 'Person')
-
-  def testChangeMixin(self):
-    """
-    Take an existing object, change the mixin definitions of its portal type.
-    Check that the new methods are there.
-    """
-    portal = self.getPortal()
-    person_module = portal.person_module
-    person = person_module.newContent(id='John Dough', portal_type='Person')
-
-    person_type = portal.portal_types.Person
-    self.assertEquals(person_type.getTypeMixinList(), None)
-
-    try:
-      self.assertEquals(getattr(person, 'asText', None), None)
-      # just use a mixin/method that Person does not have yet
-      person_type.setTypeMixin('TextConvertableMixin')
-
-      transaction.commit()
-
-      self.assertNotEquals(getattr(person, 'asText', None), None)
-    finally:
-      # reset the type
-      person_type.setTypeMixin(None)
-
-  def testChangeDocument(self):
-    """
-    Take an existing object, change its document class
-    Check that the new methods are there.
-    """
-    portal = self.getPortal()
-    person_module = portal.person_module
-    person = person_module.newContent(id='Eva Dough', portal_type='Person')
-
-    person_type = portal.portal_types.Person
-    self.assertEquals(person_type.getTypeClass(), 'Person')
-
-    try:
-      self.assertEquals(getattr(person, 'getCorporateName', None), None)
-      # change the base type class
-      person_type.setTypeClass('Organisation')
-
-      transaction.commit()
-
-      self.assertNotEquals(getattr(person, 'getCorporateName', None), None)
-    finally:
-      # reset the type
-      person_type.setTypeClass('Person')
-
-def test_suite():
-  suite = unittest.TestSuite()
-  suite.addTest(unittest.makeSuite(TestNewStyleClasses))
-  return suite




More information about the Erp5-report mailing list