[Zope3-checkins] CVS: Zope3/src/zope/testing - functional.py:1.8
Sidnei da Silva
sidnei@x3ng.com.br
Thu, 22 May 2003 09:58:56 -0400
Update of /cvs-repository/Zope3/src/zope/testing
In directory cvs.zope.org:/tmp/cvs-serv4564/src/zope/testing
Modified Files:
functional.py
Log Message:
Slowly getting there. Created a new HTTPTestCase base class for functional tests. Added a few functional tests for DAV and the DC namespace. Still need to solve the minidom issue.
=== Zope3/src/zope/testing/functional.py 1.7 => 1.8 ===
--- Zope3/src/zope/testing/functional.py:1.7 Thu May 1 15:35:51 2003
+++ Zope3/src/zope/testing/functional.py Thu May 22 09:58:55 2003
@@ -31,7 +31,9 @@
from zodb.storage.demo import DemoStorage
from zope.app import Application
from zope.app.publication.zopepublication import ZopePublication
+from zope.app.publication.http import HTTPPublication
from zope.publisher.browser import BrowserRequest
+from zope.publisher.http import HTTPRequest
from zope.publisher.publish import publish
from zope.exceptions import Forbidden, Unauthorized
@@ -170,7 +172,8 @@
request=BrowserRequest)
return request
- def publish(self, path, basic=None, form=None, env={}, handle_errors=False):
+ def publish(self, path, basic=None, form=None, env={},
+ handle_errors=False):
"""Renders an object at a given location.
Arguments are the same as in makeRequest with the following exception:
@@ -247,6 +250,61 @@
if errors:
self.fail("%s contains broken links:\n" % path
+ "\n".join([" %s:\t%s" % (a, e) for a, e in errors]))
+
+
+class HTTPTestCase(FunctionalTestCase):
+ """Functional test case for HTTP requests."""
+
+ def makeRequest(self, path='', basic=None, form=None, env={},
+ instream=None, outstream=None):
+ """Creates a new request object.
+
+ Arguments:
+ path -- the path to be traversed (e.g. "/folder1/index.html")
+ basic -- basic HTTP authentication credentials ("user:password")
+ form -- a dictionary emulating a form submission
+ (Note that field values should be Unicode strings)
+ env -- a dictionary of additional environment variables
+ (You can emulate HTTP request header
+ X-Header: foo
+ by adding 'HTTP_X_HEADER': 'foo' to env)
+ instream -- a stream from where the HTTP request will be read
+ outstream -- a stream where the HTTP response will be written
+ """
+ if outstream is None:
+ outstream = StringIO()
+ if instream is None:
+ instream = ''
+ environment = {"HTTP_HOST": 'localhost',
+ "HTTP_REFERER": 'localhost'}
+ environment.update(env)
+ app = FunctionalTestSetup().getApplication()
+ request = app._request(path, instream, outstream,
+ environment=environment,
+ basic=basic, form=form,
+ request=HTTPRequest, publication=HTTPPublication)
+ return request
+
+ def publish(self, path, basic=None, form=None, env={},
+ handle_errors=False, request_body=''):
+ """Renders an object at a given location.
+
+ Arguments are the same as in makeRequest with the following exception:
+ handle_errors -- if False (default), exceptions will not be caught
+ if True, exceptions will return a formatted error
+ page.
+
+ Returns the response object enhanced with the following methods:
+ getOutput() -- returns the full HTTP output as a string
+ getBody() -- returns the full response body as a string
+ getPath() -- returns the path used in the request
+ """
+ outstream = StringIO()
+ request = self.makeRequest(path, basic=basic, form=form, env=env,
+ instream=request_body, outstream=outstream)
+ response = ResponseWrapper(request.response, outstream, path)
+ publish(request, handle_errors=handle_errors)
+ return response
#
# Sample functional test case