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" _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins