[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"&lt;class 'zope.component.interfaces.ComponentLookupError'&gt;"),
                     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