[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