[Erp5-report] r24166 - /erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Oct 14 11:29:49 CEST 2008


Author: vincent
Date: Tue Oct 14 11:29:45 2008
New Revision: 24166

URL: http://svn.erp5.org?rev=24166&view=rev
Log:
Add a unit test for related key behaviour when there is more than one in a query.

Modified:
    erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py

Modified: erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py?rev=24166&r1=24165&r2=24166&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py (original)
+++ erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py Tue Oct 14 11:29:45 2008
@@ -2752,6 +2752,77 @@
     self.assertEqual(len(person_module.searchFolder()),
                      len(person_module.searchFolder(sort_on=[('subordination_title', 'ascending')])))
 
+  def test_multipleRelatedKeyDoMultipleJoins(self, quiet=quiet, run=run_all_test):
+    """
+      Check that when multiple related keys are present in the same query,
+      each one does a separate join.
+      ie:
+        Searching for an object whose site_title is "foo" and
+        site_description is "bar" will yeld a result set which is the union
+        of:
+          - objects whose site_title is foo
+          - objects whose site_description is bar
+    """
+    portal = self.getPortalObject()
+    def _create(**kw):
+      return portal.organisation_module.newContent(portal_type='Organisation', **kw)
+    def create(id, related_obect_list):
+      return _create(id=id,
+        site_value_list=related_obect_list,
+        function_value_list=related_obect_list)
+    def check(expected_result, description, query):
+      result = [x.getObject() for x in portal.portal_catalog(portal_type='Organisation', query=query)]
+      self.assertSameSet(expected_result, result,
+        '%s:\nExpected: %r\nGot: %r' % (description,
+           [x.getId() for x in expected_result],
+           [x.getId() for x in result]))
+    # completely artificial example, we just need relations
+    related_1 = _create(title='foo1', reference='foo', description='bar')
+    related_2 = _create(title='foo2', reference='foo'                   )
+    related_3 = _create(                               description='bar')
+    related_4 = _create()
+    object_1  = create('object_1',  [related_1])
+    object_2  = create('object_2',  [related_2])
+    object_3  = create('object_3',  [related_3])
+    object_4  = create('object_4',  [related_4])
+    object_12 = create('object_12', [related_1, related_2])
+    object_13 = create('object_13', [related_1, related_3])
+    object_14 = create('object_14', [related_1, related_4])
+    object_23 = create('object_23', [related_2, related_3])
+    object_24 = create('object_24', [related_2, related_4])
+    object_34 = create('object_34', [related_3, related_4])
+    reference_object_list =   [object_1, object_2,                     object_12, object_13, object_14, object_23, object_24           ]
+    description_object_list = [object_1,           object_3,           object_12, object_13, object_14, object_23,            object_34]
+    both_object_list =        [object_1,                               object_12, object_13, object_14, object_23                      ]
+    title_object_list =       [                                        object_12                                                       ]
+    get_transaction().commit()
+    self.tic()
+    # Single join
+    check(reference_object_list,
+          'site_reference="foo"',
+          Query(site_reference='foo'))
+    check(description_object_list,
+          'site_description="bar"',
+          Query(site_description='bar'))
+    # Double join on different relations
+    check(both_object_list,
+          'site_reference="foo" AND function_description="bar"',
+          ComplexQuery(Query(site_reference='foo'),
+                       Query(function_description='bar'),
+                       operator='AND'))
+    # Double join on same relation
+    check(both_object_list,
+          'site_reference="foo" AND site_description="bar"',
+          ComplexQuery(Query(site_reference='foo'),
+                       Query(site_description='bar'),
+                       operator='AND'))
+    # Double join on same related key
+    check(title_object_list,
+          'site_title="foo1" AND site_title="foo2"',
+          ComplexQuery(Query(site_title='=foo1'),
+                       Query(site_title='=foo2'),
+                       operator='AND'))
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestERP5Catalog))




More information about the Erp5-report mailing list