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

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Nov 1 07:27:20 CET 2010


Author: arnaud.fontaine
Date: Mon Nov  1 07:27:17 2010
New Revision: 39738

URL: http://svn.erp5.org?rev=39738&view=rev
Log:
Add tests to check the consistency when importing filesystem Property
Sheets into ZODB


Modified:
    erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py

Modified: erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py?rev=39738&r1=39737&r2=39738&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py [utf8] Mon Nov  1 07:27:17 2010
@@ -29,8 +29,8 @@
 ##############################################################################
 
 import unittest
-
 import transaction
+
 from Products.ERP5Type.dynamic.portal_type_class import synchronizeDynamicModules
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
 from Products.ERP5Type.tests.backportUnittest import expectedFailure, skip
@@ -694,8 +694,211 @@ class TestZodbPropertySheet(ERP5TypeTest
 TestZodbPropertySheet = skip("ZODB Property Sheets code is not enabled yet")(
   TestZodbPropertySheet)
 
+from Products.ERP5Type import PropertySheet
+from Products.CMFCore.Expression import Expression
+
+from Products.ERP5Type.PropertySheet.StandardProperty import StandardProperty
+from Products.ERP5Type.PropertySheet.AcquiredProperty import AcquiredProperty
+
+class TestZodbImportFilesystemPropertySheet(ERP5TypeTestCase):
+  """
+  Check that importing filesystem Property Sheets into ZODB the same
+  properties and their values
+  """
+  # The following fields of properties are no longer defined in ZODB
+  # Property Sheets because they have been deprecated
+  deprecated_field_name_tuple = ('mode',
+                                 'select_variable',
+                                 'label',
+                                 'acquisition_depends',
+                                 'acquisition_sync_value')
+
+  def afterSetUp(self):
+    # Get all the property sheets defined on the filesystem
+    self.filesystem_property_sheet_list = []
+    for name, klass in PropertySheet.__dict__.iteritems():
+      if name[0] != '_':
+        self.filesystem_property_sheet_list.append(klass)
+
+    # Mapping between the field name of a property and the default
+    # value as defined in StandardProperty and AcquiredProperty,
+    # meaningful because exporting a property relies on accessor which
+    # returns the default value if the field value is not set
+    self.filesystem_field_default_value_dict = {}
+    for property_dict in StandardProperty._properties + AcquiredProperty._properties:
+      try:
+        self.filesystem_field_default_value_dict[property_dict['id']] = \
+            property_dict['default']
+      except KeyError:
+        # Some fields may not defined a default value (such as 'id')
+        continue
+
+  def _checkPropertyField(self,
+                          property_sheet_name,
+                          field_name,
+                          filesystem_value,
+                          zodb_value):
+    """
+    Check whether the given filesystem property value and the given
+    ZODB property value are equal
+    """
+    if isinstance(zodb_value, (list, tuple)):
+      self.failIfDifferentSet(
+        zodb_value, filesystem_value,
+        msg="%s: %s: filesystem value: %s, ZODB value: %s" % \
+          (property_sheet_name, field_name, filesystem_value, zodb_value))
+
+    else:
+      # In ZODB Property Sheets, we have to get the TALES Expression
+      # as a string for properties, which used to be Expression in
+      # filesystem Property Sheets or are now Expression (because they
+      # used to be defined as Python types, such as tuple or int...)
+      if isinstance(zodb_value, Expression):
+        # In filesystem Property Sheets, acquisition_portal_type and
+        # portal_type, might be instances of Expression
+        if isinstance(filesystem_value, Expression):
+          zodb_value = zodb_value.text
+          filesystem_value = filesystem_value.text
+        # Otherwise, just convert the filesystem value to a TALES
+        # Expression string
+        else:
+          zodb_value = zodb_value.text
+          filesystem_value = 'python: ' + repr(filesystem_value)
+
+      self.failUnlessEqual(
+        zodb_value, filesystem_value,
+        msg="%s: %s: filesystem value: %s, ZODB value: %s" % \
+          (property_sheet_name, field_name, filesystem_value,
+           zodb_value))
+
+  def _checkPropertyDefinitionTuple(self,
+                                    property_sheet_name,
+                                    filesystem_property_tuple,
+                                    zodb_property_tuple):
+    """
+    Check whether all properties have been properly converted from
+    the filesystem to the ZODB Property Sheet
+    """
+    # Check whether all the properties are present in the given ZODB
+    # Property Sheet
+    self.assertEqual(
+      len(filesystem_property_tuple), len(zodb_property_tuple),
+      msg="%s: too many properties: filesystem: %s, ZODB: %s" % \
+      (property_sheet_name, filesystem_property_tuple, zodb_property_tuple))
+
+    # Map filesystem property IDs to their definition
+    filesystem_property_id_dict = {}
+    for property_dict in filesystem_property_tuple:
+      filesystem_property_id_dict[property_dict['id']] = property_dict
+
+    # Check each property defined in ZODB against the filesystem dict
+    # defined before
+    for zodb_property_dict in zodb_property_tuple:
+      # Meaningful to ensure that there is no missing field within a
+      # property
+      validated_field_counter = 0
+
+      filesystem_property_dict = \
+         filesystem_property_id_dict[zodb_property_dict['id']]
+
+      # Check each property field
+      for field_name, zodb_value in zodb_property_dict.iteritems():
+        if field_name in filesystem_property_dict:
+          self._checkPropertyField(property_sheet_name,
+                                   field_name,
+                                   filesystem_property_dict[field_name],
+                                   zodb_value)
+        # As we are using accessors when exporting the ZODB Property
+        # Sheet to its filesystem definition, there may be additional
+        # fields set to their default value
+        elif field_name in self.filesystem_field_default_value_dict:
+          self.assertEqual(
+            self.filesystem_field_default_value_dict[field_name],
+            zodb_value,
+            msg="%s: Wrong default value %s for %s" % \
+                (property_sheet_name, zodb_value, field_name))
+
+        validated_field_counter += 1
+
+      if len(filesystem_property_dict) != validated_field_counter:
+        missing_field_name_list = [
+          k for k in filesystem_property_dict \
+          if k not in zodb_property_dict and \
+             k not in self.deprecated_field_name_tuple ]
+
+        self.assertTrue(
+          len(missing_field_name_list) == 0,
+          msg="%s: missing fields: %s: filesystem: %s, ZODB: %s" % \
+          (property_sheet_name, missing_field_name_list,
+           filesystem_property_dict, zodb_property_dict))
+
+  def _checkCategoryTuple(self,
+                          property_sheet_name,
+                          filesystem_category_tuple,
+                          zodb_category_tuple):
+    """
+    Check whether all categories have been properly converted
+    """
+    # There should be the same number of categories
+    self.assertEqual(
+      len(filesystem_category_tuple), len(zodb_category_tuple),
+      msg="%s: Missing/added categories: filesystem: %s, ZODB: %s" % \
+      (property_sheet_name, filesystem_category_tuple, zodb_category_tuple))
+
+    # Some Categories are instance of Expression, so compute a list of
+    # categories as strings
+    zodb_category_list = [
+      isinstance(category, Expression) and category.text or category \
+      for category in zodb_category_tuple ]
+
+    # Now, compare filesystem categories with ZODB
+    for category in filesystem_category_tuple:
+      if isinstance(category, Expression):
+        category = category.text
+
+      self.assertTrue(
+        category in zodb_category_list,
+        msg="%s: Missing category %s: ZODB: %s" % \
+        (property_sheet_name, category, zodb_category_list))
+
+  def testZodbImportPropertySheet(self):
+    """
+    Create Property Sheets on portal_property_sheets from their
+    definition on the filesystem and then test that they are
+    equivalent
+
+    TODO: Constraints
+    """
+    portal = self.getPortalObject().portal_property_sheets
+
+    for filesystem_property_sheet in self.filesystem_property_sheet_list:
+      property_sheet_name = filesystem_property_sheet.__name__
+
+      # Rename the filesystem Property Sheet class to avoid clashing
+      # with existing Property Sheets in portal_property_sheets
+      filesystem_property_sheet.__name__ = "%s_%s" % \
+          (self.__class__.__name__, property_sheet_name)
+
+      zodb_property_sheet = portal.createPropertySheetFromFilesystemClass(
+        filesystem_property_sheet)
+
+      zodb_property_tuple, zodb_category_tuple, zodb_constraint_tuple = \
+          portal.exportPropertySheetToFilesystemDefinitionTuple(
+              zodb_property_sheet)
+
+      self._checkPropertyDefinitionTuple(property_sheet_name,
+                                         getattr(filesystem_property_sheet,
+                                                 '_properties', []),
+                                         zodb_property_tuple)
+
+      self._checkCategoryTuple(property_sheet_name,
+                               getattr(filesystem_property_sheet,
+                                       '_categories', []),
+                               zodb_category_tuple)
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestPortalTypeClass))
   suite.addTest(unittest.makeSuite(TestZodbPropertySheet))
+  suite.addTest(unittest.makeSuite(TestZodbImportFilesystemPropertySheet))
   return suite




More information about the Erp5-report mailing list