[Checkins] SVN: zope.testbrowser/branches/jinty-webtest3/ * Dramatically reduce testing dependencies by moving the zope.app.testing based

Brian Sutherland jinty at web.de
Sun Jan 30 08:46:23 EST 2011


Log message for revision 120009:
  * Dramatically reduce testing dependencies by moving the zope.app.testing based
    Browser to zope.app.testing. Leave BBB imports in place and test them.
  * Bump version to 4.0.0.
  

Changed:
  U   zope.testbrowser/branches/jinty-webtest3/CHANGES.txt
  U   zope.testbrowser/branches/jinty-webtest3/buildout.cfg
  U   zope.testbrowser/branches/jinty-webtest3/setup.py
  U   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/README.txt
  A   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/connection.py
  U   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/cookies.txt
  D   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/ftests/ftesting.zcml
  U   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/testing.py
  A   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_bbb.py
  U   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_doctests.py
  U   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/webtest.py
  D   zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/zope-publisher.txt

-=-
Modified: zope.testbrowser/branches/jinty-webtest3/CHANGES.txt
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/CHANGES.txt	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/CHANGES.txt	2011-01-30 13:46:23 UTC (rev 120009)
@@ -2,7 +2,7 @@
 CHANGES
 =======
 
-3.11.2 (unreleased)
+4.0.0 (unreleased)
 -------------------
 
 - Integrate with WebTest. ``zope.testbrowser.wsgi.Browser`` is a new

Modified: zope.testbrowser/branches/jinty-webtest3/buildout.cfg
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/buildout.cfg	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/buildout.cfg	2011-01-30 13:46:23 UTC (rev 120009)
@@ -1,12 +1,17 @@
 [buildout]
 develop = .
-parts = test interpreter
+parts = test test_bbb interpreter
 
 [test]
 recipe = zc.recipe.testrunner
 defaults = ['--tests-pattern', '^f?tests$']
-eggs = zope.testbrowser [test, wsgi]
+eggs = zope.testbrowser [test]
 
+[test_bbb]
+recipe = zc.recipe.testrunner
+defaults = ['--tests-pattern', '^f?tests$']
+eggs = zope.testbrowser [test,test_bbb]
+
 [interpreter]
 recipe = zc.recipe.egg
 eggs = zope.testbrowser

Modified: zope.testbrowser/branches/jinty-webtest3/setup.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/setup.py	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/setup.py	2011-01-30 13:46:23 UTC (rev 120009)
@@ -27,7 +27,7 @@
 
 setup(
     name = 'zope.testbrowser',
-    version='3.11.2dev',
+    version='4.0.0dev',
     url = 'http://pypi.python.org/pypi/zope.testbrowser',
     license = 'ZPL 2.1',
     description = 'Programmable browser for functional black-box tests',
@@ -57,22 +57,19 @@
         ],
     extras_require = {
         'test': [
-            'WebTest',
-            'zope.browserpage',
-            'zope.component',
-            'zope.container',
-            'zope.principalregistry',
-            'zope.publisher',
-            'zope.security',
-            'zope.site',
-            'zope.traversing',
-            'zope.app.appsetup',
-            'zope.app.publication',
-            'zope.app.testing >= 3.8.1',
+            'zope.testing',
+            'zope.pagetemplate',
+            'zope.testbrowser [webtest,wsgi]',
             ],
+        'test_bbb': [
+            'zope.testbrowser [test,zope-functional-testing]',
+            ],
         'zope-functional-testing': [
-            'zope.app.testing',
+            'zope.app.testing >= 3.9.0dev',
             ],
+        'webtest': [
+            'WebTest',
+            ],
         'wsgi': [
             'wsgi_intercept',
             ]

Modified: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/README.txt
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/README.txt	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/README.txt	2011-01-30 13:46:23 UTC (rev 120009)
@@ -59,13 +59,6 @@
     Hello world!
     ...
 
-There is also a special version of the ``Browser`` class used to do functional
-testing of Zope 3 applications, it can be imported from
-``zope.testbrowser.testing``:
-
-    >>> from zope.testbrowser.testing import Browser as TestingBrowser
-    >>> browser = TestingBrowser()
-
 Bowser Usage
 ------------
 

Added: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/connection.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/connection.py	                        (rev 0)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/connection.py	2011-01-30 13:46:23 UTC (rev 120009)
@@ -0,0 +1,96 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Foundation 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.
+#
+##############################################################################
+"""Base classes sometimes useful to implement browsers
+"""
+import cStringIO
+import httplib
+import mechanize
+import socket
+import sys
+import zope.testbrowser.browser
+
+
+class Response(object):
+    """``mechanize`` compatible response object."""
+
+    def __init__(self, content, headers, status, reason):
+        self.content = content
+        self.status = status
+        self.reason = reason
+        self.msg = httplib.HTTPMessage(cStringIO.StringIO(headers), 0)
+        self.content_as_file = cStringIO.StringIO(self.content)
+
+    def read(self, amt=None):
+        return self.content_as_file.read(amt)
+
+    def close(self):
+        """To overcome changes in mechanize and socket in python2.5"""
+        pass
+
+class HTTPHandler(mechanize.HTTPHandler):
+
+    def _connect(self, *args, **kw):
+        raise NotImplementedError("implement")
+
+    def http_request(self, req):
+        # look at data and set content type
+        if req.has_data():
+            data = req.get_data()
+            if isinstance(data, dict):
+                req.add_data(data['body'])
+                req.add_unredirected_header('Content-type',
+                                            data['content-type'])
+        return mechanize.HTTPHandler.do_request_(self, req)
+
+    https_request = http_request
+
+    def http_open(self, req):
+        """Open an HTTP connection having a ``mechanize`` request."""
+        # Here we connect to the publisher.
+        if sys.version_info > (2, 6) and not hasattr(req, 'timeout'):
+            # Workaround mechanize incompatibility with Python
+            # 2.6. See: LP #280334
+            req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT
+        return self.do_open(self._connect, req)
+
+    https_open = http_open
+
+class MechanizeBrowser(mechanize.Browser):
+    """Special ``mechanize`` browser using the Zope Publisher HTTP handler."""
+
+    default_schemes = ['http']
+    default_others = ['_http_error', '_http_default_error']
+    default_features = ['_redirect', '_cookies', '_referer', '_refresh',
+                        '_equiv', '_basicauth', '_digestauth']
+
+
+    def __init__(self, *args, **kws):
+        inherited_handlers = ['_unknown', '_http_error',
+            '_http_default_error', '_basicauth',
+            '_digestauth', '_redirect', '_cookies', '_referer',
+            '_refresh', '_equiv', '_gzip']
+
+        self.handler_classes = {"http": self._http_handler}
+        for name in inherited_handlers:
+            self.handler_classes[name] = mechanize.Browser.handler_classes[name]
+
+        kws['request_class'] = kws.get('request_class',
+                                       mechanize._request.Request)
+
+        mechanize.Browser.__init__(self, *args, **kws)
+
+    def _http_handler(self, *args, **kw):
+        return NotImplementedError("Try return a sub-class of PublisherHTTPHandler here")
+
+


Property changes on: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/connection.py
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/cookies.txt
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/cookies.txt	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/cookies.txt	2011-01-30 13:46:23 UTC (rev 120009)
@@ -227,7 +227,7 @@
     ...     'http://localhost/set_cookie.html?name=max&value=min&'
     ...     'max-age=3000&&comment=silly+billy')
     >>> pprint.pprint(browser.cookies.getinfo('max')) # doctest: +ELLIPSIS
-    {'comment': 'silly billy',
+    {'comment': '"silly billy"',
      'commenturl': None,
      'domain': 'localhost.local',
      'expires': datetime.datetime(..., tzinfo=<UTC>),
@@ -256,7 +256,7 @@
       'port': None,
       'secure': False,
       'value': 'bar'},
-     {'comment': 'silly billy',
+     {'comment': '"silly billy"',
       'commenturl': None,
       'domain': 'localhost.local',
       'expires': datetime.datetime(..., tzinfo=<UTC>),

Deleted: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/ftests/ftesting.zcml
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/ftests/ftesting.zcml	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/ftests/ftesting.zcml	2011-01-30 13:46:23 UTC (rev 120009)
@@ -1,42 +0,0 @@
-<configure
-  xmlns="http://namespaces.zope.org/zope"
-  xmlns:browser="http://namespaces.zope.org/browser"
-  i18n_domain="zope"
-  package="zope.testbrowser"
-  >
-
-  <!-- This file is used for functional testing setup -->
-
-  <include package="zope.browserpage" file="meta.zcml" />
-  <include package="zope.component" file="meta.zcml" />
-  <include package="zope.security" file="meta.zcml" />
-  <include package="zope.app.publication" file="meta.zcml" />
-
-  <include package="zope.container" />
-  <include package="zope.principalregistry" />
-  <include package="zope.publisher" />
-  <include package="zope.security" />
-  <include package="zope.site" />
-  <include package="zope.traversing" />
-
-  <include package="zope.app.appsetup" />
-  <include package="zope.app.publication" />
-
-  <securityPolicy
-      component="zope.security.simplepolicies.PermissiveSecurityPolicy" />
-
-  <browser:page
-     name="echo.html"
-     for="*"
-     class=".ftests.Echo"
-     permission="zope.Public"
-     />
-
-  <browser:page
-     name="echo_one.html"
-     for="*"
-     class=".ftests.EchoOne"
-     permission="zope.Public"
-     />
-
-</configure>

Modified: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/testing.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/testing.py	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/testing.py	2011-01-30 13:46:23 UTC (rev 120009)
@@ -11,187 +11,21 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""Zope 3-specific testing code
+"""BBB for Zope 3-specific testing code
 """
-import cStringIO
-import httplib
-import mechanize
-import socket
-import sys
-import zope.testbrowser.browser
 
-#
-# Base classes sometimes useful to implement browsers
-#
+from zope.testbrowser.connection import Response as PublisherResponse
 
-class Response(object):
-    """``mechanize`` compatible response object."""
+try:
+    import zope.app.testing
+    have_zope_app_testing = True
+except ImportError:
+    have_zope_app_testing = False
 
-    def __init__(self, content, headers, status, reason):
-        self.content = content
-        self.status = status
-        self.reason = reason
-        self.msg = httplib.HTTPMessage(cStringIO.StringIO(headers), 0)
-        self.content_as_file = cStringIO.StringIO(self.content)
+if have_zope_app_testing:
+    from zope.app.testing.testbrowser import (PublisherConnection,
+                                              PublisherHTTPHandler,
+                                              PublisherMechanizeBrowser,
+                                              Browser)
 
-    def read(self, amt=None):
-        return self.content_as_file.read(amt)
-
-    def close(self):
-        """To overcome changes in mechanize and socket in python2.5"""
-        pass
-
-class HTTPHandler(mechanize.HTTPHandler):
-
-    def _connect(self, *args, **kw):
-        raise NotImplementedError("implement")
-
-    def http_request(self, req):
-        # look at data and set content type
-        if req.has_data():
-            data = req.get_data()
-            if isinstance(data, dict):
-                req.add_data(data['body'])
-                req.add_unredirected_header('Content-type',
-                                            data['content-type'])
-        return mechanize.HTTPHandler.do_request_(self, req)
-
-    https_request = http_request
-
-    def http_open(self, req):
-        """Open an HTTP connection having a ``mechanize`` request."""
-        # Here we connect to the publisher.
-        if sys.version_info > (2, 6) and not hasattr(req, 'timeout'):
-            # Workaround mechanize incompatibility with Python
-            # 2.6. See: LP #280334
-            req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT
-        return self.do_open(self._connect, req)
-
-    https_open = http_open
-
-class MechanizeBrowser(mechanize.Browser):
-    """Special ``mechanize`` browser using the Zope Publisher HTTP handler."""
-
-    default_schemes = ['http']
-    default_others = ['_http_error', '_http_default_error']
-    default_features = ['_redirect', '_cookies', '_referer', '_refresh',
-                        '_equiv', '_basicauth', '_digestauth']
-
-
-    def __init__(self, *args, **kws):
-        inherited_handlers = ['_unknown', '_http_error',
-            '_http_default_error', '_basicauth',
-            '_digestauth', '_redirect', '_cookies', '_referer',
-            '_refresh', '_equiv', '_gzip']
-
-        self.handler_classes = {"http": self._http_handler}
-        for name in inherited_handlers:
-            self.handler_classes[name] = mechanize.Browser.handler_classes[name]
-
-        kws['request_class'] = kws.get('request_class',
-                                       mechanize._request.Request)
-
-        mechanize.Browser.__init__(self, *args, **kws)
-
-    def _http_handler(self, *args, **kw):
-        return NotImplementedError("Try return a sub-class of PublisherHTTPHandler here")
-
-#
-# Zope Publisher Browser implementation
-#
-
-PublisherResponse = Response # BBB
-
-class PublisherConnection(object):
-    """A ``mechanize`` compatible connection object."""
-
-    def __init__(self, host, timeout=None):
-        from zope.app.testing.functional import HTTPCaller
-        self.caller = HTTPCaller()
-        self.host = host
-
-    def set_debuglevel(self, level):
-        pass
-
-    def _quote(self, url):
-        # the publisher expects to be able to split on whitespace, so we have
-        # to make sure there is none in the URL
-        return url.replace(' ', '%20')
-
-    def request(self, method, url, body=None, headers=None):
-        """Send a request to the publisher.
-
-        The response will be stored in ``self.response``.
-        """
-        if body is None:
-            body = ''
-
-        if url == '':
-            url = '/'
-
-        url = self._quote(url)
-        # Extract the handle_error option header
-        if sys.version_info >= (2,5):
-            handle_errors_key = 'X-Zope-Handle-Errors'
-        else:
-            handle_errors_key = 'X-zope-handle-errors'
-        handle_errors_header = headers.get(handle_errors_key, True)
-        if handle_errors_key in headers:
-            del headers[handle_errors_key]
-        # Translate string to boolean.
-        handle_errors = {'False': False}.get(handle_errors_header, True)
-
-        # Construct the headers.
-        header_chunks = []
-        if headers is not None:
-            for header in headers.items():
-                header_chunks.append('%s: %s' % header)
-            headers = '\n'.join(header_chunks) + '\n'
-        else:
-            headers = ''
-
-        # Construct the full HTTP request string, since that is what the
-        # ``HTTPCaller`` wants.
-        request_string = (method + ' ' + url + ' HTTP/1.1\n'
-                          + headers + '\n' + body)
-        self.response = self.caller(request_string, handle_errors)
-
-    def getresponse(self):
-        """Return a ``mechanize`` compatible response.
-
-        The goal of ths method is to convert the Zope Publisher's reseponse to
-        a ``mechanize`` compatible response, which is also understood by
-        mechanize.
-        """
-        real_response = self.response._response
-        status = real_response.getStatus()
-        reason = real_response._reason # XXX add a getReason method
-
-        headers = real_response.getHeaders()
-        headers.sort()
-        headers.insert(0, ('Status', real_response.getStatusString()))
-        headers = '\r\n'.join('%s: %s' % h for h in headers)
-        content = real_response.consumeBody()
-        return Response(content, headers, status, reason)
-
-
-class PublisherHTTPHandler(HTTPHandler):
-    """Special HTTP handler to use the Zope Publisher."""
-
-    def _connect(self, *args, **kw):
-        return PublisherConnection(*args, **kw)
-
-
-class PublisherMechanizeBrowser(MechanizeBrowser):
-    """Special ``mechanize`` browser using the Zope Publisher HTTP handler."""
-
-    def _http_handler(self, *args, **kw):
-        return PublisherHTTPHandler(*args, **kw)
-
-
-class Browser(zope.testbrowser.browser.Browser):
-    """A Zope `testbrowser` Browser that uses the Zope Publisher."""
-
-    def __init__(self, url=None):
-        mech_browser = PublisherMechanizeBrowser()
-        super(Browser, self).__init__(url=url, mech_browser=mech_browser)
+del have_zope_app_testing

Added: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_bbb.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_bbb.py	                        (rev 0)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_bbb.py	2011-01-30 13:46:23 UTC (rev 120009)
@@ -0,0 +1,32 @@
+##############################################################################
+#
+# Copyright (c) 2011 Zope Foundation 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 unittest
+
+class TestZopeAppTesting(unittest.TestCase):
+
+    def test_import(self):
+        from zope.testbrowser.testing import Browser
+        browser = Browser()
+
+def test_suite():
+    suite = unittest.TestSuite()
+    loader = unittest.TestLoader().loadTestsFromTestCase
+
+    try:
+        import zope.app.testing
+        suite.addTest(loader(TestZopeAppTesting))
+    except ImportError:
+        pass
+
+    return suite


Property changes on: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_bbb.py
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_doctests.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_doctests.py	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/tests/test_doctests.py	2011-01-30 13:46:23 UTC (rev 120009)
@@ -14,29 +14,16 @@
 import doctest
 import pkg_resources
 import unittest
-import zope.app.testing.functional
 
 import zope.testbrowser.ftests.wsgitestapp
 import zope.testbrowser.webtest
 
-
-TestBrowserLayer = zope.app.testing.functional.ZCMLLayer(
-    pkg_resources.resource_filename(
-        'zope.testbrowser', 'ftests/ftesting.zcml'),
-    __name__, 'TestBrowserLayer', allow_teardown=True)
-
 def make_browser(*args, **kw):
     app = zope.testbrowser.ftests.wsgitestapp.WSGITestApplication()
     return zope.testbrowser.webtest.Browser(app, *args, **kw)
 
 def test_suite():
     flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
-    
-    zope_publisher = zope.app.testing.functional.FunctionalDocFileSuite('zope-publisher.txt',
-        optionflags=flags,
-        package='zope.testbrowser',
-        checker=zope.testbrowser.tests.helper.checker)
-    zope_publisher.layer = TestBrowserLayer
 
     suite = doctest.DocFileSuite(
         'README.txt',
@@ -52,4 +39,4 @@
                                 package='zope.testbrowser')
     wire.level = 2
 
-    return unittest.TestSuite((zope_publisher, suite, wire))
+    return unittest.TestSuite((suite, wire))

Modified: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/webtest.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/webtest.py	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/webtest.py	2011-01-30 13:46:23 UTC (rev 120009)
@@ -26,7 +26,7 @@
 from webtest import TestApp
 
 import zope.testbrowser.browser
-import zope.testbrowser.testing
+import zope.testbrowser.connection
 
 class WSGIConnection(object):
     """A ``mechanize`` compatible connection object."""
@@ -111,14 +111,14 @@
         headers.insert(0, ('Status', response.status))
         headers = '\r\n'.join('%s: %s' % h for h in headers)
         content = response.body
-        return zope.testbrowser.testing.Response(content, headers, status, reason)
+        return zope.testbrowser.connection.Response(content, headers, status, reason)
 
 
-class WSGIHTTPHandler(zope.testbrowser.testing.HTTPHandler):
+class WSGIHTTPHandler(zope.testbrowser.connection.HTTPHandler):
 
     def __init__(self, test_app, *args, **kw):
         self._test_app = test_app
-        zope.testbrowser.testing.HTTPHandler.__init__(self, *args, **kw)
+        zope.testbrowser.connection.HTTPHandler.__init__(self, *args, **kw)
 
     def _connect(self, *args, **kw):
         return WSGIConnection(self._test_app, *args, **kw)
@@ -128,12 +128,12 @@
         return self.http_request(req)
 
 
-class WSGIMechanizeBrowser(zope.testbrowser.testing.MechanizeBrowser):
+class WSGIMechanizeBrowser(zope.testbrowser.connection.MechanizeBrowser):
     """Special ``mechanize`` browser using the WSGI HTTP handler."""
 
     def __init__(self, test_app, *args, **kw):
         self._test_app = test_app
-        zope.testbrowser.testing.MechanizeBrowser.__init__(self, *args, **kw)
+        zope.testbrowser.connection.MechanizeBrowser.__init__(self, *args, **kw)
 
     def _http_handler(self, *args, **kw):
         return WSGIHTTPHandler(self._test_app, *args, **kw)

Deleted: zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/zope-publisher.txt
===================================================================
--- zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/zope-publisher.txt	2011-01-30 13:30:33 UTC (rev 120008)
+++ zope.testbrowser/branches/jinty-webtest3/src/zope/testbrowser/zope-publisher.txt	2011-01-30 13:46:23 UTC (rev 120009)
@@ -1,81 +0,0 @@
-Zope Publisher Browser Tests
-============================
-
-These tests specifically test the implementation of Browser which uses the Zope
-Publisher via zope.app.testing as the application to test.
-
-    >>> from zope.testbrowser.testing import Browser
-    >>> browser = Browser()
-
-Error Handling
---------------
-
-handleErrors works as advertised:
-    
-    >>> browser.handleErrors
-    True
-    >>> browser.open('http://localhost/invalid')
-    Traceback (most recent call last):
-    ...
-    HTTPError: HTTP Error 404: Not Found
-
-So when we tell the publisher not to handle the errors,
-
-    >>> browser.handleErrors = False
-    >>> browser.open('http://localhost/invalid')
-    Traceback (most recent call last):
-    ...
-    NotFound: Object: <zope.site.folder.Folder object at ...>,
-              name: u'invalid'
-
-Spaces in URLs
---------------
-
-Spaces in URLs don't cause blowups:
-
-    >>> browser.open('http://localhost/space here')
-    Traceback (most recent call last):
-    ...
-    NotFound: Object: <zope.site.folder.Folder object at ...>,
-              name: u'space here'
-
-Headers
--------
-
-Sending arbitrary headers works:
-
-    >>> browser.addHeader('Accept-Language', 'en-US')
-    >>> browser.open('http://localhost/echo_one.html?var=HTTP_ACCEPT_LANGUAGE')
-    >>> print browser.contents
-    'en-US'
-
-POST
-----
-
-HTTP posts are correctly sent:
-
-    >>> browser.post('http://localhost/echo.html', 'x=1&y=2')
-    >>> print browser.contents
-    CONTENT_LENGTH: 7
-    CONTENT_TYPE: application/x-www-form-urlencoded
-    HTTP_ACCEPT_LANGUAGE: en-US
-    HTTP_CONNECTION: close
-    HTTP_HOST: localhost
-    HTTP_USER_AGENT: Python-urllib/2.4
-    PATH_INFO: /echo.html
-    REQUEST_METHOD: POST
-    x: 1
-    y: 2
-    Body: ''
-    
-Returned headers
-----------------
-
-Server headers are correctly returned:
-
-    >>> print browser.headers
-    Status: 200 OK
-    Content-Length: 123
-    Content-Type: text/plain;charset=utf-8
-    X-Content-Type-Warning: guessed from content
-    X-Powered-By: Zope (www.zope.org), Python (www.python.org)



More information about the checkins mailing list