Log message for revision 67959: Merge from trunk and add CHANGES.txt message. ------------------------------------------------------------------------ r67957 | jinty | 2006-05-04 02:11:01 +0200 (Thu, 04 May 2006) | 1 line Five.testbrowser did not do the munging of the headers that the zope2 HTTP response did. It was also inconsistent with Zope3 testbrowser tests. Fix that. ------------------------------------------------------------------------ r67936 | jinty | 2006-05-03 21:49:06 +0200 (Wed, 03 May 2006) | 1 line Commit patch and test to make testbrowser not swallow cookies. Contributed by Daniel Nouri and modified by me
Changed: U Products.Five/branches/1.4/CHANGES.txt U Products.Five/branches/1.4/testbrowser.py A Products.Five/branches/1.4/tests/test_testbrowser.py -=- Modified: Products.Five/branches/1.4/CHANGES.txt =================================================================== --- Products.Five/branches/1.4/CHANGES.txt 2006-05-04 00:27:31 UTC (rev 67958) +++ Products.Five/branches/1.4/CHANGES.txt 2006-05-04 00:56:11 UTC (rev 67959) @@ -2,6 +2,19 @@ Five Changes ============ +Five 1.4 (Unreleased) +===================== + +Bugfixes +-------- + +* Five.testbrowser does not swallow cookies anymore, based on patch by + Daniel Nouri. + +* Five.testbrowser capitalizes headers in the same way as the Zope2 + HTTPResponse. i.e. content-length -> Content-Length. + + Five 1.4c (2006-05-04) ====================== Modified: Products.Five/branches/1.4/testbrowser.py =================================================================== --- Products.Five/branches/1.4/testbrowser.py 2006-05-04 00:27:31 UTC (rev 67958) +++ Products.Five/branches/1.4/testbrowser.py 2006-05-04 00:56:11 UTC (rev 67959) @@ -30,8 +30,23 @@ real_response = self.response._response status = real_response.getStatus() reason = zope.publisher.http.status_reasons[real_response.status] - - headers = real_response.headers.items() + headers = [] + # Convert header keys to camel case. This is basically a copy + # paste from ZPublisher.HTTPResponse + for key, val in real_response.headers.items(): + if key.lower() == key: + # only change non-literal header names + key = "%s%s" % (key[:1].upper(), key[1:]) + start = 0 + l = key.find('-',start) + while l >= start: + key = "%s-%s%s" % (key[:l],key[l+1:l+2].upper(),key[l+2:]) + start = l + 1 + l = key.find('-', start) + headers.append((key, val)) + # get the cookies, breaking them into tuples for sorting + cookies = [(c[:10], c[12:]) for c in real_response._cookie_list()] + headers.extend(cookies) headers.sort() headers.insert(0, ('Status', "%s %s" % (status, reason))) headers = '\r\n'.join('%s: %s' % h for h in headers) Copied: Products.Five/branches/1.4/tests/test_testbrowser.py (from rev 67936, Products.Five/trunk/tests/test_testbrowser.py) =================================================================== --- Products.Five/trunk/tests/test_testbrowser.py 2006-05-03 19:49:06 UTC (rev 67936) +++ Products.Five/branches/1.4/tests/test_testbrowser.py 2006-05-04 00:56:11 UTC (rev 67959) @@ -0,0 +1,83 @@ +############################################################################## +# +# Copyright (c) 2004, 2005 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 for the testbrowser module. + +$Id$ +""" + +import unittest +from Testing.ZopeTestCase import FunctionalDocTestSuite +from OFS.SimpleItem import Item + +class CookieStub(Item): + """This is a cookie stub.""" + + def __call__(self, REQUEST): + REQUEST.RESPONSE.setCookie('evil', 'cookie') + return 'Stub' + +def doctest_cookies(): + """ + We want to make sure that our testbrowser correctly understands + cookies. We'll add a stub to ``self.folder`` that sets a cookie. + + >>> from Products.Five.tests.test_testbrowser import CookieStub + >>> self.folder._setObject('stub', CookieStub()) + 'stub' + + This response looks alright: + + >>> response = self.publish('/test_folder_1_/stub') + >>> print str(response) #doctest: +ELLIPSIS + Status: 200 OK + ... + Set-Cookie: evil="cookie" + ... + + Let's try to look at the same folder with testbrowser: + + >>> from Products.Five.testbrowser import Browser + >>> browser = Browser() + >>> browser.open('http://localhost/test_folder_1_/stub') + >>> 'Set-Cookie: evil="cookie"' in str(browser.headers) + True + """ + +def doctest_camel_case_headers(): + """Make sure that the headers come out in camel case. + + Some setup: + + >>> from Products.Five.tests.test_testbrowser import CookieStub + >>> self.folder._setObject('stub', CookieStub()) + 'stub' + + The Zope2 response mungs headers so they come out in camel case we should + do the same. This is also more consistent with the Zope3 testbrowser tests. + We will test a few: + + >>> from Products.Five.testbrowser import Browser + >>> browser = Browser() + >>> browser.open('http://localhost/test_folder_1_/stub') + >>> 'Content-Length: ' in str(browser.headers) + True + >>> 'Content-Type: ' in str(browser.headers) + True + """ + + +def test_suite(): + return unittest.TestSuite(( + FunctionalDocTestSuite(), + )) _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins