[Checkins] SVN: zope.app.wsgi/trunk/src/zope/app/wsgi/ - move fixtures from tests to testing.py
Jan-Jaap Driessen
jdriessen at thehealthagency.com
Fri Nov 12 09:11:24 EST 2010
Log message for revision 118364:
- move fixtures from tests to testing.py
- add tests for testlayer setting up middleware
- add filereturn test to separate file.
Changed:
A zope.app.wsgi/trunk/src/zope/app/wsgi/filereturns.txt
U zope.app.wsgi/trunk/src/zope/app/wsgi/testing.py
A zope.app.wsgi/trunk/src/zope/app/wsgi/testlayer.txt
U zope.app.wsgi/trunk/src/zope/app/wsgi/tests.py
-=-
Added: zope.app.wsgi/trunk/src/zope/app/wsgi/filereturns.txt
===================================================================
--- zope.app.wsgi/trunk/src/zope/app/wsgi/filereturns.txt (rev 0)
+++ zope.app.wsgi/trunk/src/zope/app/wsgi/filereturns.txt 2010-11-12 14:11:24 UTC (rev 118364)
@@ -0,0 +1,40 @@
+We want to make sure that file returns work
+
+Let's register a view that returns a temporary file and make sure that
+nothing bad happens. :)
+
+ >>> from zope import component, interface
+ >>> from zope.app.wsgi.testing import FileView
+ >>> component.provideAdapter(FileView, name='test-file-view.html')
+ >>> from zope.security import checker
+ >>> checker.defineChecker(
+ ... FileView,
+ ... checker.NamesChecker(['browserDefault', '__call__']),
+ ... )
+
+ >>> from zope.app.wsgi.testlayer import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open('http://localhost/@@test-file-view.html')
+ >>> browser.headers['content-type']
+ 'text/plain'
+
+ >>> browser.headers['content-length']
+ '13'
+
+ >>> print browser.contents
+ Hello
+ World!
+ <BLANKLINE>
+
+Clean up:
+
+ >>> import zope.publisher.interfaces.browser
+ >>> checker.undefineChecker(FileView)
+ >>> component.provideAdapter(
+ ... None,
+ ... (interface.Interface,
+ ... zope.publisher.interfaces.browser.IBrowserRequest),
+ ... zope.publisher.interfaces.browser.IBrowserPublisher,
+ ... 'test-file-view.html',
+ ... )
Modified: zope.app.wsgi/trunk/src/zope/app/wsgi/testing.py
===================================================================
--- zope.app.wsgi/trunk/src/zope/app/wsgi/testing.py 2010-11-12 14:08:18 UTC (rev 118363)
+++ zope.app.wsgi/trunk/src/zope/app/wsgi/testing.py 2010-11-12 14:11:24 UTC (rev 118364)
@@ -15,11 +15,66 @@
$Id$
"""
+import tempfile
-__docformat__ = "reStructuredText"
+from zope import interface, component
+import zope.publisher.interfaces.browser
-import zope.app.wsgi
from zope.app.wsgi.testlayer import BrowserLayer
-AppWSGILayer = BrowserLayer(zope.app.wsgi)
+class FileView:
+
+ interface.implements(zope.publisher.interfaces.browser.IBrowserPublisher)
+ component.adapts(interface.Interface,
+ zope.publisher.interfaces.browser.IBrowserRequest)
+
+ def __init__(self, _, request):
+ self.request = request
+
+ def browserDefault(self, *_):
+ return self, ()
+
+ def __call__(self):
+ self.request.response.setHeader('content-type', 'text/plain')
+ f = tempfile.TemporaryFile()
+ f.write("Hello\nWorld!\n")
+ return f
+
+
+class IndexView(FileView):
+ def __call__(self):
+ self.request.response.setHeader('content-type', 'text/html')
+ return '''
+ <html>
+ <head>
+ </head>
+ <body>
+ <p>This is the index</p>
+ </body>
+ </html>'''
+
+
+class SillyMiddleWare(object):
+ def __init__(self, application):
+ self.application = application
+
+ def __call__(self, environ, start_response):
+ def drop_content_length_response(status, headers, exc_info=None):
+ for name, value in headers:
+ if name.lower() == 'content-length':
+ headers.remove((name, value))
+ return start_response(status, headers, exc_info=exc_info)
+
+ app_iter = self.application(environ, drop_content_length_response)
+
+ # Very silly indeed:
+ result = ''.join(app_iter)
+ return [result.replace(
+ '<body>', '<body><h1>Hello from the silly middleware</h1>')]
+
+
+class SillyMiddleWareBrowserLayer(BrowserLayer):
+
+ def setup_middleware(self, app):
+ return SillyMiddleWare(app)
Added: zope.app.wsgi/trunk/src/zope/app/wsgi/testlayer.txt
===================================================================
--- zope.app.wsgi/trunk/src/zope/app/wsgi/testlayer.txt (rev 0)
+++ zope.app.wsgi/trunk/src/zope/app/wsgi/testlayer.txt 2010-11-12 14:11:24 UTC (rev 118364)
@@ -0,0 +1,36 @@
+It is possible to inject a wsgi stack by subclassing from BrowserLayer::
+
+First, create and register a view to test:
+
+ >>> from zope import component, interface
+ >>> from zope.app.wsgi.testing import IndexView
+ >>> component.provideAdapter(IndexView, name='index.html')
+ >>> from zope.security import checker
+ >>> checker.defineChecker(
+ ... IndexView,
+ ... checker.NamesChecker(['browserDefault', '__call__']),
+ ... )
+
+ >>> from zope.app.wsgi.testlayer import Browser
+ >>> browser = Browser()
+ >>> browser.open('http://localhost/index.html')
+ >>> print browser.contents
+ <html>
+ <head>
+ </head>
+ <body><h1>Hello from the silly middleware</h1>
+ <p>This is the index</p>
+ </body>
+ </html>
+
+Clean up:
+
+ >>> import zope.publisher.interfaces.browser
+ >>> checker.undefineChecker(IndexView)
+ >>> component.provideAdapter(
+ ... None,
+ ... (interface.Interface,
+ ... zope.publisher.interfaces.browser.IBrowserRequest),
+ ... zope.publisher.interfaces.browser.IBrowserPublisher,
+ ... 'index.html',
+ ... )
Modified: zope.app.wsgi/trunk/src/zope/app/wsgi/tests.py
===================================================================
--- zope.app.wsgi/trunk/src/zope/app/wsgi/tests.py 2010-11-12 14:08:18 UTC (rev 118363)
+++ zope.app.wsgi/trunk/src/zope/app/wsgi/tests.py 2010-11-12 14:11:24 UTC (rev 118364)
@@ -15,116 +15,54 @@
$Id$
"""
-import tempfile
import unittest
import re
-import zope.component
-from zope import component, interface
from zope.component.testlayer import ZCMLFileLayer
from zope.testing import doctest
from zope.testing import renormalizing
import zope.event
-import zope.app.wsgi
import zope.publisher.interfaces.browser
-from zope.app.publication.requestpublicationregistry import factoryRegistry
-from zope.app.publication.requestpublicationfactories import BrowserFactory
-from zope.app.wsgi.testing import AppWSGILayer
-from zope.authentication.interfaces import IAuthentication
-from zope.securitypolicy.tests import principalRegistry
+import zope.app.wsgi
+from zope.app.wsgi.testlayer import BrowserLayer
+from zope.app.wsgi.testing import SillyMiddleWareBrowserLayer
+
def cleanEvents(s):
zope.event.subscribers.pop()
-class FileView:
-
- interface.implements(zope.publisher.interfaces.browser.IBrowserPublisher)
- component.adapts(interface.Interface,
- zope.publisher.interfaces.browser.IBrowserRequest)
-
- def __init__(self, _, request):
- self.request = request
-
- def browserDefault(self, *_):
- return self, ()
-
- def __call__(self):
- self.request.response.setHeader('content-type', 'text/plain')
- f = tempfile.TemporaryFile()
- f.write("Hello\nWorld!\n")
- return f
-
-
-def test_file_returns():
- """We want to make sure that file returns work
-
-Let's register a view that returns a temporary file and make sure that
-nothing bad happens. :)
-
- >>> component.provideAdapter(FileView, name='test-file-view.html')
- >>> from zope.security import checker
- >>> checker.defineChecker(
- ... FileView,
- ... checker.NamesChecker(['browserDefault', '__call__']),
- ... )
-
- >>> from zope.app.wsgi.testlayer import Browser
- >>> browser = Browser()
- >>> browser.handleErrors = False
- >>> browser.open('http://localhost/@@test-file-view.html')
- >>> browser.headers['content-type']
- 'text/plain'
-
- >>> browser.headers['content-length']
- '13'
-
- >>> print browser.contents
- Hello
- World!
- <BLANKLINE>
-
-Clean up:
-
- >>> checker.undefineChecker(FileView)
- >>> component.provideAdapter(
- ... None,
- ... (interface.Interface,
- ... zope.publisher.interfaces.browser.IBrowserRequest),
- ... zope.publisher.interfaces.browser.IBrowserPublisher,
- ... 'test-file-view.html',
- ... )
-
-
-"""
-
def test_suite():
checker = renormalizing.RENormalizing([
(re.compile(r"<class 'zope.component.interfaces.ComponentLookupError'>"),
r'ComponentLookupError'),
])
- functional_suite = doctest.DocTestSuite()
- functional_suite.layer = AppWSGILayer
+ filereturns_suite = doctest.DocFileSuite('filereturns.txt')
+ filereturns_suite.layer = BrowserLayer(zope.app.wsgi)
readme_test = doctest.DocFileSuite(
'README.txt',
checker=checker, tearDown=cleanEvents,
- optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+ optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS)
doctest_suite = doctest.DocFileSuite(
'fileresult.txt', 'paste.txt',
checker=checker,
- optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+ optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS)
readme_test.layer = ZCMLFileLayer(zope.app.wsgi)
doctest_suite.layer = ZCMLFileLayer(zope.app.wsgi)
+ testlayer_suite = doctest.DocFileSuite(
+ 'testlayer.txt',
+ optionflags=doctest.NORMALIZE_WHITESPACE)
+ testlayer_suite.layer = SillyMiddleWareBrowserLayer(zope.app.wsgi)
return unittest.TestSuite((
- functional_suite, readme_test, doctest_suite))
+ filereturns_suite, readme_test, doctest_suite, testlayer_suite))
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')
More information about the checkins
mailing list