From dba7f0999858ad8e59ed0d861e4f2f545fd7a591 Mon Sep 17 00:00:00 2001
From: Sebastien Robin <seb@nexedi.com>
Date: Thu, 1 Apr 2004 12:09:02 +0000
Subject: [PATCH] added unit test for CMFCategory

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@636 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/CMFCategory/tests/__init__.py         |   5 +
 product/CMFCategory/tests/erp5_crm.zexp       | Bin 0 -> 126471 bytes
 product/CMFCategory/tests/framework.py        | 112 ++++++++
 product/CMFCategory/tests/run_test_example.sh |  10 +
 product/CMFCategory/tests/runalltests.py      |  29 ++
 product/CMFCategory/tests/testCMFCategory.py  | 249 ++++++++++++++++++
 6 files changed, 405 insertions(+)
 create mode 100755 product/CMFCategory/tests/__init__.py
 create mode 100755 product/CMFCategory/tests/erp5_crm.zexp
 create mode 100755 product/CMFCategory/tests/framework.py
 create mode 100755 product/CMFCategory/tests/run_test_example.sh
 create mode 100755 product/CMFCategory/tests/runalltests.py
 create mode 100755 product/CMFCategory/tests/testCMFCategory.py

diff --git a/product/CMFCategory/tests/__init__.py b/product/CMFCategory/tests/__init__.py
new file mode 100755
index 0000000000..4817854199
--- /dev/null
+++ b/product/CMFCategory/tests/__init__.py
@@ -0,0 +1,5 @@
+"""\
+Unit test package for CMFCategory
+
+To run all tests type 'python runalltests.py'
+"""
diff --git a/product/CMFCategory/tests/erp5_crm.zexp b/product/CMFCategory/tests/erp5_crm.zexp
new file mode 100755
index 0000000000000000000000000000000000000000..974f5f9f92dfb8195f9d69bfefa3cf74f127ffe4
GIT binary patch
literal 126471
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
E025s|<NyEw

literal 0
HcmV?d00001

diff --git a/product/CMFCategory/tests/framework.py b/product/CMFCategory/tests/framework.py
new file mode 100755
index 0000000000..c36e5abb81
--- /dev/null
+++ b/product/CMFCategory/tests/framework.py
@@ -0,0 +1,112 @@
+##############################################################################
+#
+# ZopeTestCase 
+#
+# COPY THIS FILE TO YOUR 'tests' DIRECTORY.
+#
+# This version of framework.py will use the SOFTWARE_HOME
+# environment variable to locate Zope and the Testing package.
+#
+# If the tests are run in an INSTANCE_HOME installation of Zope,
+# Products.__path__ and sys.path with be adjusted to include the
+# instance's Products and lib/python directories respectively.
+#
+# If you explicitly set INSTANCE_HOME prior to running the tests,
+# auto-detection is disabled and the specified path will be used 
+# instead.
+#
+# If the 'tests' directory contains a custom_zodb.py file, INSTANCE_HOME
+# will be adjusted to use it.
+#
+# If you set the ZEO_INSTANCE_HOME environment variable a ZEO setup 
+# is assumed, and you can attach to a running ZEO server (via the 
+# instance's custom_zodb.py).
+#
+##############################################################################
+#
+# The following code should be at the top of every test module:
+#
+# import os, sys
+# if __name__ == '__main__':
+#     execfile(os.path.join(sys.path[0], 'framework.py'))
+#
+# ...and the following at the bottom:
+#
+# if __name__ == '__main__':
+#     framework()
+#
+##############################################################################
+
+__version__ = '0.2.1'
+
+# Save start state
+#
+__SOFTWARE_HOME = os.environ.get('SOFTWARE_HOME', '')
+__INSTANCE_HOME = os.environ.get('INSTANCE_HOME', '')
+
+if __SOFTWARE_HOME.endswith(os.sep):
+    __SOFTWARE_HOME = os.path.dirname(__SOFTWARE_HOME)
+
+if __INSTANCE_HOME.endswith(os.sep):
+    __INSTANCE_HOME = os.path.dirname(__INSTANCE_HOME)
+
+# Find and import the Testing package
+#
+if not sys.modules.has_key('Testing'):
+    p0 = sys.path[0]
+    if p0 and __name__ == '__main__':
+        os.chdir(p0)
+        p0 = ''
+    s = __SOFTWARE_HOME
+    p = d = s and s or os.getcwd()
+    while d:
+        if os.path.isdir(os.path.join(p, 'Testing')):
+            zope_home = os.path.dirname(os.path.dirname(p))
+	    # Do not add the parent directory into the path list.
+	    # Why did the author put it? -yo
+	    if 0:
+                sys.path[:1] = [p0, os.pardir, p, zope_home]
+	    else:
+                sys.path[:1] = [p0, p, zope_home]
+            break
+        p, d = s and ('','') or os.path.split(p)
+    else:
+        print 'Unable to locate Testing package.',
+        print 'You might need to set SOFTWARE_HOME.'
+        sys.exit(1)
+
+import Testing, unittest
+execfile(os.path.join(os.path.dirname(Testing.__file__), 'common.py'))
+
+# Include ZopeTestCase support
+#
+if 1:   # Create a new scope
+
+    p = os.path.join(os.path.dirname(Testing.__file__), 'ZopeTestCase')
+
+    if not os.path.isdir(p):
+        print 'Unable to locate ZopeTestCase package.',
+        print 'You might need to install ZopeTestCase.'
+        sys.exit(1)
+
+    ztc_common = 'ztc_common.py'
+    ztc_common_global = os.path.join(p, ztc_common) 
+
+    f = 0
+    if os.path.exists(ztc_common_global):
+        execfile(ztc_common_global)
+        f = 1
+    if os.path.exists(ztc_common):
+        execfile(ztc_common)
+        f = 1
+
+    if not f:
+        print 'Unable to locate %s.' % ztc_common
+        sys.exit(1)
+
+
+# Debug
+#
+print 'SOFTWARE_HOME: %s' % os.environ.get('SOFTWARE_HOME', 'Not set')
+print 'INSTANCE_HOME: %s' % os.environ.get('INSTANCE_HOME', 'Not set')
+
diff --git a/product/CMFCategory/tests/run_test_example.sh b/product/CMFCategory/tests/run_test_example.sh
new file mode 100755
index 0000000000..deb684687f
--- /dev/null
+++ b/product/CMFCategory/tests/run_test_example.sh
@@ -0,0 +1,10 @@
+export INSTANCE_HOME=/home/$USER/zope
+export SOFTWARE_HOME=/usr/lib/zope/lib/python/
+export COPY_OF_INSTANCE_HOME=$INSTANCE_HOME
+export COPY_OF_SOFTWARE_HOME=$SOFTWARE_HOME
+
+dir="`dirname $0`"
+if test -n "$dir"; then
+  cd $dir
+fi
+python runalltests.py
diff --git a/product/CMFCategory/tests/runalltests.py b/product/CMFCategory/tests/runalltests.py
new file mode 100755
index 0000000000..3a0d03daaf
--- /dev/null
+++ b/product/CMFCategory/tests/runalltests.py
@@ -0,0 +1,29 @@
+#
+# Runs all tests in the current directory
+#
+# Execute like:
+#   python runalltests.py
+#
+# Alternatively use the testrunner: 
+#   python /path/to/Zope/utilities/testrunner.py -qa
+#
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py')) 
+
+import unittest
+TestRunner = unittest.TextTestRunner
+suite = unittest.TestSuite()
+
+tests = os.listdir(os.curdir)
+tests = [n[:-3] for n in tests if n.startswith('test') and n.endswith('.py')]
+
+for test in tests:
+    m = __import__(test)
+    if hasattr(m, 'test_suite'):
+        suite.addTest(m.test_suite())
+
+if __name__ == '__main__':
+    TestRunner().run(suite)
+
diff --git a/product/CMFCategory/tests/testCMFCategory.py b/product/CMFCategory/tests/testCMFCategory.py
new file mode 100755
index 0000000000..a386df44b9
--- /dev/null
+++ b/product/CMFCategory/tests/testCMFCategory.py
@@ -0,0 +1,249 @@
+##############################################################################
+#
+# Copyright (c) 2004 Nexedi SARL and Contributors. 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.
+#
+##############################################################################
+
+
+
+#
+# Skeleton ZopeTestCase
+#
+
+from random import randint
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+# Needed in order to have a log file inside the current folder
+os.environ['EVENT_LOG_FILE'] = os.path.join(os.getcwd(), 'zLOG.log')
+os.environ['EVENT_LOG_SEVERITY'] = '-300'
+
+from Testing import ZopeTestCase
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from AccessControl.SecurityManagement import newSecurityManager, noSecurityManager
+from zLOG import LOG
+import time
+
+class TestCMFCategory(ERP5TypeTestCase):
+
+  # Different variables used for this test
+  run_all_test = 1
+  id1 = '1'
+  region1 = 'europe/west/france'
+  region2 = 'europe/west/germany'
+  region_list = [region1, region2]
+
+  def getBusinessTemplateList(self):
+    """
+      Return the list of business templates.
+
+      the business template crm give the following things :
+      modules:
+        - person
+        - organisation
+      base categories:
+        - region
+        - subordination
+      
+      /organisation
+    """
+    return ('erp5_crm',)
+    #return ()
+
+  def getCategoriesTool(self):
+    return getattr(self.getPortal(), 'portal_categories', None)
+
+  def getPersonModule(self):
+    return getattr(self.getPortal(), 'person', None)
+
+  def getOrganisationModule(self):
+    return getattr(self.getPortal(), 'organisation', None)
+
+  def getPortalId(self):
+    return self.getPortal().getId()
+
+  def testHasEverything(self, quiet=0, run=run_all_test):
+    # Test if portal_synchronizations was created
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest Has Everything ')
+      LOG('Testing... ',0,'testHasEverything')
+    self.failUnless(self.getCategoriesTool()!=None)
+    self.failUnless(self.getPersonModule()!=None)
+    self.failUnless(self.getOrganisationModule()!=None)
+
+  def afterSetUp(self, quiet=1, run=1):
+    self.login()
+    portal = self.getPortal()
+    portal.portal_types.constructContent(type_name='Person Module',
+                                       container=portal,
+                                       id='person')
+    portal.portal_types.constructContent(type_name='Organisation Module',
+                                       container=portal,
+                                       id='organisation')
+    person_module = self.getPersonModule()
+    p1 = person_module.newContent(id=self.id1)
+    organisation_module = self.getOrganisationModule()
+    o1 = organisation_module.newContent(id=self.id1)
+    portal_categories = self.getCategoriesTool()
+    # This set the acquisition for region
+    for bc in ('region', ):
+      if not hasattr(portal_categories, bc):
+        addBaseCategory(portal_categories, bc)
+      portal_categories[bc].setAcquisitionBaseCategoryList('subordination',)
+      portal_categories[bc].setAcquisitionPortalTypeList(['Address', 'Organisation', 'Person'])
+      portal_categories[bc].setAcquisitionMaskValue(1)
+      portal_categories[bc].setAcquisitionCopyValue(0)
+      portal_categories[bc].setAcquisitionAppendValue(0)
+      portal_categories[bc].setAcquisitionObjectIdList(['default_address'])
+
+
+  def login(self, quiet=0, run=run_all_test):
+    uf = self.getPortal().acl_users
+    uf._doAddUser('seb', '', ['Manager'], [])
+    user = uf.getUserById('seb').__of__(uf)
+    newSecurityManager(None, user)
+
+  def testSingleCategory(self, quiet=0, run=run_all_test):
+    # Test if a single category is working
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest Single Category ')
+      LOG('Testing... ',0,'testSingleCategory')
+    p1 = self.getPersonModule()._getOb(self.id1)
+    p1.setRegion(self.region1)
+    self.assertEqual(p1.getRegion(),self.region1)
+    self.assertEqual(p1.getDefaultRegion(),self.region1)
+    self.assertEqual(p1.getRegionList(),[self.region1])
+
+  def testMultipleCategory(self, quiet=0, run=run_all_test):
+    # Test if multiple categories are working
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest Multiple Category ')
+      LOG('Testing... ',0,'testMultipleCategory')
+    portal = self.getPortal()
+    region_value_list = [portal.portal_categories.resolveCategory(self.region1),
+                         portal.portal_categories.resolveCategory(self.region2)]
+    p1 = self.getPersonModule()._getOb(self.id1)
+    p1.setRegion(self.region_list)
+    self.assertEqual(p1.getRegion(),self.region1)
+    self.assertEqual(p1.getDefaultRegion(),self.region1)
+    self.assertEqual(p1.getRegionList(),self.region_list)
+
+  def testCategoryValue(self, quiet=0, run=run_all_test):
+    # Test if we can get categories values
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest Category Value ')
+      LOG('Testing... ',0,'testCategoryValue')
+    portal = self.getPortal()
+    region_value = portal.portal_categories.resolveCategory(self.region1)
+    p1 = self.getPersonModule()._getOb(self.id1)
+    p1.setRegion(self.region_list)
+    self.assertEqual(p1.getRegionValue(),region_value)
+
+  def testReturnNone(self, quiet=0, run=run_all_test):
+    # Test if we getCategory return None if the cat is '' or None
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest Return None ')
+      LOG('Testing... ',0,'testReturnNone')
+    portal = self.getPortal()
+    p1 = self.getPersonModule()._getOb(self.id1)
+    p1.setRegion(None)
+    self.assertEqual(p1.getRegion(),None)
+    p1.setRegion('')
+    self.assertEqual(p1.getRegion(),None)
+
+  def testSingleAcquisition(self, quiet=0, run=run_all_test):
+    # Test if the acquisition for a single value is working
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest Single Acquisition ')
+      LOG('Testing... ',0,'testSingleAcquisition')
+    portal = self.getPortal()
+    o1 = self.getOrganisationModule()._getOb(self.id1)
+    p1 = self.getPersonModule()._getOb(self.id1)
+    o1.setRegion(self.region1)
+    p1.setSubordinationValue(o1)
+    self.assertEqual(p1.getRegion(),self.region1)
+    self.assertEqual(p1.getDefaultRegion(),self.region1)
+    self.assertEqual(p1.getRegionList(),[self.region1])
+
+  def testListAcquisition(self, quiet=0, run=run_all_test):
+    # Test if the acquisition for a single value is working
+    if not run: return
+    if not quiet:
+      ZopeTestCase._print('\nTest List Acquisition ')
+      LOG('Testing... ',0,'testListAcquisition')
+    portal = self.getPortal()
+    o1 = self.getOrganisationModule()._getOb(self.id1)
+    p1 = self.getPersonModule()._getOb(self.id1)
+    o1.setRegion(self.region_list)
+    p1.setSubordinationValue(o1)
+    test = p1.getSubordinationValue()
+    LOG('Testing... getSubordinationValue',0,test)
+    sub = p1.getSubordinationValue()
+    self.assertEqual(sub,o1)
+    p1.immediateReindexObject()
+    output = ''
+    result = portal.erp5_sql_connection.manage_test('select path from catalog')
+    for line in result:
+      output += '\n%s' % line['path']
+    LOG('sql result',0,output)
+    o_uid = p1.getUid()
+    output = ''
+    result = portal.erp5_sql_connection.manage_test('select * from category where uid=%s' % o_uid)
+    cat_uid = ''
+    for line in result:
+      output += '\n%s' % line['uid']
+      output += '\n%s' % line['category_uid']
+      cat_uid = line['category_uid']
+    LOG('sql2 result',0,output)
+    result = portal.erp5_sql_connection.manage_test('select * from catalog where uid=%s' % cat_uid)
+    output = ''
+    for line in result:
+      output += '\n%s' % line['path']
+    LOG('sql3 result',0,output)
+    self.assertEqual(p1.getRegion(),self.region1)
+    self.assertEqual(p1.getDefaultRegion(),self.region1)
+    self.assertEqual(p1.getRegionList(),self.region_list)
+
+
+
+
+
+if __name__ == '__main__':
+    framework()
+else:
+    import unittest
+    def test_suite():
+        suite = unittest.TestSuite()
+        suite.addTest(unittest.makeSuite(TestCMFCategory))
+        return suite
+
-- 
2.30.9