[Zope-dev] Re: [Checkins] SVN: Zope/trunk/ Fixed collector 2057: Testing.makequest broke getPhysicalPath()

Stefan H. Holek stefan at epy.co.at
Thu Apr 6 05:17:20 EDT 2006


For the record: I am still opposed to this change. It basically  
endows the request (as in self.REQUEST) with a getPhysicalPath  
method, and I have no idea what kind of side-effects this may have.

AFAICS your test suite is the only suite around that wants to request- 
wrap non-root objects. There's nothing wrong with using your own  
makerequest for your own test suite, if this is what you want. But I  
don't think your use-case warrants changing Zope.

Stefan


On 5. Apr 2006, at 22:51, Paul Winkler wrote:

> Log message for revision 66581:
>   Fixed collector 2057: Testing.makequest broke getPhysicalPath()
>   when used on anything other than an app object.
>   Also added an 'environ' argument if you want to use something
>   other than os.environ, and added a couple trivial tweaks from
>   ZopeTestCase.makereqeust.
>   Added unit tests for this stuff.
>
>
>
> Changed:
>   U   Zope/trunk/doc/CHANGES.txt
>   U   Zope/trunk/lib/python/Testing/makerequest.py
>   A   Zope/trunk/lib/python/Testing/tests/
>   A   Zope/trunk/lib/python/Testing/tests/__init__.py
>   A   Zope/trunk/lib/python/Testing/tests/test_makerequest.py
>
> -=-
> Modified: Zope/trunk/doc/CHANGES.txt
> ===================================================================
> --- Zope/trunk/doc/CHANGES.txt	2006-04-05 20:04:59 UTC (rev 66580)
> +++ Zope/trunk/doc/CHANGES.txt	2006-04-05 20:51:21 UTC (rev 66581)
> @@ -46,6 +46,9 @@
>
>      Features added
>
> +      - Testing.makerequest: Added an 'environ' argument so
> +        clients can use mappings other than os.environ.
> +
>        - Updated to Docutils 0.4.0
>
>        - reStructuredText: The default value for the 'stylesheet'
> @@ -202,6 +205,10 @@
>
>      Bugs Fixed
>
> +      - Collector #2057: Allow Testing.makerequest to work with
> +	any acquisition-supporting root object, not just Zope2.app.
> +        Formerly, if you did that, getPhysicalPath() was broken.
> +
>        - Collector #2051: Applied patch by Yoshinori Okuji to fix some
>          XML export/import problems, including tests for that feature.
>
>
> Modified: Zope/trunk/lib/python/Testing/makerequest.py
> ===================================================================
> --- Zope/trunk/lib/python/Testing/makerequest.py	2006-04-05  
> 20:04:59 UTC (rev 66580)
> +++ Zope/trunk/lib/python/Testing/makerequest.py	2006-04-05  
> 20:51:21 UTC (rev 66581)
> @@ -19,27 +19,50 @@
>      import makerequest
>      app = makerequest.makerequest(Zope2.app())
>
> +You can optionally pass stdout to be used by the response,
> +and an environ mapping to be used in the request.
> +Defaults are sys.stdout and os.environ.
> +
> +If you don't want to start a zope app in your test, you can wrap  
> other
> +objects, but they must support acquisition and you should only wrap
> +your root object.
> +
> +
>  $Id$
>
>  """
>
>  import os
> -from os import environ
>  from sys import stdin, stdout
>  from ZPublisher.HTTPRequest import HTTPRequest
>  from ZPublisher.HTTPResponse import HTTPResponse
>  from ZPublisher.BaseRequest import RequestContainer
>
> -def makerequest(app, stdout=stdout):
> +def makerequest(app, stdout=stdout, environ=None):
>      resp = HTTPResponse(stdout=stdout)
> -    environ['SERVER_NAME']='foo'
> -    environ['SERVER_PORT']='80'
> -    environ['REQUEST_METHOD'] = 'GET'
> +    if environ is None:
> +        environ = os.environ
> +    environ.setdefault('SERVER_NAME', 'foo')
> +    environ.setdefault('SERVER_PORT', '80')
> +    environ.setdefault('REQUEST_METHOD',  'GET')
>      req = HTTPRequest(stdin, environ, resp)
> -
> +    req._steps = ['noobject']  # Fake a published object.
> +    req['ACTUAL_URL'] = req.get('URL') # Zope 2.7.4
> +
>      # set Zope3-style default skin so that the request is usable for
> -    # Zope3-style view look-ups
> +    # Zope3-style view look-ups.
>      from zope.app.publication.browser import setDefaultSkin
>      setDefaultSkin(req)
>
> -    return app.__of__(RequestContainer(REQUEST = req))
> +    requestcontainer = RequestContainer(REQUEST = req)
> +    # Workaround for collector 2057: ensure that we don't break
> +    # getPhysicalPath if app has that method.
> +    # We could instead fix Traversable.getPhysicalPath() to check for
> +    # existence of p.getPhysicalPath before calling it; but it's such
> +    # a commonly called method that I don't want to impact  
> performance
> +    # for something that AFAICT only affects makerequest() in
> +    # practice.
> +    if getattr(app, 'getPhysicalPath', None) is not None:
> +        requestcontainer.getPhysicalPath = lambda: ()
> +
> +    return app.__of__(requestcontainer)
>
> Added: Zope/trunk/lib/python/Testing/tests/__init__.py
> ===================================================================
> --- Zope/trunk/lib/python/Testing/tests/__init__.py	2006-04-05  
> 20:04:59 UTC (rev 66580)
> +++ Zope/trunk/lib/python/Testing/tests/__init__.py	2006-04-05  
> 20:51:21 UTC (rev 66581)
> @@ -0,0 +1 @@
> +#
>
>
> Property changes on: Zope/trunk/lib/python/Testing/tests/__init__.py
> ___________________________________________________________________
> Name: svn:keywords
>    + "Author Date Revision"
>
> Added: Zope/trunk/lib/python/Testing/tests/test_makerequest.py
> ===================================================================
> --- Zope/trunk/lib/python/Testing/tests/test_makerequest.py	 
> 2006-04-05 20:04:59 UTC (rev 66580)
> +++ Zope/trunk/lib/python/Testing/tests/test_makerequest.py	 
> 2006-04-05 20:51:21 UTC (rev 66581)
> @@ -0,0 +1,65 @@
> +##################################################################### 
> #########
> +#
> +# Copyright (c) 2006 Zope Corporation 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.
> +#
> +##################################################################### 
> #########
> +"""Unit tests of makequest.
> +
> +$Id$
> +"""
> +
> +import unittest
> +
> +from Acquisition import Implicit
> +from Testing.makerequest import makerequest
> +from OFS.SimpleItem import SimpleItem
> +
> +class MakerequestTests(unittest.TestCase):
> +
> +    def test_makerequest(self):
> +        # The argument must support acquisition.
> +        self.assertRaises(AttributeError, makerequest, object())
> +        # After the call, it will have a REQUEST attribute.
> +        item = Implicit()
> +        self.failIf(hasattr(item, 'REQUEST'))
> +        item = makerequest(item)
> +        self.failUnless(hasattr(item, 'REQUEST'))
> +
> +    def test_dont_break_getPhysicalPath(self):
> +        # see http://www.zope.org/Collectors/Zope/2057
> +        item = SimpleItem()
> +        self.assertEqual(item.getPhysicalPath(), ('',))
> +        self.assertEqual(item.getPhysicalPath(),
> +                         makerequest(item).getPhysicalPath())
> +
> +    def test_stdout(self):
> +        # You can pass a stdout arg and it's used by the response.
> +        import cStringIO
> +        out = cStringIO.StringIO()
> +        item = makerequest(SimpleItem(), stdout=out)
> +        item.REQUEST.RESPONSE.write('aaa')
> +        out.seek(0)
> +        written = out.read()
> +        self.failUnless(written.startswith('Status: 200 OK\n'))
> +        self.failUnless(written.endswith('\naaa'))
> +
> +    def test_environ(self):
> +        # You can pass an environ argument to use in the request.
> +        environ = {'foofoo': 'barbar'}
> +        item = makerequest(SimpleItem(), environ=environ)
> +        self.assertEqual(item.REQUEST.environ['foofoo'], 'barbar')
> +
> +def test_suite():
> +    suite = unittest.TestSuite()
> +    suite.addTest(unittest.makeSuite(MakerequestTests))
> +    return suite
> +
> +if __name__=='__main__':
> +    unittest.TextTestRunner().run(test_suite())
>
>
> Property changes on: Zope/trunk/lib/python/Testing/tests/ 
> test_makerequest.py
> ___________________________________________________________________
> Name: svn:keywords
>    + "Author Date Revision"
>
> _______________________________________________
> Checkins mailing list
> Checkins at zope.org
> http://mail.zope.org/mailman/listinfo/checkins

--
Anything that happens, happens.  --Douglas Adams




More information about the Zope-Dev mailing list