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
[EMAIL PROTECTED]
http://mail.zope.org/mailman/listinfo/checkins

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


_______________________________________________
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )

Reply via email to