[Zope-Checkins] SVN: Zope/trunk/lib/python/Testing/ZopeTestCase/ Update ZopeTestCase to match latest standalone release (0.9.6).

Stefan H. Holek stefan at epy.co.at
Mon Mar 14 13:54:18 EST 2005


Log message for revision 29465:
  Update ZopeTestCase to match latest standalone release (0.9.6).
  Note that doctest support is not done yet!
  

Changed:
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/PortalTestCase.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeLite.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeTestCase.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/__init__.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/base.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/API.stx
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/FunctionalTesting.stx
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/HOWTO.stx
  D   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/INSTALL.stx
  D   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/IZopeTestCase.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/PortalTestCase.stx
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/SECURITY.stx
  D   Zope/trunk/lib/python/Testing/ZopeTestCase/doc/VERSION.txt
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py
  A   Zope/trunk/lib/python/Testing/ZopeTestCase/interfaces.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/profiler.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/runalltests.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/testBaseTestCase.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/testFunctional.py
  A   Zope/trunk/lib/python/Testing/ZopeTestCase/testInterfaces.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/testPortalTestCase.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/testShoppingCart.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/testWebserver.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/testZopeTestCase.py
  U   Zope/trunk/lib/python/Testing/ZopeTestCase/utils.py
  A   Zope/trunk/lib/python/Testing/ZopeTestCase/warnhook.py
  A   Zope/trunk/lib/python/Testing/ZopeTestCase/ztc/
  A   Zope/trunk/lib/python/Testing/ZopeTestCase/ztc/__init__.py

-=-
Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/PortalTestCase.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/PortalTestCase.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/PortalTestCase.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -14,10 +14,11 @@
 # getPortal() returns a usable portal object to the setup code.
 #
 
-# $Id: PortalTestCase.py,v 1.29 2004/09/09 18:48:59 shh42 Exp $
+# $Id: PortalTestCase.py,v 1.38 2005/02/09 12:42:40 shh42 Exp $
 
 import base
-import types
+import interfaces
+import utils
 
 from AccessControl import getSecurityManager
 from AccessControl.SecurityManagement import newSecurityManager
@@ -30,32 +31,14 @@
 
 
 class PortalTestCase(base.TestCase):
-    '''Base test case for testing CMF-style portals
+    '''Base test case for testing CMF-style portals'''
 
-       __implements__ = (IPortalTestCase, ISimpleSecurity, IExtensibleSecurity)
+    __implements__ = (interfaces.IPortalTestCase,
+                      interfaces.IPortalSecurity,
+                      base.TestCase.__implements__)
 
-       See doc/IZopeTestCase.py for more.
-    '''
-
     _configure_portal = 1
 
-    def getPortal(self):
-        '''Returns the portal object to the setup code.
-           Will typically be overridden by subclasses
-           to return the object serving as the "portal".
-
-           Note: This method should not be called by tests!
-        '''
-        return self.app[portal_name]
-
-    def createMemberarea(self, member_id):
-        '''Creates a memberarea for the specified member. 
-           Subclasses may override to provide a customized
-           or more lightweight version of the memberarea.
-        '''
-        pm = self.portal.portal_membership
-        pm.createMemberarea(member_id)
-
     def setUp(self):
         '''Sets up the fixture. Do not override,
            use the hooks instead.
@@ -63,7 +46,7 @@
         try:
             self.beforeSetUp()
             self.app = self._app()
-            self.portal = self.getPortal()
+            self.portal = self._portal()
             self._setup()
             self._refreshSkinData()
             self.afterSetUp()
@@ -71,6 +54,10 @@
             self._clear()
             raise
 
+    def _portal(self):
+        '''Returns the portal object for a test.'''
+        return self.getPortal()
+
     def _setup(self):
         '''Configures the portal. Framework authors may
            override.
@@ -104,31 +91,38 @@
         if hasattr(self.portal, 'setupCurrentSkin'):
             self.portal.setupCurrentSkin()
 
-    # Security interfaces
+    # Portal interface
 
+    def getPortal(self):
+        '''Returns the portal object to the setup code.
+           Will typically be overridden by subclasses
+           to return the object serving as the "portal".
+
+           Note: This method should not be called by tests!
+        '''
+        return self.app[portal_name]
+
+    def createMemberarea(self, name):
+        '''Creates a memberarea for the specified user.
+           Subclasses may override to provide a customized
+           or more lightweight version of the memberarea.
+        '''
+        pm = self.portal.portal_membership
+        pm.createMemberarea(name)
+
+    # Security interface
+
     def setRoles(self, roles, name=user_name):
         '''Changes the user's roles.'''
-        self.assertEqual(type(roles), types.ListType)
         uf = self.portal.acl_users
-        uf.userFolderEditUser(name, None, roles, [])
+        uf.userFolderEditUser(name, None, utils.makelist(roles), [])
         if name == getSecurityManager().getUser().getId():
             self.login(name)
 
-    def getRoles(self, name=user_name):
-        '''Returns the user's roles.'''
-        uf = self.portal.acl_users
-        return uf.getUserById(name).getRoles()
-
     def setPermissions(self, permissions, role='Member'):
         '''Changes the permissions assigned to role.'''
-        self.assertEqual(type(permissions), types.ListType)
-        self.portal.manage_role(role, permissions)
+        self.portal.manage_role(role, utils.makelist(permissions))
 
-    def getPermissions(self, role='Member'):
-        '''Returns the permissions assigned to role.'''
-        perms = self.portal.permissionsOfRole(role)
-        return [p['name'] for p in perms if p['selected']]
-
     def login(self, name=user_name):
         '''Logs in.'''
         uf = self.portal.acl_users

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeLite.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeLite.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeLite.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -16,6 +16,9 @@
 
 import os, sys, time
 
+# Allow code to tell it is run by the test framework
+os.environ['ZOPETESTCASE'] = '1'
+
 # Increase performance on MP hardware
 sys.setcheckinterval(2500)
 

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeTestCase.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeTestCase.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/ZopeTestCase.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -11,10 +11,12 @@
 # and 'View' permissions given to his role.
 #
 
-# $Id: ZopeTestCase.py,v 1.21 2004/09/04 18:01:08 shh42 Exp $
+# $Id: ZopeTestCase.py,v 1.29 2005/02/09 12:42:40 shh42 Exp $
 
 import base
-import types
+import functional
+import interfaces
+import utils
 
 from AccessControl import getSecurityManager
 from AccessControl.SecurityManagement import newSecurityManager
@@ -30,13 +32,11 @@
 
 
 class ZopeTestCase(base.TestCase):
-    '''Base test case for Zope testing
+    '''Base test case for Zope testing'''
 
-       __implements__ = (IZopeTestCase, ISimpleSecurity, IExtensibleSecurity)
+    __implements__ = (interfaces.IZopeSecurity,
+                      base.TestCase.__implements__)
 
-       See doc/IZopeTestCase.py for more
-    '''
-
     _setup_fixture = 1
 
     def _setup(self):
@@ -75,31 +75,19 @@
             pass
         base.TestCase._clear(self, call_close_hook)
 
-    # Security interfaces
+    # Security interface
 
     def setRoles(self, roles, name=user_name):
         '''Changes the user's roles.'''
-        self.assertEqual(type(roles), types.ListType)
         uf = self.folder.acl_users
-        uf.userFolderEditUser(name, None, roles, [])
+        uf.userFolderEditUser(name, None, utils.makelist(roles), [])
         if name == getSecurityManager().getUser().getId():
             self.login(name)
 
-    def getRoles(self, name=user_name):
-        '''Returns the user's roles.'''
-        uf = self.folder.acl_users
-        return uf.getUserById(name).getRoles()
-
     def setPermissions(self, permissions, role=user_role):
         '''Changes the user's permissions.'''
-        self.assertEqual(type(permissions), types.ListType)
-        self.folder.manage_role(role, permissions)
+        self.folder.manage_role(role, utils.makelist(permissions))
 
-    def getPermissions(self, role=user_role):
-        '''Returns the user's permissions.'''
-        perms = self.folder.permissionsOfRole(role)
-        return [p['name'] for p in perms if p['selected']]
-
     def login(self, name=user_name):
         '''Logs in.'''
         uf = self.folder.acl_users
@@ -124,6 +112,13 @@
         self.logout()
 
 
+class FunctionalTestCase(functional.Functional, ZopeTestCase):
+    '''Base class for functional Zope tests'''
+
+    __implements__ = (functional.Functional.__implements__,
+                      ZopeTestCase.__implements__)
+
+
 # b/w compatibility names
 _folder_name = folder_name
 _user_name = user_name

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/__init__.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/__init__.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/__init__.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -1,39 +1,41 @@
 #
-# Names exported by the ZopeTestCase module
+# Names exported by the ZopeTestCase package
 #
 
-# $Id: __init__.py,v 1.13 2004/08/19 15:52:55 shh42 Exp $
+# $Id: __init__.py,v 1.25 2005/02/22 14:59:16 shh42 Exp $
 
 import ZopeLite as Zope2
 import utils
 
+from ZopeLite import hasProduct
 from ZopeLite import installProduct
-from ZopeLite import hasProduct
 from ZopeLite import _print
 
-from base import TestCase
-from base import app
-from base import close
-
 from ZopeTestCase import folder_name
 from ZopeTestCase import user_name
 from ZopeTestCase import user_password
 from ZopeTestCase import user_role
 from ZopeTestCase import standard_permissions
 from ZopeTestCase import ZopeTestCase
+from ZopeTestCase import FunctionalTestCase
 
 from PortalTestCase import portal_name
 from PortalTestCase import PortalTestCase
 
+from base import TestCase
+from base import app
+from base import close
+
 from profiler import Profiled
 from sandbox import Sandboxed
 from functional import Functional
 
+from warnhook import WarningsHook
 from unittest import main
 
-# Convenience class for functional unit testing
-class FunctionalTestCase(Functional, ZopeTestCase):
-    pass
+# TODO
+#from doctest import ZopeDocFileSuite
+#from doctest import FunctionalDocFileSuite
 
 # b/w compatibility names
 _folder_name = folder_name

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/base.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/base.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/base.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -10,6 +10,7 @@
 import transaction
 import profiler
 import utils
+import interfaces
 
 from AccessControl.SecurityManagement import noSecurityManager
 
@@ -35,12 +36,11 @@
 
 class TestCase(profiler.Profiled, unittest.TestCase):
     '''Base test case for Zope testing
+    '''
 
-       __implements__ = (IZopeTestCase,)
+    __implements__ = (interfaces.IZopeTestCase,
+                      profiler.Profiled.__implements__)
 
-       See doc/IZopeTestCase.py for more
-    '''
-
     def afterSetUp(self):
         '''Called after setUp() has completed. This is
            far and away the most useful hook.
@@ -107,6 +107,7 @@
         '''Sets up the fixture. Framework authors may
            override.
         '''
+        pass
 
     def _clear(self, call_close_hook=0):
         '''Clears the fixture.'''

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/API.stx
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/API.stx	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/API.stx	2005-03-14 18:54:17 UTC (rev 29465)
@@ -41,18 +41,22 @@
 
     Classes
 
-        TestCase
-
         ZopeTestCase
 
+        FunctionalTestCase
+
         PortalTestCase
 
+        TestCase
+
         Profiled
 
         Sandboxed
 
         Functional
 
+        WarningsHook
+
     Modules
 
         ZopeLite as Zope
@@ -87,7 +91,7 @@
 
 Module base
 
-    Bare-bones base test case for Zope testing
+    Basic infrastructure for Zope testing
 
     Functions
 
@@ -103,9 +107,12 @@
 
 Class TestCase
 
-    Bare-bones base test case for Zope testing
+    Base test case for Zope testing
     (derived from unittest.TestCase)
 
+    __implements__ = (IZopeTestCase,
+                      Profiled.__implements__)
+
     Methods
 
         afterSetUp()
@@ -139,30 +146,45 @@
     Classes
 
         ZopeTestCase
-        
-        
 
+        FunctionalTestCase
+
+
+
 Class ZopeTestCase
 
     Base test case for Zope testing
     (derived from base.TestCase)
 
+    __implements__ = (IZopeSecurity,
+                      TestCase.__implements__)
+
     Methods
 
         setRoles(roles, name=user_name)
 
-        getRoles(name=user_name)
-
         setPermissions(permissions, role=user_role)
 
-        getPermissions(role=user_role)
-
         login(name=user_name)
 
         logout()
 
 
 
+Class FunctionalTestCase
+
+    Base class for functional unit tests
+    (derived from ZopeTestCase)
+
+    __implements__ = (Functional.__implements__,
+                      ZopeTestCase.__implements__)
+
+    Methods
+
+        *See base classes*
+
+
+
 Module PortalTestCase
 
     Test case and fixture for testing CMF-based applications
@@ -179,13 +201,17 @@
 
         PortalTestCase
 
- 
 
+
 Class PortalTestCase
 
     Base test case for CMF testing
     (derived from base.TestCase)
 
+    __implements__ = (IPortalTestCase,
+                      IPortalSecurity,
+                      TestCase.__implements__)
+
     Methods
 
         getPortal()
@@ -194,12 +220,8 @@
 
         setRoles(roles, name=user_name)
 
-        getRoles(name=user_name)
-
         setPermissions(permissions, role='Member')
 
-        getPermissions(role='Member')
-
         login(name=user_name)
 
         logout()
@@ -228,6 +250,8 @@
 
     Profiling support mix-in for xTestCases
 
+    __implements__ = (IProfiled,)
+
     Methods
 
         runcall(func, *args, **kw)
@@ -268,12 +292,42 @@
 
     Functional testing mix-in for xTestCases
 
+    __implements__ = (IFunctional,)
+
     Methods
 
-        publish(path, basic=None, env=None, extra=None, request_method='GET')
+        publish(path, basic=None, env=None, extra=None, request_method='GET', stdin=None)
 
 
 
+Module warnhook
+
+    Support for capturing Python warning messages
+
+    Classes
+
+        WarningsHook
+
+
+
+Class WarningsHook
+
+    Facility to capture warnings generated by Python
+
+    Attributes
+
+        warnings
+
+    Methods
+
+        install()
+
+        uninstall()
+
+        clear()
+
+
+
 Module utils
 
     Utility functions to extend the test environment

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt	2005-03-14 18:54:17 UTC (rev 29465)
@@ -1,3 +1,30 @@
+0.9.6
+- Dropped support for Zope 2.5 as it lacks the setSecurityManager() API.
+- Moved interfaces from doc section to interfaces.py module.
+- Test classes now assert their interfaces.
+- Refactored security interfaces to IZopeSecurity and IPortalSecurity.
+- Added a class diagram to the doc section.
+- setRoles() and setPermissions() no longer insist on ListType arguments
+  but now accept lists, tuples, and strings.
+- getRoles() and getPermissions() are no longer part of the security API
+  because of YAGNI.
+- Added getHeader() and getCookie() accessors to the response wrapper
+  used in functional tests.
+- publish() now accepts an optional 'stdin' argument, allowing to pass
+  the input stream for POST and PUT requests.
+- runalltests.py now supports a '-R' (recursive) command line option.
+
+0.9.4 (not released)
+- Backported functional doc tests from Zope 3.
+- Included a copy of doctest.py from Zope 3 (which is copied from
+  Python2.4 CVS). It will be removed when we start requiring Python2.4.
+- Added dochttp.py script from Zope 3, which is used to convert
+  tcpwatch.py output to functional doc tests.
+- Added warnhook.py from ZODB. It is used to capture the output of
+  warnings.warn() calls.
+- Added missing 'user_password' constant.
+- Many thanks to Sidnei da Silva!
+
 0.9.2
 - Introduced new base.TestCase class which contains the bare-
   bones framework code and serves as baseclass for ZTC and PTC.
@@ -26,7 +53,7 @@
 - ZopeLite now loads silently if it does not control the import process.
 
 0.8.6
-- Revised and amended much of the existing documentation. 
+- Revised and amended much of the existing documentation.
 - Added an API reference (skeleton), API.stx.
 - Documented what's going on when tests are run in TIMELINES.txt.
 - Fixed issues with testZODBCompat.py and Zope < 2.6.
@@ -35,15 +62,15 @@
 
 0.8.4
 - framework.py now flushes stdout to not mess up the output in batch mode.
-- framework.py no longer adds os.pardir to the sys.path. Thanks to 
+- framework.py no longer adds os.pardir to the sys.path. Thanks to
   Yoshinori Okuji.
 - Made sure user objects are not inadvertently wrapped twice by login().
-- Made sure "renegade" transactions are aborted if something goes wrong 
+- Made sure "renegade" transactions are aborted if something goes wrong
   during the setup phase.
 - initialize_cache() is no longer called for Zope 2.7.
 
 0.8.2
-- Removed the leading underscores from all constant names. They proved 
+- Removed the leading underscores from all constant names. They proved
   non-private in "real life" anyway. The old names are still available
   for backward compatibility, but are deprecated.
 - Removed NO_PRODUCT_LOAD for reasons of obscureness and YAGNI.
@@ -62,7 +89,7 @@
   role-mapping assumes it can append to it. :-/
 
 0.7.0
-- Fixed a bug that caused setRoles() to only work with the 
+- Fixed a bug that caused setRoles() to only work with the
   default user folder. Refactored the fixture code in the process.
 - Reworked the connection registry and wrote tests for it.
 - Made afterClear() largely redundant because it turned out to be just that.
@@ -77,13 +104,13 @@
 - Added IZopeTestCase and IZopeTestCaseFX interfaces.
 
 0.6.2
-- The effects of setting INSTANCE_HOME have been changed to something 
+- The effects of setting INSTANCE_HOME have been changed to something
   less surprising. Please see ENVIRONMENT.txt for details.
-- Now uses the environment variable ZEO_INSTANCE_HOME to enable ZEO 
+- Now uses the environment variable ZEO_INSTANCE_HOME to enable ZEO
   support.
 
 0.6.0
-- Use a module-level database connection registry to avoid freezing 
+- Use a module-level database connection registry to avoid freezing
   after too many errors.
 - All tests are now transactional by default.
 - Added beforeSetUp() and beforeClose() hooks to the ZopeTestCase class.
@@ -99,7 +126,7 @@
 - Hardening in the face of incomplete Zope installations.
 
 0.5.2
-- Delete ZEO_CLIENT environment variable to enforce a temporary client 
+- Delete ZEO_CLIENT environment variable to enforce a temporary client
   cache. Repair Zope 2.4 Testing package issue in the process.
 - Provide NO_PRODUCT_LOAD environment variable for completeness.
 - Added hasProduct() method to allow testing for product availability.

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/FunctionalTesting.stx
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/FunctionalTesting.stx	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/FunctionalTesting.stx	2005-03-14 18:54:17 UTC (rev 29465)
@@ -7,7 +7,7 @@
 
     Deriving from the 'Functional' mix-in (and an xTestCase) adds a
     'publish' method to your test case class. Tests can call
-    'self.publish(path, basic=None, env=None, extra=None, request_method='GET')', 
+    'self.publish(path, basic=None, env=None, extra=None, request_method='GET', stdin=None)', 
     passing a path and, optionally, basic-auth info and form data. 
     The path may contain a query string.
 

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/HOWTO.stx
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/HOWTO.stx	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/HOWTO.stx	2005-03-14 18:54:17 UTC (rev 29465)
@@ -204,7 +204,7 @@
 
         - The ZopeTestCase class is defined in file 'ZopeTestCase.py'.
 
-        - The interfaces implemented by this class are documented in 'doc/IZopeTestCase.py'.
+        - The interfaces implemented by this class are documented in 'interfaces.py'.
 
         - All names exported by the ZopeTestCase package are listed in '__init__.py'. 
 

Deleted: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/INSTALL.stx
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/INSTALL.stx	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/INSTALL.stx	2005-03-14 18:54:17 UTC (rev 29465)
@@ -1,24 +0,0 @@
-<style type="text/css"> <!-- li { margin: 1em } --> </style>
-
-Installation Instructions for ZopeTestCase
-
-    Requires Python 2.1 and Zope 2.5 or higher
-
-    1. Extract the tarball into the 'lib/python/Testing'
-       directory of your Zope installation.
-
-    2. Cd into the ZopeTestCase directory and execute 
-       'python runalltests.py' to test the package and to 
-       make sure all modules get compiled.
-
-       You must use the same Python that is running your 
-       Zope here. On Windows this may for example be::
-
-         "C:\Program Files\Zope\bin\python.exe" runalltests.py
-
-    3. See the HOWTO for the big picture, the README for 
-       getting started with your own tests.
-
-    Visit the "ZopeTestCaseWiki":http://zope.org/Members/shh/ZopeTestCaseWiki
-    for additional documentation.
-

Deleted: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/IZopeTestCase.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/IZopeTestCase.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/IZopeTestCase.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -1,122 +0,0 @@
-from Interface import Interface
-
-# $Id: IZopeTestCase.py,v 1.14 2004/09/04 18:01:11 shh42 Exp $
-
-
-#
-#   ZopeTestCase.__implements__ = (
-#           IZopeTestCase, ISimpleSecurity, IExtensibleSecurity)
-#
-#   PortalTestCase.__implements__ = (
-#           IPortalTestCase, ISimpleSecurity, IExtensibleSecurity)
-#
-
-
-class ISimpleSecurity(Interface):
-
-    def setRoles(roles):
-        '''Changes the user's roles.'''
-
-    def getRoles():
-        '''Returns the user's roles.'''
-
-    def setPermissions(permissions):
-        '''Changes the user's permissions.'''
-
-    def getPermissions():
-        '''Returns the user's permissions.'''
-
-    def login():
-        '''Logs in.'''
-
-    def logout():
-        '''Logs out.'''
-
-
-class IExtensibleSecurity(Interface):
-
-    def setRoles(roles, name):
-        '''Changes the roles assigned to a user.'''
-
-    def getRoles(name):
-        '''Returns the specified user's roles.'''
-
-    def setPermissions(permissions, role):
-        '''Changes the permissions assigned to a role.'''
-
-    def getPermissions(role):
-        '''Returns the permissions assigned to a role.'''
-
-    def login(name):
-        '''Logs in as the specified user.'''
-
-    def logout():
-        '''Logs out.'''
-
-
-class IZopeTestCase(Interface):
-
-    def afterSetUp():
-        '''Called after setUp() has completed. This is
-           far and away the most useful hook.
-        '''
-
-    def beforeTearDown():
-        '''Called before tearDown() is executed.
-           Note that tearDown() is not called if
-           setUp() fails.
-        '''
-
-    def afterClear():
-        '''Called after the fixture has been cleared.
-           Note that this may occur during setUp() *and*
-           tearDown().
-        '''
-
-    def beforeSetUp():
-        '''Called before the ZODB connection is opened,
-           at the start of setUp(). By default begins a
-           new transaction.
-        '''
-
-    def beforeClose():
-        '''Called before the ZODB connection is closed,
-           at the end of tearDown(). By default aborts
-           the transaction.
-        '''
-
-
-class IPortalTestCase(IZopeTestCase):
-
-    def getPortal():
-        '''Returns the portal object to the setup code.
-           Will typically be overridden by subclasses
-           to return the object serving as the "portal".
-
-           Note: This method should not be called by tests!
-        '''
-
-    def createMemberarea(member_id):
-        '''Creates a memberarea for the specified member.
-           Subclasses may override to provide a customized 
-           or more lightweight version of the memberarea.
-        '''
-
-
-class IProfiled(Interface):
-
-    def runcall(func, *args, **kw):
-        '''Allows to run a function under profiler control
-           adding to the accumulated profiler statistics.
-        '''
-
-
-class IFunctional(Interface):
-
-    def publish(path, basic=None, env=None, extra=None, request_method='GET'):
-        '''Publishes the object at 'path' returning an
-           extended response object. The path may contain 
-           a query string.
-        '''
-
-

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/PortalTestCase.stx
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/PortalTestCase.stx	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/PortalTestCase.stx	2005-03-14 18:54:17 UTC (rev 29465)
@@ -85,7 +85,7 @@
 
     As always, I recommend to look at the source code of both 
     'ZopeTestCase.py' and 'PortalTestCase.py' for all the details you may need.
-    Interface documentation can be found in 'doc/IZopeTestCase.py'.
+    Interface documentation can be found in 'interfaces.py'.
 
     The test framework shipping with Plone 2.0 is a good example of how the 
     PortalTestCase class can be put to use.

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/SECURITY.stx
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/SECURITY.stx	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/SECURITY.stx	2005-03-14 18:54:17 UTC (rev 29465)
@@ -33,16 +33,10 @@
     - **'self.setRoles(roles, name=user_name)'** allows to change the roles assigned to a user.
       If the 'name' argument is omitted, changes the roles of the default user.
 
-    - **'self.getRoles(name=user_name)'** returns the roles assigned to a user. If the name argument is
-      omitted, returns the roles assigned to the default user.
-
     - **'self.setPermissions(permissions, role=user_role)'** allows to change the permissions
       assigned to a role. If the 'role' argument is omitted, changes the permissions of the
       default role.
 
-    - **'self.getPermissions(role=user_role)'** return the permissions assigned to a role. If the role
-      argument is omitted, returns the permissions assigned to the default role.
-
     - **'self.login(name=user_name)'** allows to log in as a specified user.
       If the 'name' argument is omitted, logs in as the default user.
 
@@ -50,12 +44,12 @@
 
 Testing Security
 
-    - **'ob.restrictedTraverse(attr)'** is a simple way to check whether the currently logged in user is
+    - **'ob.restrictedTraverse("attr")'** is a simple way to check whether the currently logged in user is
       allowed to access attribute 'attr' of object 'ob'.
 
-    - **'getSecurityManager().validate(None, ob, attr, ob.attr)'** uses the security manager to do the same.
+    - **'getSecurityManager().validate(None, ob, "attr", ob.attr)'** uses the security manager to do the same.
       The convenience method 'getSecurityManager().validateValue(ob.attr)' will no longer work 
-      in Zope 2.8 (from what I hear).
+      in Zope 2.8.
 
     Also see the 'testPythonScript.py' example test.
 

Deleted: Zope/trunk/lib/python/Testing/ZopeTestCase/doc/VERSION.txt
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/doc/VERSION.txt	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/doc/VERSION.txt	2005-03-14 18:54:17 UTC (rev 29465)
@@ -1,6 +0,0 @@
-ZopeTestCase 0.9.2
-(c) 2002-2004, Stefan H. Holek, stefan at epy.co.at 
-http://zope.org/Members/shh/ZopeTestCase
-License: ZPL
-Zope: 2.5-2.8
-

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -8,29 +8,38 @@
 import sys, re, base64
 import transaction
 import sandbox
+import interfaces
 
 
 class Functional(sandbox.Sandboxed):
-    '''Derive from this class and an xTestCase to get functional 
+    '''Derive from this class and an xTestCase to get functional
        testing support::
-    
+
            class MyTest(Functional, ZopeTestCase):
                ...
     '''
 
-    def publish(self, path, basic=None, env=None, extra=None, request_method='GET'):
-        '''Publishes the object at 'path' returning an enhanced response object.'''
+    __implements__ = (interfaces.IFunctional,)
 
+    def publish(self, path, basic=None, env=None, extra=None, request_method='GET', stdin=None):
+        '''Publishes the object at 'path' returning a response object.'''
+
         from StringIO import StringIO
         from ZPublisher.Response import Response
         from ZPublisher.Test import publish_module
 
+        from AccessControl.SecurityManagement import getSecurityManager
+        from AccessControl.SecurityManagement import setSecurityManager
+
+        # Save current security manager
+        sm = getSecurityManager()
+
         # Commit the sandbox for good measure
         transaction.commit()
 
-        if env is None: 
+        if env is None:
             env = {}
-        if extra is None: 
+        if extra is None:
             extra = {}
 
         request = self.app.REQUEST
@@ -40,26 +49,32 @@
         env['REQUEST_METHOD'] = request_method
 
         p = path.split('?')
-        if len(p) == 1: 
+        if len(p) == 1:
             env['PATH_INFO'] = p[0]
-        elif len(p) == 2: 
+        elif len(p) == 2:
             [env['PATH_INFO'], env['QUERY_STRING']] = p
-        else: 
+        else:
             raise TypeError, ''
 
         if basic:
             env['HTTP_AUTHORIZATION'] = "Basic %s" % base64.encodestring(basic)
 
+        if stdin is None:
+            stdin = sys.stdin
+
         outstream = StringIO()
-        response = Response(stdout=outstream, stderr=sys.stderr) 
+        response = Response(stdout=outstream, stderr=sys.stderr)
 
-        publish_module('Zope2', response=response, environ=env, extra=extra)
+        publish_module('Zope2', response=response, stdin=stdin, environ=env, extra=extra)
 
+        # Restore security manager
+        setSecurityManager(sm)
+
         return ResponseWrapper(response, outstream, path)
 
 
 class ResponseWrapper:
-    '''Acts like a response object with some additional introspective methods.'''
+    '''Decorates a response object with additional introspective methods.'''
 
     _bodyre = re.compile('^$^\n(.*)', re.MULTILINE | re.DOTALL)
 
@@ -68,6 +83,9 @@
         self._outstream = outstream
         self._path = path
 
+    def __getattr__(self, name):
+        return getattr(self._response, name)
+
     def getOutput(self):
         '''Returns the complete output, headers and all.'''
         return self._outstream.getvalue()
@@ -83,6 +101,11 @@
         '''Returns the path used by the request.'''
         return self._path
 
-    def __getattr__(self, name):
-        return getattr(self._response, name)
+    def getHeader(self, name):
+        '''Returns the value of a response header.'''
+        return self.headers.get(name.lower())
 
+    def getCookie(self, name):
+        '''Returns a response cookie.'''
+        return self.cookies.get(name)
+

Added: Zope/trunk/lib/python/Testing/ZopeTestCase/interfaces.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/interfaces.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/interfaces.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -0,0 +1,107 @@
+#
+# ZopeTestCase interfaces
+#
+
+# $Id: interfaces.py,v 1.5 2005/02/07 21:59:35 shh42 Exp $
+
+try:
+    from Interface import Interface
+except ImportError:
+    # Old interface package
+    from Interface import Base as Interface
+
+
+class IZopeTestCase(Interface):
+
+    def afterSetUp():
+        '''Called after setUp() has completed. This is
+           far and away the most useful hook.
+        '''
+
+    def beforeTearDown():
+        '''Called before tearDown() is executed.
+           Note that tearDown() is not called if
+           setUp() fails.
+        '''
+
+    def afterClear():
+        '''Called after the fixture has been cleared.
+           Note that this may occur during setUp() *and*
+           tearDown().
+        '''
+
+    def beforeSetUp():
+        '''Called before the ZODB connection is opened,
+           at the start of setUp(). By default begins a
+           new transaction.
+        '''
+
+    def beforeClose():
+        '''Called before the ZODB connection is closed,
+           at the end of tearDown(). By default aborts
+           the transaction.
+        '''
+
+
+class IZopeSecurity(Interface):
+
+    def setRoles(roles, name=None):
+        '''Changes the roles assigned to a user.
+           If the 'name' argument is omitted, changes the
+           roles of the default user.
+        '''
+
+    def setPermissions(permissions, role=None):
+        '''Changes the permissions assigned to a role.
+           If the 'role' argument is omitted, changes the
+           permissions assigned to the default role.
+        '''
+
+    def login(name=None):
+        '''Logs in as the specified user.
+           If the 'name' argument is omitted, logs in
+           as the default user.
+        '''
+
+    def logout():
+        '''Logs out.'''
+
+
+class IPortalTestCase(IZopeTestCase):
+
+    def getPortal():
+        '''Returns the portal object to the setup code.
+           Will typically be overridden by subclasses
+           to return the object serving as the "portal".
+
+           Note: This method should not be called by tests!
+        '''
+
+    def createMemberarea(name):
+        '''Creates a memberarea for the specified user.
+           Subclasses may override to provide a customized
+           or more lightweight version of the memberarea.
+        '''
+
+
+class IPortalSecurity(IZopeSecurity):
+    '''This is currently the same as IZopeSecurity'''
+
+
+class IProfiled(Interface):
+
+    def runcall(func, *args, **kw):
+        '''Allows to run a function under profiler control
+           adding to the accumulated profiler statistics.
+        '''
+
+
+class IFunctional(Interface):
+
+    def publish(path, basic=None, env=None, extra=None, request_method='GET', stdin=None):
+        '''Publishes the object at 'path' returning an
+           extended response object. The path may contain 
+           a query string.
+        '''
+
+


Property changes on: Zope/trunk/lib/python/Testing/ZopeTestCase/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/profiler.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/profiler.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/profiler.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -2,9 +2,10 @@
 # Profiling support for ZTC
 #
 
-# $Id: profiler.py,v 1.2 2004/01/12 18:45:42 shh42 Exp $
+# $Id: profiler.py,v 1.3 2005/01/01 14:02:44 shh42 Exp $
 
 import os, sys
+import interfaces
 
 from profile import Profile
 from pstats import Stats
@@ -35,8 +36,8 @@
 def dump_stats(filename):
     if _have_stats:
         _profile.dump_stats(filename)
-    
 
+
 class Profiled:
     '''Derive from this class and an xTestCase to get profiling support::
 
@@ -50,6 +51,8 @@
        Profiler statistics will be printed after the test results.
     '''
 
+    __implements__ = (interfaces.IProfiled,)
+
     def runcall(self, *args, **kw):
         return apply(runcall, args, kw)
 

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/runalltests.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/runalltests.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/runalltests.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -1,29 +1,40 @@
 #
-# Runs all tests in the current directory
+# Runs all tests in the current directory [and below]
 #
 # Execute like:
-#   python runalltests.py
+#   python runalltests.py [-R]
 #
-# Alternatively use the testrunner: 
-#   python /path/to/Zope/utilities/testrunner.py -qa
+# Alternatively use the testrunner:
+#   python /path/to/Zope/bin/testrunner.py -qa
 #
 
 import os, sys
 if __name__ == '__main__':
-    execfile(os.path.join(sys.path[0], 'framework.py')) 
+    execfile(os.path.join(sys.path[0], 'framework.py'))
 
-import unittest
+import unittest, imp
 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')]
+def visitor(recursive, dir, names):
+    tests = [n[:-3] for n in names 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())
+    for test in tests:
+        saved_syspath = sys.path[:]
+        sys.path.insert(0, dir)
+        try:
+            fp, path, desc = imp.find_module(test, [dir])
+            m = imp.load_module(test, fp, path, desc)
+            if hasattr(m, 'test_suite'):
+                suite.addTest(m.test_suite())
+        finally:
+            fp.close()
+            sys.path[:] = saved_syspath
 
+    if not recursive:
+        names[:] = []
+
 if __name__ == '__main__':
+    os.path.walk(os.curdir, visitor, '-R' in sys.argv)
     TestRunner().run(suite)
 

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/testBaseTestCase.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testBaseTestCase.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testBaseTestCase.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -9,7 +9,7 @@
 # way of getting started.
 #
 
-# $Id: testBaseTestCase.py,v 1.2 2004/09/04 18:56:41 shh42 Exp $
+# $Id: testBaseTestCase.py,v 1.7 2005/02/09 12:42:40 shh42 Exp $
 
 import os, sys
 if __name__ == '__main__':
@@ -285,6 +285,43 @@
         self.failIfEqual(request.get('BASE2', ''), '')
 
 
+class TestListConverter(base.TestCase):
+
+    def testList0(self):
+        self.assertEqual(utils.makelist([]), [])
+
+    def testList1(self):
+        self.assertEqual(utils.makelist(['foo']), ['foo'])
+
+    def testList2(self):
+        self.assertEqual(utils.makelist(['foo', 'bar']), ['foo', 'bar'])
+
+    def testTuple0(self):
+        self.assertEqual(utils.makelist(()), [])
+
+    def testTuple1(self):
+        self.assertEqual(utils.makelist(('foo',)), ['foo'])
+
+    def testTuple2(self):
+        self.assertEqual(utils.makelist(('foo', 'bar')), ['foo', 'bar'])
+
+    def testString0(self):
+        self.assertEqual(utils.makelist(''), [])
+
+    def testString1(self):
+        self.assertEqual(utils.makelist('foo'), ['foo'])
+
+    def testString2(self):
+        self.assertEqual(utils.makelist('foo, bar'), ['foo, bar'])
+
+    def testInteger(self):
+        self.assertRaises(ValueError, utils.makelist, 0)
+
+    def testObject(self):
+        class dummy: pass
+        self.assertRaises(ValueError, utils.makelist, dummy())
+
+
 def test_suite():
     from unittest import TestSuite, makeSuite
     suite = TestSuite()
@@ -293,6 +330,7 @@
     suite.addTest(makeSuite(TestTearDownRaises))
     suite.addTest(makeSuite(TestConnectionRegistry))
     suite.addTest(makeSuite(TestRequestVariables))
+    suite.addTest(makeSuite(TestListConverter))
     return suite
 
 if __name__ == '__main__':

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/testFunctional.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testFunctional.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testFunctional.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -2,7 +2,7 @@
 # Example functional ZopeTestCase
 #
 
-# $Id: testFunctional.py,v 1.7 2004/09/04 18:01:08 shh42 Exp $
+# $Id: testFunctional.py,v 1.16 2005/02/12 13:13:04 shh42 Exp $
 
 import os, sys
 if __name__ == '__main__':
@@ -12,27 +12,57 @@
 
 ZopeTestCase.installProduct('PythonScripts')
 
+from Testing.ZopeTestCase import user_name
+from Testing.ZopeTestCase import user_password
 
-class TestFunctional(ZopeTestCase.Functional, ZopeTestCase.ZopeTestCase):
+from AccessControl import getSecurityManager
+from AccessControl.Permissions import view
+from AccessControl.Permissions import manage_properties
+from AccessControl.Permissions import add_documents_images_and_files
+from AccessControl.Permissions import change_dtml_documents
 
+from StringIO import StringIO
+from urllib import urlencode
+
+
+class TestFunctional(ZopeTestCase.FunctionalTestCase):
+
     def afterSetUp(self):
-        self.folder_path = '/%s' % self.folder.absolute_url(1)
-        self.basic_auth = '%s:%s' % (ZopeTestCase.user_name, ZopeTestCase.user_password)
+        self.folder_path = '/'+self.folder.absolute_url(1)
+        self.basic_auth = '%s:%s' % (user_name, user_password)
 
-        self.folder.addDTMLMethod('index_html', file='foo')
+        # A simple document
+        self.folder.addDTMLDocument('index_html', file='index')
 
-        dispatcher = self.folder.manage_addProduct['PythonScripts']
-        dispatcher.manage_addPythonScript('script')
-        self.folder.script.ZPythonScript_edit('a=0', 'return a+1')
+        # A document accessible only to its owner
+        self.folder.addDTMLDocument('secret_html', file='secret')
+        self.folder.secret_html.manage_permission(view, ['Owner'])
 
-        self.folder.manage_addFolder('object', '')
-        self.folder.addDTMLMethod('change_title', 
-            file='''<dtml-call "manage_changeProperties(title=REQUEST.get('title'))">''')
+        # A Python Script performing integer computation
+        self.folder.manage_addProduct['PythonScripts'].manage_addPythonScript('script')
+        self.folder.script.ZPythonScript_edit(params='a=0', body='return a+1')
 
+        # A method redirecting to the Zope root
+        redirect = '''<dtml-call "RESPONSE.redirect('%s')">''' % self.app.absolute_url()
+        self.folder.addDTMLMethod('redirect', file=redirect)
+
+        # A method setting a cookie
+        set_cookie = '''<dtml-call "RESPONSE.setCookie('foo', 'Bar', path='/')">'''
+        self.folder.addDTMLMethod('set_cookie', file=set_cookie)
+
+        # A method changing the title property of an object
+        change_title = '''<dtml-call "manage_changeProperties(title=REQUEST.get('title'))">'''
+        self.folder.addDTMLMethod('change_title', file=change_title)
+
+    def testPublishFolder(self):
+        response = self.publish(self.folder_path)
+        self.assertEqual(response.getStatus(), 200)
+        self.assertEqual(response.getBody(), 'index')
+
     def testPublishDocument(self):
         response = self.publish(self.folder_path+'/index_html')
         self.assertEqual(response.getStatus(), 200)
-        self.assertEqual(response.getBody(), 'foo')
+        self.assertEqual(response.getBody(), 'index')
 
     def testPublishScript(self):
         response = self.publish(self.folder_path+'/script')
@@ -49,26 +79,87 @@
         self.assertEqual(response.getStatus(), 500)
 
     def testUnauthorized(self):
-        self.folder.index_html.manage_permission('View', ['Owner'])
-        response = self.publish(self.folder_path+'/index_html')
+        response = self.publish(self.folder_path+'/secret_html')
         self.assertEqual(response.getStatus(), 401)
 
-    def testBasicAuthentication(self):
-        self.folder.index_html.manage_permission('View', ['Owner'])
-        response = self.publish(self.folder_path+'/index_html',
-                                self.basic_auth)
+    def testBasicAuth(self):
+        response = self.publish(self.folder_path+'/secret_html', self.basic_auth)
         self.assertEqual(response.getStatus(), 200)
-        self.assertEqual(response.getBody(), 'foo')
+        self.assertEqual(response.getBody(), 'secret')
 
-    def testModifyObject(self):
-        from AccessControl.Permissions import manage_properties
+    def testRedirect(self):
+        response = self.publish(self.folder_path+'/redirect')
+        self.assertEqual(response.getStatus(), 302)
+        self.assertEqual(response.getHeader('Location'), self.app.absolute_url())
+
+    def testCookie(self):
+        response = self.publish(self.folder_path+'/set_cookie')
+        self.assertEqual(response.getStatus(), 200)
+        self.assertEqual(response.getCookie('foo').get('value'), 'Bar')
+        self.assertEqual(response.getCookie('foo').get('path'), '/')
+
+    def testChangeTitle(self):
+        # Change the title of a document
         self.setPermissions([manage_properties])
-        response = self.publish(self.folder_path+'/object/change_title?title=Foo',
+
+        # Note that we must pass basic auth info
+        response = self.publish(self.folder_path+'/index_html/change_title?title=Foo',
                                 self.basic_auth)
+
         self.assertEqual(response.getStatus(), 200)
-        self.assertEqual(self.folder.object.title_or_id(), 'Foo')
+        self.assertEqual(self.folder.index_html.title_or_id(), 'Foo')
 
+    def testPOST(self):
+        # Change the title in a POST request
+        self.setPermissions([manage_properties])
 
+        form = {'title': 'Foo'}
+        post_data = StringIO(urlencode(form))
+
+        response = self.publish(self.folder_path+'/index_html/change_title',
+                                request_method='POST', stdin=post_data,
+                                basic=self.basic_auth)
+
+        self.assertEqual(response.getStatus(), 200)
+        self.assertEqual(self.folder.index_html.title_or_id(), 'Foo')
+
+    def testPUTExisting(self):
+        # FTP new data into an existing object
+        self.setPermissions([change_dtml_documents])
+
+        put_data = StringIO('foo')
+        response = self.publish(self.folder_path+'/index_html',
+                                request_method='PUT', stdin=put_data,
+                                basic=self.basic_auth)
+
+        self.assertEqual(response.getStatus(), 204)
+        self.assertEqual(self.folder.index_html(), 'foo')
+
+    def testPUTNew(self):
+        # Create a new object via FTP or WebDAV
+        self.setPermissions([add_documents_images_and_files])
+
+        put_data = StringIO('foo')
+        response = self.publish(self.folder_path+'/new_document',
+                                env={'CONTENT_TYPE': 'text/html'},
+                                request_method='PUT', stdin=put_data,
+                                basic=self.basic_auth)
+
+        self.assertEqual(response.getStatus(), 201)
+        self.failUnless('new_document' in self.folder.objectIds())
+        self.assertEqual(self.folder.new_document.meta_type, 'DTML Document')
+        self.assertEqual(self.folder.new_document(), 'foo')
+
+    def testSecurityContext(self):
+        # The authenticated user should not change as a result of publish
+        self.assertEqual(getSecurityManager().getUser().getId(), user_name)
+
+        self.folder.acl_users.userFolderAddUser('barney', 'secret', [], [])
+        response = self.publish(self.folder_path, basic='barney:secret')
+
+        self.assertEqual(getSecurityManager().getUser().getId(), user_name)
+
+
 def test_suite():
     from unittest import TestSuite, makeSuite
     suite = TestSuite()

Added: Zope/trunk/lib/python/Testing/ZopeTestCase/testInterfaces.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testInterfaces.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testInterfaces.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -0,0 +1,99 @@
+#
+# Interface tests
+#
+
+# $Id: testInterfaces.py,v 1.3 2005/01/01 20:38:16 shh42 Exp $
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Testing import ZopeTestCase
+from Testing.ZopeTestCase.interfaces import *
+
+try:
+    from Interface.Verify import verifyObject
+    have_verify = 1
+except ImportError:
+    print 'testInterfaces.py: The tests in this module require Zope >= 2.6'
+    have_verify = 0
+
+
+class TestBaseTestCase(ZopeTestCase.TestCase):
+
+    _setup_fixture = 0
+
+    def testIProfiled(self):
+        self.failUnless(verifyObject(IProfiled, self))
+
+    def testIZopeTestCase(self):
+        self.failUnless(verifyObject(IZopeTestCase, self))
+
+
+class TestZopeTestCase(ZopeTestCase.ZopeTestCase):
+
+    _setup_fixture = 0
+
+    def testIProfiled(self):
+        self.failUnless(verifyObject(IProfiled, self))
+
+    def testIZopeTestCase(self):
+        self.failUnless(verifyObject(IZopeTestCase, self))
+
+    def testIZopeSecurity(self):
+        self.failUnless(verifyObject(IZopeSecurity, self))
+
+
+class TestFunctionalTestCase(ZopeTestCase.FunctionalTestCase):
+
+    _setup_fixture = 0
+
+    def testIFunctional(self):
+        self.failUnless(verifyObject(IFunctional, self))
+
+    def testIProfiled(self):
+        self.failUnless(verifyObject(IProfiled, self))
+
+    def testIZopeTestCase(self):
+        self.failUnless(verifyObject(IZopeTestCase, self))
+
+    def testIZopeSecurity(self):
+        self.failUnless(verifyObject(IZopeSecurity, self))
+
+
+class TestPortalTestCase(ZopeTestCase.PortalTestCase):
+
+    _configure_portal = 0
+
+    def getPortal(self):
+        return None
+
+    def testIProfiled(self):
+        self.failUnless(verifyObject(IProfiled, self))
+
+    def testIZopeTestCase(self):
+        self.failUnless(verifyObject(IZopeTestCase, self))
+
+    def testIZopeSecurity(self):
+        self.failUnless(verifyObject(IZopeSecurity, self))
+
+    def testIPortalTestCase(self):
+        self.failUnless(verifyObject(IPortalTestCase, self))
+
+    def testIPortalSecurity(self):
+        self.failUnless(verifyObject(IPortalSecurity, self))
+
+
+def test_suite():
+    from unittest import TestSuite, makeSuite
+    suite = TestSuite()
+    if have_verify:
+        suite.addTest(makeSuite(TestBaseTestCase))
+        suite.addTest(makeSuite(TestZopeTestCase))
+        suite.addTest(makeSuite(TestFunctionalTestCase))
+        suite.addTest(makeSuite(TestPortalTestCase))
+    return suite
+
+if __name__ == '__main__':
+    framework()
+


Property changes on: Zope/trunk/lib/python/Testing/ZopeTestCase/testInterfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/testPortalTestCase.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testPortalTestCase.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testPortalTestCase.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -9,7 +9,7 @@
 # way of getting started.
 #
 
-# $Id: testPortalTestCase.py,v 1.24 2004/09/09 18:48:59 shh42 Exp $
+# $Id: testPortalTestCase.py,v 1.30 2005/01/30 14:22:48 shh42 Exp $
 
 import os, sys
 if __name__ == '__main__':
@@ -20,8 +20,9 @@
 from Acquisition import aq_base
 from AccessControl import getSecurityManager
 from types import ListType
-from transaction import begin
 
+import transaction
+
 portal_name = 'dummy_1_'
 user_name = ZopeTestCase.user_name
 
@@ -33,29 +34,29 @@
 # Dummy Portal
 
 from OFS.SimpleItem import SimpleItem
-from OFS.Folder import Folder       
+from OFS.Folder import Folder
 
-class DummyMembershipTool(SimpleItem):
-    id = 'portal_membership'                
-    def createMemberarea(self, member_id):      
-        portal = self.aq_inner.aq_parent            
-        portal.Members.manage_addFolder(member_id)          
-    def getHomeFolder(self, member_id):                             
-        portal = self.aq_inner.aq_parent
-        return portal.Members[member_id]
-                  
 class DummyPortal(Folder):
-    _v_skindata = None                
+    _v_skindata = None
     def __init__(self, id):
         self.id = id
-        self._addRole('Member') 
+        self._addRole('Member')
         self._setObject('portal_membership', DummyMembershipTool())
         self.manage_addFolder('Members')
     def setupCurrentSkin(self):
         if self._v_skindata is None:
             self._v_skindata = 'refreshed'
 
+class DummyMembershipTool(SimpleItem):
+    id = 'portal_membership'
+    def createMemberarea(self, member_id):
+        portal = self.aq_inner.aq_parent
+        portal.Members.manage_addFolder(member_id)
+    def getHomeFolder(self, member_id):
+        portal = self.aq_inner.aq_parent
+        return portal.Members[member_id]
 
+
 class TestPortalTestCase(ZopeTestCase.PortalTestCase):
     '''Incrementally exercise the PortalTestCase API.'''
 
@@ -63,6 +64,7 @@
     _tearDown = ZopeTestCase.PortalTestCase.tearDown
 
     def getPortal(self):
+        # Must make sure we return a portal object
         self.app._setObject(portal_name, DummyPortal(portal_name))
         return self.app[portal_name]
 
@@ -71,7 +73,7 @@
         # with an empty fixture.
         self._called = []
         # Implicitly aborts previous transaction
-        begin()
+        transaction.begin()
 
     def beforeSetUp(self):
         self._called.append('beforeSetUp')
@@ -176,32 +178,33 @@
         acl_user = self.portal.acl_users.getUserById('user_2')
         self.assertRolesOfUser(test_roles, acl_user)
 
-    def test_setRolesAssertsArgumentType(self):
-        # setRoles should fail if 'roles' argument is not a list
-        self.assertRaises(self.failureException, self.setRoles, 'foo')
-        self.assertRaises(self.failureException, self.setRoles, ('foo',))
-
-    def test_getRoles(self):
-        # Should return roles of user
+    def test_setRoles_4(self):
+        # Roles should be set from a tuple
         self.app = self._app()
         self.portal = self.getPortal()
         self._setupUserFolder()
         self._setupUser()
-        self.assertEqual(self.getRoles(), ('Member', 'Authenticated'))
+        test_roles = ['Manager', 'Member']
+        self.setRoles(tuple(test_roles))
+        acl_user = self.portal.acl_users.getUserById(user_name)
+        self.assertRolesOfUser(test_roles, acl_user)
 
-    def test_getRoles_2(self):
-        # Should return roles of specified user
+    def test_setRoles_5(self):
+        # Roles should be set from a string
         self.app = self._app()
         self.portal = self.getPortal()
         self._setupUserFolder()
-        self.portal.acl_users.userFolderAddUser('user_2', 'secret', ['Manager'], [])
-        self.assertEqual(self.getRoles('user_2'), ('Manager', 'Authenticated'))
+        self._setupUser()
+        test_roles = ['Manager']
+        self.setRoles('Manager')
+        acl_user = self.portal.acl_users.getUserById(user_name)
+        self.assertRolesOfUser(test_roles, acl_user)
 
     def test_setPermissions(self):
         # Permissions should be set for user
         self.app = self._app()
         self.portal = self.getPortal()
-        test_perms = ['Add Folders']
+        test_perms = ['Add Folders', 'Delete objects']
         self.setPermissions(test_perms)
         self.assertPermissionsOfRole(test_perms, 'Member')
 
@@ -210,32 +213,26 @@
         self.app = self._app()
         self.portal = self.getPortal()
         self.portal._addRole('role_2')
-        test_perms = ['Add Folders']
+        test_perms = ['Add Folders', 'Delete objects']
         self.assertPermissionsOfRole([], 'role_2')
         self.setPermissions(test_perms, 'role_2')
         self.assertPermissionsOfRole(test_perms, 'role_2')
 
-    def test_setPermissionsAssertsArgumentType(self):
-        # setPermissions should fail if 'permissions' argument is not a list
-        self.assertRaises(self.failureException, self.setPermissions, 'foo')
-        self.assertRaises(self.failureException, self.setPermissions, ('foo',))
-
-    def test_getPermissions(self):
-        # Should return permissions of user
+    def test_setPermissions_3(self):
+        # Permissions should be set from a tuple
         self.app = self._app()
         self.portal = self.getPortal()
-        test_perms = ['Add Folders']
-        self.setPermissions(test_perms)
-        self.assertEqual(self.getPermissions(), test_perms)
+        test_perms = ['Add Folders', 'Delete objects']
+        self.setPermissions(tuple(test_perms))
+        self.assertPermissionsOfRole(test_perms, 'Member')
 
-    def test_getPermissions_2(self):
-        # Should return permissions of specified role
+    def test_setPermissions_4(self):
+        # Permissions should be set from a string
         self.app = self._app()
         self.portal = self.getPortal()
         test_perms = ['Add Folders']
-        self.portal._addRole('role_2')
-        self.setPermissions(test_perms, 'role_2')
-        self.assertEqual(self.getPermissions('role_2'), test_perms)
+        self.setPermissions('Add Folders')
+        self.assertPermissionsOfRole(test_perms, 'Member')
 
     def test_login(self):
         # User should be able to log in
@@ -471,19 +468,19 @@
     def setUp(self):
         self._called = []
         ZopeTestCase.PortalTestCase.setUp(self)
-        
+
     def beforeSetUp(self):
         self._called.append('beforeSetUp')
         ZopeTestCase.PortalTestCase.beforeSetUp(self)
-        
+
     def _setup(self):
         self._called.append('_setup')
         ZopeTestCase.PortalTestCase._setup(self)
-        
+
     def afterClear(self):
         self._called.append('afterClear')
         ZopeTestCase.PortalTestCase.afterClear(self)
-        
+
     def assertHooks(self, sequence):
         self.assertEqual(self._called, sequence)
 
@@ -504,11 +501,11 @@
             # Connection has been closed
             from Testing.ZopeTestCase import base
             self.assertEqual(len(base._connections), 0)
-    
+
     def _setup(self):
         HookTest._setup(self)
         raise self.Error
-    
+
     def testTrigger(self):
         pass
 

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/testShoppingCart.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testShoppingCart.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testShoppingCart.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -8,7 +8,7 @@
 # Handy for debugging and tracing your tests.
 #
 
-# $Id: testShoppingCart.py,v 1.10 2004/04/09 12:38:37 shh42 Exp $
+# $Id: testShoppingCart.py,v 1.11 2005/02/23 17:14:56 shh42 Exp $
 
 import os, sys
 if __name__ == '__main__':
@@ -24,93 +24,83 @@
 examples_path = os.path.abspath(examples_path)
 
 
-if not ZopeTestCase.hasProduct('TemporaryFolder'):
+# Open ZODB connection
+app = ZopeTestCase.app()
 
-    print 'testShoppingCart.py: The tests in this module require Zope >= 2.5'
+# Set up sessioning objects
+ZopeTestCase.utils.setupCoreSessions(app)
 
-elif not os.path.isfile(examples_path):
+# Set up example applications
+if not hasattr(app, 'Examples'):
+    ZopeTestCase.utils.importObjectFromFile(app, examples_path)
 
-    print "testShoppingCart.py: Cannot find file '%s'" % examples_path
+# Close ZODB connection
+ZopeTestCase.close(app)
 
-else:
 
-    # Open ZODB connection
-    app = ZopeTestCase.app()
+class DummyOrder:
+    '''Construct an order we can add to the cart'''
+    __allow_access_to_unprotected_subobjects__ = 1
 
-    # Set up sessioning objects
-    ZopeTestCase.utils.setupCoreSessions(app)
+    def __init__(self, id, quantity):
+        self.id = id
+        self.quantity = quantity
 
-    # Set up example applications
-    if not hasattr(app, 'Examples'):
-        ZopeTestCase.utils.importObjectFromFile(app, examples_path)
 
-    # Close ZODB connection
-    ZopeTestCase.close(app)
+class TestShoppingCart(ZopeTestCase.ZopeTestCase):
+    '''Test the ShoppingCart example application'''
 
+    _setup_fixture = 0  # No default fixture
 
-    class DummyOrder:
-        '''Construct an order we can add to the cart'''
-        __allow_access_to_unprotected_subobjects__ = 1
+    def afterSetUp(self):
+        self.cart = self.app.Examples.ShoppingCart
+        # Put SESSION object into REQUEST
+        request = self.app.REQUEST
+        sdm = self.app.session_data_manager
+        request.set('SESSION', sdm.getSessionData())
+        self.session = request.SESSION
 
-        def __init__(self, id, quantity):
-            self.id = id
-            self.quantity = quantity
+    def testSession(self):
+        # Session should work
+        self.session.set('boring', 'boring')
+        self.assertEqual(self.session.get('boring'), 'boring')
 
+    def testCartIsEmpty(self):
+        # Cart should be empty
+        self.assertEqual(len(self.cart.currentItems()), 0)
 
-    class TestShoppingCart(ZopeTestCase.ZopeTestCase):
-        '''Test the ShoppingCart example application'''
+    def testAddItems(self):
+        # Adding to the cart should work
+        self.cart.addItems([DummyOrder('510-115', 1),])
+        self.assertEqual(len(self.cart.currentItems()), 1)
 
-        _setup_fixture = 0  # No default fixture
+    def testDeleteItems(self):
+        # Deleting from the cart should work
+        self.cart.addItems([DummyOrder('510-115', 1),])
+        self.cart.deleteItems(['510-115'])
+        self.assertEqual(len(self.cart.currentItems()), 0)
 
-        def afterSetUp(self):
-            self.cart = self.app.Examples.ShoppingCart
-            # Put SESSION object into REQUEST
-            request = self.app.REQUEST
-            sdm = self.app.session_data_manager
-            request.set('SESSION', sdm.getSessionData())
-            self.session = request.SESSION
+    def testAddQuantity(self):
+        # Adding to quantity should work
+        self.cart.addItems([DummyOrder('510-115', 1),])
+        self.cart.addItems([DummyOrder('510-115', 2),])
+        self.cart.addItems([DummyOrder('510-115', 3),])
+        self.assertEqual(self.cart.currentItems()[0]['quantity'], 6)
 
-        def testSession(self):
-            # Session should work
-            self.session.set('boring', 'boring')
-            self.assertEqual(self.session.get('boring'), 'boring')
+    def testGetTotal(self):
+        # Totals should be computed correctly
+        self.cart.addItems([DummyOrder('510-115', 1),])
+        self.cart.addItems([DummyOrder('510-122', 2),])
+        self.cart.addItems([DummyOrder('510-007', 2),])
+        self.assertEqual(self.cart.getTotal(), 149.95)
 
-        def testCartIsEmpty(self):
-            # Cart should be empty
-            self.assertEqual(len(self.cart.currentItems()), 0)
 
-        def testAddItems(self):
-            # Adding to the cart should work
-            self.cart.addItems([DummyOrder('510-115', 1),])
-            self.assertEqual(len(self.cart.currentItems()), 1)
+def test_suite():
+    from unittest import TestSuite, makeSuite
+    suite = TestSuite()
+    suite.addTest(makeSuite(TestShoppingCart))
+    return suite
 
-        def testDeleteItems(self):
-            # Deleting from the cart should work
-            self.cart.addItems([DummyOrder('510-115', 1),])
-            self.cart.deleteItems(['510-115'])
-            self.assertEqual(len(self.cart.currentItems()), 0)
+if __name__ == '__main__':
+    framework()
 
-        def testAddQuantity(self):
-            # Adding to quantity should work
-            self.cart.addItems([DummyOrder('510-115', 1),])
-            self.cart.addItems([DummyOrder('510-115', 2),])
-            self.cart.addItems([DummyOrder('510-115', 3),])
-            self.assertEqual(self.cart.currentItems()[0]['quantity'], 6)
-
-        def testGetTotal(self):
-            # Totals should be computed correctly
-            self.cart.addItems([DummyOrder('510-115', 1),])
-            self.cart.addItems([DummyOrder('510-122', 2),])
-            self.cart.addItems([DummyOrder('510-007', 2),])
-            self.assertEqual(self.cart.getTotal(), 149.95)
-
-
-    def test_suite():
-        from unittest import TestSuite, makeSuite
-        suite = TestSuite()
-        suite.addTest(makeSuite(TestShoppingCart))
-        return suite
-
-    if __name__ == '__main__':
-        framework()
-

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/testWebserver.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testWebserver.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testWebserver.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -16,7 +16,7 @@
 # example instead.
 #
 
-# $Id: testWebserver.py,v 1.15 2004/09/04 18:01:08 shh42 Exp $
+# $Id: testWebserver.py,v 1.16 2005/02/12 13:11:10 shh42 Exp $
 
 import os, sys
 if __name__ == '__main__':
@@ -54,23 +54,22 @@
     def afterSetUp(self):
         uf = self.folder.acl_users
         uf.userFolderAddUser('manager', 'secret', ['Manager'], [])
-        manager = uf.getUserById('manager').__of__(uf)
 
-        self.folder.addDTMLMethod('index_html', file='index_html called')
-        self.folder.addDTMLMethod('secret_html', file='secret_html called')
-        self.folder.manage_addFolder('object', '')
+        # A simple document
+        self.folder.addDTMLDocument('index_html', file='index_html called')
 
+        # A document only accessible to manager
+        self.folder.addDTMLDocument('secret_html', file='secret_html called')
+
         for p in ZopeTestCase.standard_permissions:
-            self.folder.secret_html.manage_permission(p, ['Manager'], acquire=0)
+            self.folder.secret_html.manage_permission(p, ['Manager'])
 
-        self.folder.addDTMLMethod('object_ids', file='<dtml-var objectIds>')
-        self.folder.addDTMLMethod('user_ids', file='<dtml-var "acl_users.getUserNames()">')
+        # A method to change the title property of an object
         self.folder.addDTMLMethod('change_title', 
             file='''<dtml-call "manage_changeProperties(title=REQUEST.get('title'))">'''
                  '''<dtml-var title_or_id>''')
 
-        self.folder.object_ids.changeOwnership(manager)
-        self.folder.user_ids.changeOwnership(manager)
+        manager = uf.getUserById('manager').__of__(uf)
         self.folder.change_title.changeOwnership(manager)
 
         # Commit so the ZServer threads can see the changes
@@ -142,15 +141,15 @@
         # Test a script that modifies the ZODB
         self.setRoles(['Manager'])
         self.app.REQUEST.set('title', 'Foo')
-        page = self.folder.object.change_title(self.folder.object, 
-                                               self.app.REQUEST)
+        page = self.folder.index_html.change_title(self.folder.index_html,
+                                                   self.app.REQUEST)
         self.assertEqual(page, 'Foo')
-        self.assertEqual(self.folder.object.title, 'Foo')
+        self.assertEqual(self.folder.index_html.title, 'Foo')
 
     def testURLModifyObject(self):
         # Test a transaction that actually commits something
         urllib._urlopener = ManagementOpener()
-        page = urllib.urlopen(folder_url+'/object/change_title?title=Foo').read()
+        page = urllib.urlopen(folder_url+'/index_html/change_title?title=Foo').read()
         self.assertEqual(page, 'Foo')
 
     def testAbsoluteURL(self):
@@ -169,10 +168,10 @@
     def testConnectionIsShared(self):
         # Due to sandboxing the ZServer thread operates on the
         # same connection as the main thread, allowing us to
-        # see changes made to 'object' right away.
+        # see changes made to 'index_html' right away.
         urllib._urlopener = ManagementOpener()
-        urllib.urlopen(folder_url+'/object/change_title?title=Foo')
-        self.assertEqual(self.folder.object.title, 'Foo')
+        urllib.urlopen(folder_url+'/index_html/change_title?title=Foo')
+        self.assertEqual(self.folder.index_html.title, 'Foo')
 
     def testCanCommit(self):
         # Additionally, it allows us to commit transactions without

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/testZopeTestCase.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/testZopeTestCase.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/testZopeTestCase.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -9,7 +9,7 @@
 # way of getting started.
 #
 
-# $Id: testZopeTestCase.py,v 1.21 2004/09/04 18:01:08 shh42 Exp $
+# $Id: testZopeTestCase.py,v 1.25 2005/01/30 14:22:48 shh42 Exp $
 
 import os, sys
 if __name__ == '__main__':
@@ -20,8 +20,9 @@
 from Acquisition import aq_base
 from AccessControl import getSecurityManager
 from types import ListType
-from transaction import begin
 
+import transaction
+
 folder_name = ZopeTestCase.folder_name
 user_name = ZopeTestCase.user_name
 user_role = ZopeTestCase.user_role
@@ -43,7 +44,7 @@
         # with an empty fixture.
         self._called = []
         # Implicitly aborts previous transaction
-        begin()
+        transaction.begin()
 
     def beforeSetUp(self):
         self._called.append('beforeSetUp')
@@ -121,32 +122,33 @@
         acl_user = self.folder.acl_users.getUserById('user_2')
         self.assertRolesOfUser(test_roles, acl_user)
 
-    def test_setRolesAssertsArgumentType(self):
-        # setRoles should fail if 'roles' argument is not a list
-        self.assertRaises(self.failureException, self.setRoles, 'foo')
-        self.assertRaises(self.failureException, self.setRoles, ('foo',))
-
-    def test_getRoles(self):
-        # Should return roles of user
+    def test_setRoles_4(self):
+        # Roles should be set from a tuple
         self.app = self._app()
         self._setupFolder()
         self._setupUserFolder()
         self._setupUser()
-        self.assertEqual(self.getRoles(), (user_role, 'Authenticated'))
+        test_roles = ['Manager', user_role]
+        self.setRoles(tuple(test_roles))
+        acl_user = self.folder.acl_users.getUserById(user_name)
+        self.assertRolesOfUser(test_roles, acl_user)
 
-    def test_getRoles_2(self):
-        # Should return roles of specified user
+    def test_setRoles_5(self):
+        # Roles should be set from a string
         self.app = self._app()
         self._setupFolder()
         self._setupUserFolder()
-        self.folder.acl_users.userFolderAddUser('user_2', 'secret', ['Manager'], [])
-        self.assertEqual(self.getRoles('user_2'), ('Manager', 'Authenticated'))
+        self._setupUser()
+        test_roles = ['Manager']
+        self.setRoles('Manager')
+        acl_user = self.folder.acl_users.getUserById(user_name)
+        self.assertRolesOfUser(test_roles, acl_user)
 
     def test_setPermissions(self):
         # Permissions should be set for user
         self.app = self._app()
         self._setupFolder()
-        test_perms = ['Add Folders']
+        test_perms = ['Add Folders', 'Delete objects']
         self.assertPermissionsOfRole(standard_permissions, user_role)
         self.setPermissions(test_perms)
         self.assertPermissionsOfRole(test_perms, user_role)
@@ -160,25 +162,23 @@
         self.setPermissions(standard_permissions, 'role_2')
         self.assertPermissionsOfRole(standard_permissions, 'role_2')
 
-    def test_setPermissionsAssertsArgumentType(self):
-        # setPermissions should fail if 'permissions' argument is not a list
-        self.assertRaises(self.failureException, self.setPermissions, 'foo')
-        self.assertRaises(self.failureException, self.setPermissions, ('foo',))
-
-    def test_getPermissions(self):
-        # Should return permissions of user
+    def test_setPermissions_3(self):
+        # Permissions should be set from a tuple
         self.app = self._app()
         self._setupFolder()
-        self.assertEqual(self.getPermissions(), standard_permissions) 
+        test_perms = ['Add Folders', 'Delete objects']
+        self.assertPermissionsOfRole(standard_permissions, user_role)
+        self.setPermissions(tuple(test_perms))
+        self.assertPermissionsOfRole(test_perms, user_role)
 
-    def test_getPermissions_2(self):
-        # Should return permissions of specified role
+    def test_setPermissions_4(self):
+        # Permissions should be set from a comma separated string
         self.app = self._app()
         self._setupFolder()
         test_perms = ['Add Folders']
-        self.folder._addRole('role_2')
-        self.setPermissions(test_perms, 'role_2')
-        self.assertEqual(self.getPermissions('role_2'), test_perms) 
+        self.assertPermissionsOfRole(standard_permissions, user_role)
+        self.setPermissions('Add Folders')
+        self.assertPermissionsOfRole(test_perms, user_role)
 
     def test_login(self):
         # User should be able to log in

Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/utils.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/utils.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/utils.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -5,7 +5,7 @@
 # module level to add functionality to the test environment.
 #
 
-# $Id: utils.py,v 1.16 2004/08/19 13:59:41 shh42 Exp $
+# $Id: utils.py,v 1.21 2005/02/11 09:00:21 shh42 Exp $
 
 
 def setupCoreSessions(app=None):
@@ -137,6 +137,19 @@
         close(app)
 
 
+def makelist(arg):
+    '''Turns arg into a list. Where arg may be
+       list, tuple, or string.
+    '''
+    if type(arg) == type([]):
+        return arg
+    if type(arg) == type(()):
+        return list(arg)
+    if type(arg) == type(''):
+       return filter(None, [arg])
+    raise ValueError('Argument must be list, tuple, or string')
+
+
 class ConnectionRegistry:
     '''ZODB connection registry'''
 
@@ -164,3 +177,13 @@
     def contains(self, conn):
         return conn in self._conns
 
+
+__all__ = [
+    'setupCoreSessions',
+    'setupSiteErrorLog',
+    'setupZGlobals',
+    'startZServer',
+    'importObjectFromFile',
+    'appcall',
+]
+

Added: Zope/trunk/lib/python/Testing/ZopeTestCase/warnhook.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/warnhook.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/warnhook.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -0,0 +1,57 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+import warnings
+
+class WarningsHook:
+    """Hook to capture warnings generated by Python.
+
+    The function warnings.showwarning() is designed to be hooked by
+    application code, allowing the application to customize the way it
+    handles warnings.
+
+    This hook captures the unformatted warning information and stored
+    it in a list.  A test can inspect this list after the test is over.
+
+    Issues:
+
+    The warnings module has lots of delicate internal state.  If
+    a warning has been reported once, it won't be reported again.  It
+    may be necessary to extend this class with a mechanism for
+    modifying the internal state so that we can be guaranteed a
+    warning will be reported.
+
+    If Python is run with a warnings filter, e.g. python -Werror,
+    then a test that is trying to inspect a particular warning will
+    fail.  Perhaps this class can be extended to install more-specific
+    filters the test to work anyway.
+    """
+
+    def __init__(self):
+        self.original = None
+        self.warnings = []
+
+    def install(self):
+        self.original = warnings.showwarning
+        warnings.showwarning = self.showwarning
+
+    def uninstall(self):
+        assert self.original is not None
+        warnings.showwarning = self.original
+        self.original = None
+
+    def showwarning(self, message, category, filename, lineno):
+        self.warnings.append((str(message), category, filename, lineno))
+
+    def clear(self):
+        self.warnings = []


Property changes on: Zope/trunk/lib/python/Testing/ZopeTestCase/warnhook.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/Testing/ZopeTestCase/ztc/__init__.py
===================================================================
--- Zope/trunk/lib/python/Testing/ZopeTestCase/ztc/__init__.py	2005-03-14 18:51:13 UTC (rev 29464)
+++ Zope/trunk/lib/python/Testing/ZopeTestCase/ztc/__init__.py	2005-03-14 18:54:17 UTC (rev 29465)
@@ -0,0 +1,14 @@
+#
+# ZopeTestCase public interface
+#
+
+# $Id: __init__.py,v 1.1 2005/02/25 11:01:07 shh42 Exp $
+
+__version__ = '0.9.6'
+
+import Testing.ZopeTestCase
+__path__.extend(Testing.ZopeTestCase.__path__)
+
+from Testing.ZopeTestCase import *
+from Testing.ZopeTestCase.utils import *
+


Property changes on: Zope/trunk/lib/python/Testing/ZopeTestCase/ztc/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Zope-Checkins mailing list