[Checkins] SVN: zope.testbrowser/branches/jinty-webtest2/s Remove zope.app.wsgi dependency by re-implementing the test application as a
Brian Sutherland
jinty at web.de
Mon Jan 17 04:00:42 EST 2011
Log message for revision 119616:
Remove zope.app.wsgi dependency by re-implementing the test application as a
pure WebOb based application.
Currently the application needs to do some gymnastics to be 100% compatible
with the existing tests. In a 3rd branch, I'll remove the gymnastics by
refactoring the existing tests.
Changed:
U zope.testbrowser/branches/jinty-webtest2/setup.py
A zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/ftests/wsgitestapp.py
U zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/tests.py
-=-
Modified: zope.testbrowser/branches/jinty-webtest2/setup.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest2/setup.py 2011-01-17 08:56:02 UTC (rev 119615)
+++ zope.testbrowser/branches/jinty-webtest2/setup.py 2011-01-17 09:00:42 UTC (rev 119616)
@@ -58,7 +58,6 @@
extras_require = {
'test': [
'WebTest',
- 'zope.app.wsgi',
'zope.browserpage',
'zope.browserresource',
'zope.component',
Added: zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/ftests/wsgitestapp.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/ftests/wsgitestapp.py (rev 0)
+++ zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/ftests/wsgitestapp.py 2011-01-17 09:00:42 UTC (rev 119616)
@@ -0,0 +1,144 @@
+##############################################################################
+#
+# Copyright (c) 2010 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.
+#
+##############################################################################
+"""A minimal WSGI application used as a test fixture."""
+
+import os
+import mimetypes
+from datetime import datetime
+
+from webob import Request, Response
+from zope.pagetemplate.pagetemplatefile import PageTemplateFile
+
+from zope.testbrowser import ftests
+
+class NotFound(Exception):
+
+ def __init__(self, ob, name):
+ self.ob = ob
+ self.name = name
+
+ def __str__(self):
+ return 'Object: %s, name: %r' % (self.ob, self.name)
+
+
+class ZopeRequestAdapter(object):
+ """Adapt a webob request into enough of a zope.publisher request for the tests to pass"""
+
+ def __init__(self, request, response=None):
+ self._request = request
+ self._response = response
+
+ @property
+ def form(self):
+ return self._request.params
+
+ def __getitem__(self, name):
+ return self._request.params[name]
+
+_HERE = os.path.dirname(__file__)
+
+class MyPageTemplateFile(PageTemplateFile):
+
+ def pt_getContext(self, args, *extra_args, **kw):
+ request = args[0]
+ namespace = super(MyPageTemplateFile, self).pt_getContext(args, *extra_args, **kw)
+ namespace['request'] = request
+ return namespace
+
+class WSGITestApplication(object):
+
+ def __call__(self, environ, start_response):
+ req = Request(environ)
+ handler = {'/set_status.html': set_status,
+ '/@@echo.html': echo,
+ '/echo_one.html': echo_one,
+ '/set_cookie.html': set_cookie,
+ '/get_cookie.html': get_cookie,
+ '/inner/set_cookie.html': set_cookie,
+ '/inner/get_cookie.html': get_cookie,
+ '/inner/path/set_cookie.html': set_cookie,
+ '/inner/path/get_cookie.html': get_cookie,
+ }.get(req.path_info)
+ if handler is None and req.path_info.startswith('/@@/testbrowser/'):
+ handler = handle_resource
+ if handler is None:
+ handler = handle_notfound
+ try:
+ resp = handler(req)
+ except Exception, exc:
+ if not environ.get('wsgi.handleErrors', True):
+ raise
+ resp = Response()
+ resp.status = {NotFound: 404}.get(type(exc), 500)
+ resp.headers.add('X-Powered-By', 'Zope (www.zope.org), Python (www.python.org)')
+ return resp(environ, start_response)
+
+def handle_notfound(req):
+ raise NotFound('<WSGI application>', unicode(req.path_info[1:]))
+
+def handle_resource(req):
+ filename = req.path_info.split('/')[-1]
+ type, _ = mimetypes.guess_type(filename)
+ path = os.path.join(_HERE, filename)
+ if type == 'text/html':
+ pt = MyPageTemplateFile(path)
+ zreq = ZopeRequestAdapter(req)
+ contents = pt(zreq)
+ else:
+ contents = open(path, 'r').read()
+ return Response(contents, content_type=type)
+
+def get_cookie(req):
+ cookies = ['%s: %s' % i for i in sorted(req.cookies.items())]
+ return Response('\n'.join(cookies))
+
+def set_cookie(req):
+ cookie_parms = {'path': None}
+ cookie_parms.update(dict((str(k), str(v)) for k, v in req.params.items()))
+ name = cookie_parms.pop('name')
+ value = cookie_parms.pop('value')
+ if 'max-age' in cookie_parms:
+ cookie_parms['max_age'] = int(cookie_parms.pop('max-age'))
+ if 'expires' in cookie_parms:
+ cookie_parms['expires'] = datetime.strptime(cookie_parms.pop('expires'), '%a, %d %b %Y %H:%M:%S GMT')
+ resp = Response()
+ resp.set_cookie(name, value, **cookie_parms)
+ return resp
+
+def echo(req):
+ items = []
+ for k in ftests._interesting_environ:
+ v = req.environ.get(k, None)
+ if v is None:
+ continue
+ items.append('%s: %s' % (k, v))
+ items.extend('%s: %s' % x for x in sorted(req.params.items()))
+ if req.method == 'POST' and req.content_type == 'application/x-www-form-urlencoded':
+ body = ''
+ else:
+ body = req.body
+ items.append('Body: %r' % body)
+ return Response('\n'.join(items))
+
+def echo_one(req):
+ resp = repr(req.environ.get(req.params['var']))
+ return Response(resp)
+
+def set_status(req):
+ status = req.params.get('status')
+ if status:
+ resp = Response('Just set a status of %s' % status)
+ resp.status = int(status)
+ return resp
+ return Response('Everything fine')
Property changes on: zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/ftests/wsgitestapp.py
___________________________________________________________________
Added: svn:eol-style
+ native
Modified: zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/tests.py
===================================================================
--- zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/tests.py 2011-01-17 08:56:02 UTC (rev 119615)
+++ zope.testbrowser/branches/jinty-webtest2/src/zope/testbrowser/tests.py 2011-01-17 09:00:42 UTC (rev 119616)
@@ -24,7 +24,6 @@
import sys
from webtest import TestApp
-from zope.app.wsgi import WSGIPublisherApplication
from zope.app.testing.functional import FunctionalDocFileSuite
import zope.app.testing.functional
import zope.testing.renormalizing
@@ -32,6 +31,7 @@
import zope.testbrowser.browser
from zope.testbrowser.testing import Browser as TestingBrowser
from zope.testbrowser.wsgi import Browser as WSGIBrowser
+from zope.testbrowser.ftests.wsgitestapp import WSGITestApplication
def set_next_response(body, headers=None, status='200', reason='OK'):
global next_response_body
@@ -462,6 +462,12 @@
(re.compile(r'Host: localhost'), 'Connection: close'),
(re.compile(r'Content-Type: '), 'Content-type: '),
(re.compile(r'Content-Disposition: '), 'Content-disposition: '),
+ (re.compile(r'; charset=UTF-8'), ';charset=utf-8'),
+ # webtest quotes cookies differently to zope.publisher
+ (re.compile(r'\'comment\': \'"silly billy"\','), "'comment': 'silly%20billy',"),
+ # webtest seems to expire cookies one second before the date set in set_cookie
+ (re.compile(r"'expires': datetime.datetime\(2029, 12, 31, 23, 59, 59, tzinfo=<UTC>\),"), "'expires': datetime.datetime(2030, 1, 1, 0, 0, tzinfo=<UTC>),"),
+ (re.compile(r"Object: <WSGI application>,"), "Object: <zope.site.folder.Folder object at ...>,"),
])
TestBrowserLayer = zope.app.testing.functional.ZCMLLayer(
@@ -497,26 +503,27 @@
# re-run the above tests using the WSGI connectior
def make_browser(*args, **kw):
- app = WSGIPublisherApplication(TestBrowserLayer.setup.db)
+ app = WSGITestApplication()
test_app = TestApp(app)
return WSGIBrowser(test_app, *args, **kw)
globals = dict(Browser=make_browser)
- readme = FunctionalDocFileSuite('README.txt', optionflags=flags,
+ readme = doctest.DocFileSuite('README.txt', optionflags=flags,
checker=checker, globs=globals)
- readme.layer = TestBrowserLayer
- cookies = FunctionalDocFileSuite('cookies.txt', optionflags=flags,
- checker=checker, globs=globals)
- cookies.layer = TestBrowserLayer
+ def setUp(test):
+ root = {}
+ def fakeGetRootFolder():
+ return root
+ test.globs['getRootFolder'] = fakeGetRootFolder
+ cookies = doctest.DocFileSuite('cookies.txt', optionflags=flags,
+ checker=checker, globs=globals, setUp=setUp)
- fixed_bugs = FunctionalDocFileSuite('fixed-bugs.txt', optionflags=flags,
+ fixed_bugs = doctest.DocFileSuite('fixed-bugs.txt', optionflags=flags,
globs=globals)
- fixed_bugs.layer = TestBrowserLayer
- wsgi = FunctionalDocFileSuite('wsgi.txt', optionflags=flags,
+ wsgi = doctest.DocFileSuite('wsgi.txt', optionflags=flags,
checker=checker, globs=globals)
- wsgi.layer = TestBrowserLayer
tests.extend([readme, cookies, fixed_bugs, wsgi])
More information about the checkins
mailing list