[Zope-Checkins] SVN: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ Add doctest support and remove some b/w compatiblity cruft.

Stefan H. Holek stefan at epy.co.at
Fri Mar 18 05:02:58 EST 2005


Log message for revision 29547:
  Add doctest support and remove some b/w compatiblity cruft.
  

Changed:
  U   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/PortalTestCase.py
  U   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ZopeTestCase.py
  U   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/__init__.py
  U   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt
  D   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/warnhook.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/FunctionalDocTest.txt
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/README.txt
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/WarningsTest.txt
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/ZopeDocTest.txt
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/__init__.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/dochttp.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/framework.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/functional.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.request
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.response
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.request
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.response
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/runalltests.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testAuthHeaderTest.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testFunctionalDocTest.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testWarningsTest.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testZopeDocTest.py
  A   Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/test_dochttp.py

-=-
Modified: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/PortalTestCase.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/PortalTestCase.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/PortalTestCase.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -135,18 +135,3 @@
         '''Logs out.'''
         noSecurityManager()
 
-    # b/w compatibility methods
-
-    def _setRoles(self, roles, name=user_name):
-        self.setRoles(roles, name)
-    def _setPermissions(self, permissions, role='Member'):
-        self.setPermissions(permissions, role)
-    def _login(self, name=user_name):
-        self.login(name)
-    def _logout(self):
-        self.logout()
-
-
-# b/w compatibility names
-_portal_name = portal_name
-

Modified: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ZopeTestCase.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ZopeTestCase.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ZopeTestCase.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -100,18 +100,7 @@
         '''Logs out.'''
         noSecurityManager()
 
-    # b/w compatibility methods
 
-    def _setRoles(self, roles, name=user_name):
-        self.setRoles(roles, name)
-    def _setPermissions(self, permissions, role=user_role):
-        self.setPermissions(permissions, role)
-    def _login(self, name=user_name):
-        self.login(name)
-    def _logout(self):
-        self.logout()
-
-
 class FunctionalTestCase(functional.Functional, ZopeTestCase):
     '''Base class for functional Zope tests'''
 
@@ -119,11 +108,6 @@
                       ZopeTestCase.__implements__)
 
 
-# b/w compatibility names
-_folder_name = folder_name
-_user_name = user_name
-_user_role = user_role
-_standard_permissions = standard_permissions
 from base import app
 from base import close
 from base import closeConnections

Modified: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/__init__.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/__init__.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/__init__.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -30,18 +30,9 @@
 from sandbox import Sandboxed
 from functional import Functional
 
-from warnhook import WarningsHook
+from ZODB.tests.warnhook import WarningsHook
 from unittest import main
 
-# TODO
-#from doctest import ZopeDocFileSuite
-#from doctest import FunctionalDocFileSuite
+from ztc_doctest import ZopeDocFileSuite
+from ztc_doctest import FunctionalDocFileSuite
 
-# b/w compatibility names
-_folder_name = folder_name
-_user_name = user_name
-_user_role = user_role
-_standard_permissions = standard_permissions
-_portal_name = portal_name
-from base import closeConnections
-

Modified: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt	2005-03-18 10:02:57 UTC (rev 29547)
@@ -1,3 +1,11 @@
+0.9.7 (Zope 2.8 edition)
+- Renamed 'doctest' sub-package to 'ztc_doctest' because of name-shadowing
+  issues uncovered during integration into Zope 2.8. This should not
+  affect existing tests as user code is not expected to import from sub-
+  packages anyway.
+- Removed warnhook.py, we now use the one from ZODB.tests.
+- Removed doctest.py, we now use the one from zope.testing.
+
 0.9.6
 - Dropped support for Zope 2.5 as it lacks the setSecurityManager() API.
 - Moved interfaces from doc section to interfaces.py module.

Deleted: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/warnhook.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/warnhook.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/warnhook.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -1,57 +0,0 @@
-##############################################################################
-#
-# 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 = []

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/FunctionalDocTest.txt
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/FunctionalDocTest.txt	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/FunctionalDocTest.txt	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,159 @@
+====================
+Functional doc tests
+====================
+
+Doctests are a way to write tests while documenting the thing that is
+tested at the same time.  As an example, this file both documents
+functional doc tests *and* tests them.
+
+Doctests look like regular interactive interpreter sessions.  That
+makes them very easy to create.  Doctests can either occur in an
+object's or method's docstring or in a separate file.  Use either
+``DocTestSuite`` or ``DocFileSuite`` in these cases.
+
+
+Creating functional doctests
+----------------------------
+
+Creating functional doctests is just as easy.  Obviously, you cannot
+simply use an interpreter shell for the initial test creation.
+Instead, you can use the `tcpwatch` program to record browser sessions
+and turn them into tests:
+
+1. Start out with a clean ZODB database.
+
+   - Create a folder named `test_folder_1_` in the root folder.
+
+   - Create a user in the root user folder called `test_user_1_` with
+     the password `secret`.
+
+    - Create a role `test_role_1_` and grant the role to the test
+      user.  Grant the permissions 'Access contents information' and
+      'View' to the role.
+
+2. Install tcpwatch.  You can get a recent version from Zope CVS:
+   http://cvs.zope.org/Packages/tcpwatch/
+
+3. Create a temporary directory to record tcpwatch output.
+
+4. Run tcpwatch using:
+   tcpwatch.py -L 8081:8080 -s -r tmpdir
+   (the ports are the listening port and forwarded-to port; the
+   second port must match the Zope configuration)
+
+5. In a browser, connect to the listening port and do whatever needs
+   to be recorded.
+
+6. Shut down tcpwatch.
+
+7. Run the script at Zope/lib/python/Testing/ZopeTestCase/doctest/dochttp.py
+   python2.3 dochttp.py tmpdir > .../mytest.txt
+
+8. Edit the generated text file to add explanations and elide
+   uninteresting portions of the output.
+
+9. In a functional test module (usually ftests.py), import
+   ``FunctionalDocFileSuite`` and instantiate it, passing the name of the
+   text file containing the test.  For example:
+
+   import os, sys
+   if __name__ == '__main__':
+       execfile(os.path.join(sys.path[0], 'framework.py'))
+
+   from Testing import ZopeTestCase
+
+   from unittest import TestSuite
+   from Testing.ZopeTestCase import FunctionalDocFileSuite
+
+   def test_suite():
+       suite = TestSuite()
+       suite.addTest(FunctionalDocFileSuite('FunctionalDocTest.txt'))
+       return suite
+
+   if __name__ == '__main__':
+       framework()
+
+
+Examples
+--------
+
+Test Publish Document
+
+  >>> print http(r"""
+  ... GET /test_folder_1_/index_html HTTP/1.1
+  ... """, handle_errors=False)
+  HTTP/1.1 200 OK
+  Content-Length: 5
+  Content-Type: text/plain
+  <BLANKLINE>
+  index
+
+Test Publish Script
+
+  >>> print http(r"""
+  ... GET /test_folder_1_/script HTTP/1.1
+  ... """, handle_errors=False)
+  HTTP/1.1 200 OK
+  Content-Length: 1
+  Content-Type: text/plain
+  <BLANKLINE>
+  1
+
+Test Publish Script with Argument
+
+  >>> print http(r"""
+  ... GET /test_folder_1_/script?a:int=2 HTTP/1.1
+  ... """, handle_errors=False)
+  HTTP/1.1 200 OK
+  Content-Length: 1
+  Content-Type: text/plain
+  <BLANKLINE>
+  3
+
+Test Server Error
+
+  >>> print http(r"""
+  ... GET /test_folder_1_/script?a=2 HTTP/1.1
+  ... """, handle_errors=False)
+  HTTP/1.1 500 Internal Server Error
+  ...Content-Type: text/html...exceptions.TypeError...
+
+Test Unauthorized
+
+  >>> self.folder.index_html.manage_permission('View', ['Owner'])
+  >>> print http(r"""
+  ... GET /test_folder_1_/index_html HTTP/1.1
+  ... """, handle_errors=False)
+  HTTP/1.1 401 Unauthorized
+  ...
+
+Test Basic Authentication
+
+  >>> from AccessControl.Permissions import manage_properties
+  >>> self.setPermissions([manage_properties])
+
+  >>> print http(r"""
+  ... GET /test_folder_1_/index_html/change_title?title=Foo HTTP/1.1
+  ... Authorization: Basic %s
+  ... """ % user_auth, handle_errors=False)
+  HTTP/1.1 200 OK
+  Content-Length: 0
+  ...
+
+  >>> self.folder.index_html.title_or_id()
+  'Foo'
+
+Test passing in non-base64-encoded login/pass
+
+  >>> from Testing.ZopeTestCase import user_name, user_password
+  >>> print http(r"""
+  ... GET /test_folder_1_/index_html/change_title?title=Baz HTTP/1.1
+  ... Authorization: Basic %s:%s
+  ... """ % (user_name, user_password), handle_errors=False)
+  HTTP/1.1 200 OK
+  Content-Length: 0
+  ...
+
+  >>> self.folder.index_html.title_or_id()
+  'Baz'
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/FunctionalDocTest.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/README.txt
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/README.txt	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/README.txt	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,10 @@
+Doctest support for ZopeTestCase
+================================
+
+Backport of functional doc tests from Zope 3 by
+Sidnei da Silva. See 'FunctionalDocTest.txt' for
+documentation.
+
+You can learn more about doc tests here:
+http://docs.python.org/lib/module-doctest.html
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/WarningsTest.txt
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/WarningsTest.txt	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/WarningsTest.txt	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,27 @@
+Dummy Test
+==========
+
+This dummy test is just used to check that passing in a ``test_class``
+that doesn't subclass ``ZopeTestCase.Functional`` still works but
+issues a warning.
+
+  >>> from Testing import ZopeTestCase
+  >>> class NoFunctionalTest(ZopeTestCase.ZopeTestCase): pass
+  >>> hook = ZopeTestCase.WarningsHook()
+  >>> hook.install()
+  >>> test = ZopeTestCase.FunctionalDocFileSuite('WarningsTest.txt',
+  ...                     package='Testing.ZopeTestCase.ztc_doctest',
+  ...                     test_class=NoFunctionalTest)
+
+  >>> len(hook.warnings)
+  1
+  >>> message, category, filename, lineno = hook.warnings[0]
+  >>> message
+  "The test_class you are using doesn't subclass from ZopeTestCase.Functional. Please fix that."
+  >>> category.__name__
+  'UserWarning'
+
+We have to uninstall the hook so that other warnings don't get lost.
+
+  >>> hook.uninstall()
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/WarningsTest.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/ZopeDocTest.txt
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/ZopeDocTest.txt	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/ZopeDocTest.txt	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,97 @@
+==============
+Zope doc tests
+==============
+
+Doctests are a way to write tests while documenting the thing that is
+tested at the same time.  As an example, this file both documents
+Zope doc tests *and* tests them.
+
+Doctests look like regular interactive interpreter sessions.  That
+makes them very easy to create.  Doctests can either occur in an
+object's or method's docstring or in a separate file.  Use either
+``DocTestSuite`` or ``DocFileSuite`` in these cases.
+
+
+Creating Zope doc tests
+-----------------------
+
+Creating doc tests for Zope is easy.  While we cannot simply use an
+interpeter shell to write our tests, we can reuse the ZopeTestCase
+infrastructure to set up the necessary environment.
+
+1. Create a text file, just like this one, containing prose
+   documentation interspersed with doctest ``Examples``.
+
+2. In a test module import ``ZopeDocFileSuite`` and instantiate it,
+   passing the name of the text file containing the tests.
+   For example:
+
+   import os, sys
+   if __name__ == '__main__':
+       execfile(os.path.join(sys.path[0], 'framework.py'))
+
+   from Testing import ZopeTestCase
+
+   from unittest import TestSuite
+   from Testing.ZopeTestCase import ZopeDocFileSuite
+
+   def test_suite():
+       suite = TestSuite()
+       suite.addTest(ZopeDocFileSuite('ZopeDocTest.txt'))
+       return suite
+
+   if __name__ == '__main__':
+       framework()
+
+
+Examples
+--------
+
+Here we are going to demonstrate that everything we know about
+ZopeTestCase is still true for doc tests. In particular, the default
+fixture is set up for doc tests just like for unit tests.
+
+  >>> from Testing.ZopeTestCase import folder_name, user_name
+  >>> from AccessControl import getSecurityManager
+
+There should be a folder:
+
+  >>> folder_name in self.app.objectIds()
+  True
+
+Containing a user folder:
+
+  >>> 'acl_users' in self.folder.objectIds()
+  True
+
+Containing the default user:
+
+  >>> user = self.folder.acl_users.getUserById(user_name)
+  >>> user is None
+  False
+
+The default user should be logged in:
+
+  >>> getSecurityManager().getUser().getId() == user_name
+  True
+
+The custom setUp method should have been run as well. See
+testZopeDocTest.py for its definition.
+
+  >>> 'object' in self.folder.objectIds()
+  True
+
+Now let's manipulate our test objects a bit:
+
+  >>> ob = self.folder.object
+  >>> print ob.title_or_id()
+  object
+
+  >>> ob.manage_changeProperties(title='Foo')
+  >>> print ob.title_or_id()
+  Foo
+
+  >>> self.folder.manage_delObjects('object')
+  >>> 'object' in self.folder.objectIds()
+  False
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/ZopeDocTest.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/__init__.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/__init__.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/__init__.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,2 @@
+from zope.testing.doctest import *
+from functional import *


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/dochttp.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/dochttp.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/dochttp.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,224 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+"""Convert an http tcpwatch session to a doctest
+
+$Id: dochttp.py,v 1.2 2004/10/21 21:19:09 shh42 Exp $
+"""
+
+import errno
+import optparse
+import os
+import re
+import rfc822
+import sys
+
+usage = """usage: %prog <options> directory
+
+Convert an http tcpwatch recorded sesssion to a doctest file, which is
+written to standard output.
+
+"""
+
+parser = optparse.OptionParser(usage)
+parser.add_option("-p", "--prefix", default="watch",
+                  help="Prefix for recorded tcpwatch session files")
+parser.add_option("-U", "--skip-url", action="append",
+                  help="Regular expression for URLs to skip")
+parser.add_option("-E", "--skip-extension", action="append",
+                  help="URL file-extension to skip")
+parser.add_option("-e", "--extension", action="append",
+                  help="URL file-extension to include")
+parser.add_option("-I", "--skip-request-header", action="append",
+                  help="Request header to skip")
+parser.add_option("-O", "--skip-response-header", action="append",
+                  help="Response header to skip")
+parser.add_option("-r", "--clean-redirects", action="store_true",
+                  help="Strip content from redirect responses",
+                  default=False)
+
+default_options = [
+    '-e', 'html',
+
+    '-I', 'Accept-Charset', '-I', 'Accept-Encoding', '-I', 'Accept-Language',
+    '-I', 'Accept', '-I', 'Connection', '-I', 'Host', '-I', 'Keep-Alive',
+    '-I', 'User-Agent',
+
+    '-O', 'Date', '-O', 'Server', '-O', 'X-Content-Type-Warning',
+    '-O', 'X-Powered-By',
+
+    ]
+
+def dochttp(args=sys.argv[1:], default=None):
+    """Convert a tcpwatch recorded sesssion to a doctest file"""
+    if default is None:
+        default = default_options
+
+    options, args = parser.parse_args(default+args)
+    try:
+        directory, = args
+    except:
+        parser.print_help()
+        sys.exit(1)
+
+    skip_extensions = options.skip_extension or ()
+    extensions = [ext for ext in (options.extension or ())
+                  if ext not in skip_extensions]
+    skip_urls = [re.compile(pattern) for pattern in (options.skip_url or ())]
+
+    names = [name[:-len(".request")]
+             for name in os.listdir(directory)
+             if name.startswith(options.prefix) and name.endswith('.request')
+             ]
+    names.sort()
+
+    extre = re.compile("[.](\w+)$")
+
+    for name in names:
+        requests =  Requests(
+                        open(os.path.join(directory, name + ".request"), 'rb'),
+                        options.skip_request_header,
+                        )
+        responses = Responses(
+                        open(os.path.join(directory, name + ".response"), 'rb'),
+                        options.skip_response_header,
+                        )
+
+        # We use map so as *not* to truncate at shortest input.
+        # We want an error if the number of requests and responses
+        # is different.
+        for request, response in map(None, requests, responses):
+            assert (request and response) or not (request or response)
+
+            path = request.path
+            ext = extre.search(path)
+            if ext:
+                ext = ext.group(1)
+                if extensions:
+                    if ext not in extensions:
+                        continue
+                else:
+                    if ext in skip_extensions:
+                        continue
+            
+            for skip_url in skip_urls:
+                if skip_url.search(request.path):
+                    break
+            else:
+                try:
+                    output_test(request, response, options.clean_redirects)
+                except IOError, e:
+                    if e.errno == errno.EPIPE:
+                        return
+                    raise
+    
+
+def output_test(request, response, clean_redirects=False):
+    print
+    print
+    print '  >>> print http(r"""'
+    print '  ...', '\n  ... '.join(request.lines())+'""")'
+    if response.code in (301, 302, 303) and clean_redirects:
+        if response.headers:
+            for i in range(len(response.headers)):
+                h, v = response.headers[i]
+                if h == "Content-Length":
+                    response.headers[i] = (h, "...")
+        lines = response.header_lines()
+        if lines:
+            lines.append("...")
+    else:
+        lines = response.lines()
+    print ' ', '\n  '.join([line.rstrip() and line or '<BLANKLINE>'
+                             for line in lines])
+
+class Message:
+
+    start = ''
+
+    def __init__(self, file, skip_headers):
+        start = file.readline().rstrip()
+        if start:
+            self.start = start
+            if start.startswith("HTTP/"):
+                # This is a response; extract the response code:
+                self.code = int(start.split()[1])
+            headers = [split_header(header)
+                       for header in rfc822.Message(file).headers
+                       ]
+            headers = [
+                ('-'.join([s.capitalize() for s in name.split('-')]),
+                 v.rstrip()
+                 )
+                for (name, v) in headers
+                if name.lower() not in skip_headers
+            ]
+            self.headers = headers
+            content_length = int(dict(headers).get('Content-Length', '0'))
+            if content_length:
+                self.body = file.read(content_length).split('\n')
+            else:
+                self.body = []
+
+    def __nonzero__(self):
+        return bool(self.start)
+
+    def lines(self):
+        output = self.header_lines()
+        if output:
+            output.extend(self.body)
+        return output
+
+    def header_lines(self):
+        if self.start:
+            output = [self.start]
+            headers = ["%s: %s" % (name, v) for (name, v) in self.headers]
+            headers.sort()
+            output.extend(headers)
+            output.append('')
+        else:
+            output = []
+        return output
+
+headerre = re.compile('(\S+): (.+)$')
+def split_header(header):
+    return headerre.match(header).group(1, 2)
+
+def messages(cls, file, skip_headers):
+    skip_headers = [name.lower() for name in (skip_headers or ())]
+    while 1:
+        message = cls(file, skip_headers)
+        if message:
+            yield message
+        else:
+            break
+        
+class Request(Message):
+
+    path = ''
+    
+    def __init__(self, file, skip_headers):
+        Message.__init__(self, file, skip_headers)
+        if self.start:
+            self.command, self.path, self.protocol = self.start.split()
+    
+def Requests(file, skip_headers):
+    return messages(Request, file, skip_headers)
+    
+def Responses(file, skip_headers):
+    return messages(Message, file, skip_headers)
+
+main = dochttp
+
+if __name__ == '__main__':
+    main()


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/dochttp.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/framework.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/framework.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/framework.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,107 @@
+##############################################################################
+#
+# 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.3'
+
+# 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))
+            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')
+sys.stdout.flush()
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/framework.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/functional.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/functional.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/functional.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,254 @@
+#
+# Support for functional doc tests
+#
+
+# $Id: functional.py,v 1.7 2005/02/04 21:32:33 shh42 Exp $
+
+import sys
+import re
+import base64
+import warnings
+
+from zope.testing import doctest
+
+from Testing.ZopeTestCase import Functional
+from Testing.ZopeTestCase import FunctionalTestCase
+from Testing.ZopeTestCase import ZopeTestCase
+from Testing.ZopeTestCase import user_name
+from Testing.ZopeTestCase import user_password
+from Testing.ZopeTestCase.sandbox import AppZapper
+from Testing.ZopeTestCase.functional import ResponseWrapper
+
+
+class HTTPHeaderOutput:
+
+    # zope.interface.implements(zope.server.interfaces.IHeaderOutput)
+
+    def __init__(self, protocol, omit):
+        self.headers = {}
+        self.headersl = []
+        self.protocol = protocol
+        self.omit = omit
+
+    def setResponseStatus(self, status, reason):
+        self.status, self.reason = status, reason
+
+    def setResponseHeaders(self, mapping):
+        self.headers.update(dict(
+            [('-'.join([s.capitalize() for s in name.split('-')]), v)
+             for name, v in mapping.items()
+             if name.lower() not in self.omit]
+        ))
+
+    def appendResponseHeaders(self, lst):
+        headers = [split_header(header) for header in lst]
+        self.headersl.extend(
+            [('-'.join([s.capitalize() for s in name.split('-')]), v)
+             for name, v in headers
+             if name.lower() not in self.omit]
+        )
+
+    def __str__(self):
+        out = ["%s: %s" % header for header in self.headers.items()]
+        out.extend(["%s: %s" % header for header in self.headersl])
+        out.sort()
+        out.insert(0, "%s %s %s" % (self.protocol, self.status, self.reason))
+        return '\n'.join(out)
+
+
+class DocResponseWrapper(ResponseWrapper):
+    """Response Wrapper for use in doc tests
+    """
+
+    def __init__(self, response, outstream, path, header_output):
+        ResponseWrapper.__init__(self, response, outstream, path)
+        self.header_output = header_output
+
+    def __str__(self):
+        body = self.getBody()
+        if body:
+            return "%s\n\n%s" % (self.header_output, body)
+        return "%s\n" % (self.header_output)
+
+
+headerre = re.compile('(\S+): (.+)$')
+def split_header(header):
+    return headerre.match(header).group(1, 2)
+
+basicre = re.compile('Basic (.+)?:(.+)?$')
+def auth_header(header):
+    match = basicre.match(header)
+    if match:
+        import base64
+        u, p = match.group(1, 2)
+        if u is None:
+            u = ''
+        if p is None:
+            p = ''
+        auth = base64.encodestring('%s:%s' % (u, p))
+        return 'Basic %s' % auth[:-1]
+    return header
+
+
+def getRootFolder():
+    return AppZapper().app()
+
+def sync():
+    getRootFolder()._p_jar.sync()
+
+
+def http(request_string, handle_errors=True):
+    """Execute an HTTP request string via the publisher
+
+    This is used for HTTP doc tests.
+    """
+    import urllib
+    import rfc822
+    from cStringIO 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
+    old_sm = getSecurityManager()
+
+    # Commit work done by previous python code.
+    get_transaction().commit()
+
+    # Discard leading white space to make call layout simpler
+    request_string = request_string.lstrip()
+
+    # split off and parse the command line
+    l = request_string.find('\n')
+    command_line = request_string[:l].rstrip()
+    request_string = request_string[l+1:]
+    method, path, protocol = command_line.split()
+    path = urllib.unquote(path)
+
+    instream = StringIO(request_string)
+
+    env = {"HTTP_HOST": 'localhost',
+           "HTTP_REFERER": 'localhost',
+           "REQUEST_METHOD": method,
+           "SERVER_PROTOCOL": protocol,
+           }
+
+    p = path.split('?')
+    if len(p) == 1:
+        env['PATH_INFO'] = p[0]
+    elif len(p) == 2:
+        [env['PATH_INFO'], env['QUERY_STRING']] = p
+    else:
+        raise TypeError, ''
+
+    header_output = HTTPHeaderOutput(
+        protocol, ('x-content-type-warning', 'x-powered-by',
+                   'bobo-exception-type', 'bobo-exception-file',
+                   'bobo-exception-value', 'bobo-exception-line'))
+
+    headers = [split_header(header)
+               for header in rfc822.Message(instream).headers]
+    for name, value in headers:
+        name = ('_'.join(name.upper().split('-')))
+        if name not in ('CONTENT_TYPE', 'CONTENT_LENGTH'):
+            name = 'HTTP_' + name
+        env[name] = value.rstrip()
+
+    if env.has_key('HTTP_AUTHORIZATION'):
+        env['HTTP_AUTHORIZATION'] = auth_header(env['HTTP_AUTHORIZATION'])
+
+    outstream = StringIO()
+    response = Response(stdout=outstream, stderr=sys.stderr)
+
+    publish_module('Zope2', stdin=instream,
+                   response=response,
+                   environ=env)
+    header_output.setResponseStatus(response.getStatus(), response.errmsg)
+    header_output.setResponseHeaders(response.headers)
+
+    # Restore previous security manager, which may have been changed
+    # by calling the publish method above
+    setSecurityManager(old_sm)
+
+    # Sync connection
+    sync()
+
+    return DocResponseWrapper(response, outstream, path, header_output)
+
+
+def FunctionalDocFileSuite(*paths, **kw):
+    globs = kw.setdefault('globs', {})
+    globs['http'] = http
+    globs['getRootFolder'] = getRootFolder
+    globs['sync'] = sync
+    globs['user_auth'] = base64.encodestring('%s:%s' % (user_name, user_password))
+
+    test_class = kw.get('test_class', FunctionalTestCase)
+
+    # If the passed-in test_class doesn't subclass Functional,
+    # we mix it in for you, but we will issue a warning.
+    if not issubclass(test_class, Functional):
+        name = test_class.__name__
+        warnings.warn(("The test_class you are using doesn't "
+                       "subclass from ZopeTestCase.Functional. "
+                       "Please fix that."), UserWarning, 2)
+        if not 'Functional' in name:
+            name = 'Functional%s' % name
+        test_class = type(name, (Functional, test_class), {})
+
+    kw['test_class'] = test_class
+    return ZopeDocFileSuite(*paths, **kw)
+
+
+def ZopeDocFileSuite(*paths, **kw):
+    globs = kw.setdefault('globs', {})
+
+    test_class = kw.get('test_class', ZopeTestCase)
+
+    # If the test_class does not have a runTest method, we add
+    # a dummy attribute so that TestCase construction works.
+    if not hasattr(test_class, 'runTest'):
+        setattr(test_class, 'runTest', None)
+
+    # Create a TestCase instance which will be used to
+    # execute the setUp and tearDown methods, as well as
+    # be passed into the test globals as 'self'.
+    test_instance = test_class()
+
+    if 'test_class' in kw:
+        del kw['test_class']
+
+    kw['package'] = doctest._normalize_module(kw.get('package'), depth=3)
+
+    kwsetUp = kw.get('setUp')
+    def setUp(test):
+        test.globs['test'] = test
+        test.globs['self'] = test_instance
+        test_instance.setUp()
+        if kwsetUp is not None:
+            kwsetUp(test_instance)
+
+    kw['setUp'] = setUp
+
+    kwtearDown = kw.get('tearDown')
+    def tearDown(test):
+        if kwtearDown is not None:
+            kwtearDown(test_instance)
+        test_instance.tearDown()
+
+    kw['tearDown'] = tearDown
+
+    if 'optionflags' not in kw:
+        kw['optionflags'] = (doctest.ELLIPSIS
+                             | doctest.REPORT_NDIFF
+                             | doctest.NORMALIZE_WHITESPACE)
+
+    return doctest.DocFileSuite(*paths, **kw)
+
+
+__all__ = [
+    'FunctionalDocFileSuite',
+    'ZopeDocFileSuite',
+    ]
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/functional.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.request
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.request	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.request	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,81 @@
+GET /@@contents.html HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+
+GET /@@contents.html HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/pl.gif HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/@@contents.html
+If-Modified-Since: Thu, 19 Aug 2004 10:10:04 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@singleBranchTree.xml HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/mi.gif HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/
+Authorization: Basic bWdyOm1ncnB3
+
+GET /++etc++site/@@manage HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/site_management.css HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/css,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/++etc++site/@@tasks.html
+Authorization: Basic bWdyOm1ncnB3
+

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.response
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.response	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0001.response	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,130 @@
+HTTP/1.1 401 Unauthorized
+X-Content-Type-Warning: guessed from content
+Content-Length: 89
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:05 GMT
+Content-Type: text/html;charset=utf-8
+WWW-Authenticate: basic realm=zope
+Server: zope.server.http (HTTP)
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en">
+
+...
+
+</html>
+
+HTTP/1.1 200 Ok
+X-Content-Type-Warning: guessed from content
+Content-Length: 89
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:13 GMT
+Content-Type: text/html;charset=utf-8
+Server: zope.server.http (HTTP)
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en">
+
+...
+
+</html>
+
+HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:15 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 200 Ok
+Content-Length: 183
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Expires: Fri, 13 Aug 2004 10:35:28 GMT
+Server: zope.server.http (HTTP)
+Pragma: no-cache
+Cache-Control: no-cache
+Date: Fri, 20 Aug 2004 10:35:28 GMT
+Content-Type: text/xml;charset=utf-8
+
+<?xml version="1.0" ?><children> <collection name="" length="0" icon_url="http://localhost:8081/@@/zope-app-folder-interfaces-IFolder-zmi_icon.gif" isroot=""></collection> </children>HTTP/1.1 200 Ok
+Last-Modified: Thu, 19 Aug 2004 10:10:06 GMT
+Content-Length: 868
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:47 GMT
+Cache-Control: public,max-age=86400
+Content-Type: image/gif
+Server: zope.server.http (HTTP)
+
+GIF89a  ÷  ÿ ÿ   PPP€€€ÀÀÀÿ  € @    @€€ €@ @ÿÿ ÿÿ€ €€@€€ÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                !ù    ,      @A H° Á*|0À  „6tH±¢Åƒ%:„qâŏ IräÆŒOX¹2¥AŽ=,Y2¤M‡ ;HTTP/1.1 303 See Other
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+Location: @@tasks.html
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:51 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 200 Ok
+Last-Modified: Thu, 19 Aug 2004 10:10:04 GMT
+Content-Length: 738
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:52 GMT
+Cache-Control: public,max-age=86400
+Content-Type: text/css;charset=utf-8
+Server: zope.server.http (HTTP)
+
+/*
+** Customisations for the Site Management view 
+** Used when the URL contains ++etc++site
+*/
+a {
+	color: #963;
+}
+
+#actions {
+    background: #963;
+    border-left: 1px solid #963;
+    border-right: 1px solid #963;
+}
+
+#actions a {
+	color: White;
+	border-left: 1px dashed white;
+}
+
+#actions a:hover {
+	color: black;
+	background-color: White;
+}
+
+#breadcrumbs {
+    border-bottom: 1px solid #963;
+}
+
+.itemViews {
+    border-bottom: 1px solid #963;
+}
+
+.itemViews a {
+    border: 1px solid #963;
+}
+
+.itemViews a.selected {
+    background: #963;
+    border-bottom: #963 1px solid;
+}
+
+.itemViews a:hover {
+    background-color: #963;
+    color: White;
+}
+
+hr {
+    color: #963;
+}
+
+
+h1, h2, h3, h4, h5, h6 {
+    border-bottom: 1px solid #963;
+}

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.request
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.request	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.request	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,145 @@
+GET /@@/zope3.css HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/css,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/@@contents.html
+If-Modified-Since: Thu, 19 Aug 2004 10:10:06 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/onlinehelp.js HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/@@contents.html
+If-Modified-Since: Thu, 19 Aug 2004 10:10:06 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/xmltree.js HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/@@contents.html
+If-Modified-Since: Thu, 19 Aug 2004 10:10:06 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/favicon.png HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+If-Modified-Since: Thu, 19 Aug 2004 10:10:06 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/zope3logo.gif HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/@@contents.html
+If-Modified-Since: Thu, 19 Aug 2004 10:10:04 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@singleBranchTree.xml HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/zope-app-folder-interfaces-IFolder-zmi_icon.gif HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/@@contents.html
+If-Modified-Since: Thu, 19 Aug 2004 10:10:08 GMT
+Authorization: Basic bWdyOm1ncnB3
+
+GET / HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@children.xml HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Authorization: Basic bWdyOm1ncnB3
+
+GET /@@/zope-app-site-interfaces-ISiteManager-zmi_icon.gif HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/
+Authorization: Basic bWdyOm1ncnB3
+
+GET /++etc++site/@@tasks.html HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Referer: http://localhost:8081/
+Authorization: Basic bWdyOm1ncnB3
+
+GET /++etc++site/@@singleBranchTree.xml HTTP/1.1
+Host: localhost:8081
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.1) Gecko/20031114
+Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 300
+Connection: keep-alive
+Authorization: Basic bWdyOm1ncnB3
+

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.response
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.response	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/recorded/test0002.response	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,118 @@
+HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:14 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:14 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:14 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:14 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:14 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 200 Ok
+Content-Length: 183
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Expires: Fri, 13 Aug 2004 10:35:15 GMT
+Server: zope.server.http (HTTP)
+Pragma: no-cache
+Cache-Control: no-cache
+Date: Fri, 20 Aug 2004 10:35:15 GMT
+Content-Type: text/xml;charset=utf-8
+
+<?xml version="1.0" ?><children> <collection name="" length="0" icon_url="http://localhost:8081/@@/zope-app-folder-interfaces-IFolder-zmi_icon.gif" isroot=""></collection> </children>HTTP/1.1 304 Not Modified
+X-Content-Type-Warning: guessed from content
+Content-Length: 0
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:15 GMT
+Content-Type: text/plain;charset=utf-8
+Server: zope.server.http (HTTP)
+
+HTTP/1.1 200 Ok
+X-Content-Type-Warning: guessed from content
+Content-Length: 89
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:27 GMT
+Content-Type: text/html;charset=utf-8
+Server: zope.server.http (HTTP)
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en">
+
+...
+
+</html>
+
+HTTP/1.1 200 Ok
+Content-Length: 175
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Expires: Fri, 13 Aug 2004 10:35:47 GMT
+Server: zope.server.http (HTTP)
+Pragma: no-cache
+Cache-Control: no-cache
+Date: Fri, 20 Aug 2004 10:35:47 GMT
+Content-Type: text/xml;charset=utf-8
+
+<?xml version="1.0" ?><children> <collection name="++etc++site" length="1" icon_url="http://localhost:8081/@@/zope-app-site-interfaces-ISiteManager-zmi_icon.gif"/> </children>HTTP/1.1 200 Ok
+Last-Modified: Thu, 19 Aug 2004 10:09:00 GMT
+Content-Length: 932
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:47 GMT
+Cache-Control: public,max-age=86400
+Content-Type: image/gif
+Server: zope.server.http (HTTP)
+
+GIF89a  ÷  NNN¨oÿ	ñï¶Wâã*çèEííqíí{‹‹‹îî†îî‡ïï‘ðð›ùâ¼ðð£òò­ôôÀõõËööÐøøÚùùâúúçúúëúúíýýôþþúÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               !ù   ,        H° Áƒ(D€p 
 ÐP ‚	2 À‘ã‡B6Ð02$D -jÈ€a€†  <` `£@rºÓÁ‚6¸¹3d€‚"Àt§Óœ-b°@ahQ¢7/T˜0¡éK¦¢"Шq§Æ¨:ª 6eÅ· ;HTTP/1.1 200 Ok
+X-Content-Type-Warning: guessed from content
+Content-Length: 89
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Date: Fri, 20 Aug 2004 10:35:51 GMT
+Content-Type: text/html;charset=utf-8
+Server: zope.server.http (HTTP)
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en">
+
+...
+
+</html>
+
+HTTP/1.1 200 Ok
+Content-Length: 325
+X-Powered-By: Zope (www.zope.org), Python (www.python.org)
+Expires: Fri, 13 Aug 2004 10:35:52 GMT
+Server: zope.server.http (HTTP)
+Pragma: no-cache
+Cache-Control: no-cache
+Date: Fri, 20 Aug 2004 10:35:52 GMT
+Content-Type: text/xml;charset=utf-8
+
+<?xml version="1.0" ?><children> <collection name="" length="0" icon_url="http://localhost:8081/@@/zope-app-folder-interfaces-IFolder-zmi_icon.gif" isroot=""><collection name="++etc++site" length="1" icon_url="http://localhost:8081/@@/zope-app-site-interfaces-ISiteManager-zmi_icon.gif"></collection></collection> </children>
\ No newline at end of file

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/runalltests.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/runalltests.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/runalltests.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,40 @@
+#
+# Runs all tests in the current directory [and below]
+#
+# Execute like:
+#   python runalltests.py [-R]
+#
+# 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'))
+
+import unittest, imp
+TestRunner = unittest.TextTestRunner
+suite = unittest.TestSuite()
+
+def visitor(recursive, dir, names):
+    tests = [n[:-3] for n in names if n.startswith('test') and n.endswith('.py')]
+
+    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)
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/runalltests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testAuthHeaderTest.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testAuthHeaderTest.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testAuthHeaderTest.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,52 @@
+#
+# Test for auth_header
+#
+
+# $Id: testAuthHeaderTest.py,v 1.2 2005/01/30 14:30:12 shh42 Exp $
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Testing import ZopeTestCase
+from Testing.ZopeTestCase.ztc_doctest import functional
+
+
+class AuthHeaderTestCase(ZopeTestCase.TestCase):
+
+    def test_auth_encoded(self):
+        auth_header = functional.auth_header
+        header = 'Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3'
+        self.assertEquals(auth_header(header), header)
+
+    def test_auth_non_encoded(self):
+        auth_header = functional.auth_header
+        header = 'Basic globalmgr:globalmgrpw'
+        expected = 'Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3'
+        self.assertEquals(auth_header(header), expected)
+
+    def test_auth_non_encoded_empty(self):
+        auth_header = functional.auth_header
+        header = 'Basic globalmgr:'
+        expected = 'Basic Z2xvYmFsbWdyOg=='
+        self.assertEquals(auth_header(header), expected)
+        header = 'Basic :pass'
+        expected = 'Basic OnBhc3M='
+        self.assertEquals(auth_header(header), expected)
+
+    def test_auth_non_encoded_colon(self):
+        auth_header = functional.auth_header
+        header = 'Basic globalmgr:pass:pass'
+        expected = 'Basic Z2xvYmFsbWdyOnBhc3M6cGFzcw=='
+        self.assertEquals(auth_header(header), expected)
+
+
+def test_suite():
+    from unittest import TestSuite, makeSuite
+    suite = TestSuite()
+    suite.addTest(makeSuite(AuthHeaderTestCase))
+    return suite
+
+if __name__ == '__main__':
+    framework()
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testAuthHeaderTest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testFunctionalDocTest.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testFunctionalDocTest.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testFunctionalDocTest.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,39 @@
+#
+# Example functional doctest
+#
+
+# $Id: testFunctionalDocTest.py,v 1.7 2005/02/16 14:21:59 shh42 Exp $
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Testing import ZopeTestCase
+ZopeTestCase.installProduct('PythonScripts')
+
+package = 'Testing.ZopeTestCase.ztc_doctest'
+
+
+def setUp(self):
+    '''This method will run after the test_class' setUp.
+    '''
+    self.folder.addDTMLDocument('index_html', file='index')
+
+    self.folder.manage_addProduct['PythonScripts'].manage_addPythonScript('script')
+    self.folder.script.ZPythonScript_edit(params='a=0', body='return a+1')
+
+    change_title = '''<dtml-call "manage_changeProperties(title=REQUEST.get('title'))">'''
+    self.folder.addDTMLMethod('change_title', file=change_title)
+
+
+def test_suite():
+    from unittest import TestSuite
+    from Testing.ZopeTestCase import FunctionalDocFileSuite
+
+    return TestSuite((
+        FunctionalDocFileSuite('FunctionalDocTest.txt', package=package, setUp=setUp),
+    ))
+
+if __name__ == '__main__':
+    framework()
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testFunctionalDocTest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testWarningsTest.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testWarningsTest.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testWarningsTest.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,26 @@
+#
+# Example functional doctest
+#
+
+# $Id: testWarningsTest.py,v 1.4 2005/02/16 14:21:59 shh42 Exp $
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Testing import ZopeTestCase
+
+package = 'Testing.ZopeTestCase.ztc_doctest'
+
+
+def test_suite():
+    from unittest import TestSuite
+    from Testing.ZopeTestCase import FunctionalDocFileSuite
+
+    return TestSuite((
+        FunctionalDocFileSuite('WarningsTest.txt', package=package),
+    ))
+
+if __name__ == '__main__':
+    framework()
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testWarningsTest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testZopeDocTest.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testZopeDocTest.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testZopeDocTest.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,32 @@
+#
+# Example Zope doctest
+#
+
+# $Id: testZopeDocTest.py,v 1.2 2005/02/16 14:21:59 shh42 Exp $
+
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Testing import ZopeTestCase
+
+package = 'Testing.ZopeTestCase.ztc_doctest'
+
+
+def setUp(self):
+    '''This method will run after the test_class' setUp.
+    '''
+    self.folder.manage_addFolder('object', '')
+
+
+def test_suite():
+    from unittest import TestSuite
+    from Testing.ZopeTestCase import ZopeDocFileSuite
+
+    return TestSuite((
+        ZopeDocFileSuite('ZopeDocTest.txt', package=package, setUp=setUp),
+    ))
+
+if __name__ == '__main__':
+    framework()
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/testZopeDocTest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/test_dochttp.py
===================================================================
--- Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/test_dochttp.py	2005-03-18 09:09:38 UTC (rev 29546)
+++ Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/test_dochttp.py	2005-03-18 10:02:57 UTC (rev 29547)
@@ -0,0 +1,135 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+"""Test tcpdoc
+
+$Id: test_dochttp.py,v 1.2 2004/10/21 21:19:09 shh42 Exp $
+"""
+import os, sys
+
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+import unittest
+from Testing import ZopeTestCase
+from dochttp import dochttp
+
+directory = os.path.join(os.path.split(ZopeTestCase.__file__)[0],
+                         'ztc_doctest', 'recorded')
+
+expected = r'''
+
+  >>> print http(r"""
+  ... GET /@@contents.html HTTP/1.1
+  ... """)
+  HTTP/1.1 401 Unauthorized
+  Content-Length: 89
+  Content-Type: text/html;charset=utf-8
+  Www-Authenticate: basic realm=zope
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+  ...
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /@@contents.html HTTP/1.1
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... """)
+  HTTP/1.1 200 Ok
+  Content-Length: 89
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+  ...
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/@@manage HTTP/1.1
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... Referer: http://localhost:8081/
+  ... """)
+  HTTP/1.1 303 See Other
+  Content-Length: 0
+  Content-Type: text/plain;charset=utf-8
+  Location: @@tasks.html
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET / HTTP/1.1
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... """)
+  HTTP/1.1 200 Ok
+  Content-Length: 89
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+  ...
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/@@tasks.html HTTP/1.1
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... Referer: http://localhost:8081/
+  ... """)
+  HTTP/1.1 200 Ok
+  Content-Length: 89
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+  ...
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+'''
+      
+class Test(unittest.TestCase):
+
+    def test_dochttp(self):
+        import sys, StringIO
+        old = sys.stdout
+        sys.stdout = StringIO.StringIO()
+        dochttp(['-p', 'test', directory])
+        got = sys.stdout.getvalue()
+        sys.stdout = old
+        self.assert_(got == expected)
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(Test))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: Zope/branches/five-integration/lib/python/Testing/ZopeTestCase/ztc_doctest/test_dochttp.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Zope-Checkins mailing list