[Checkins] SVN: Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py Normalize test case class(es) for HTTPRequest; cut boilerplate.

Tres Seaver tseaver at palladion.com
Sun Apr 19 15:23:40 EDT 2009


Log message for revision 99296:
  Normalize test case class(es) for HTTPRequest;  cut boilerplate.

Changed:
  U   Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py

-=-
Modified: Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py
===================================================================
--- Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py	2009-04-19 19:07:10 UTC (rev 99295)
+++ Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py	2009-04-19 19:23:39 UTC (rev 99296)
@@ -1,16 +1,18 @@
 import unittest
 
-TEST_LARGEFILE_DATA = '''
---12345
-Content-Disposition: form-data; name="file"; filename="file"
-Content-Type: application/octet-stream
+class RecordTests(unittest.TestCase):
 
-test %s
+    def test_repr(self):
+        from ZPublisher.HTTPRequest import record
+        rec = record()
+        rec.a = 1
+        rec.b = 'foo'
+        r = repr(rec)
+        d = eval(r)
+        self.assertEqual(d, rec.__dict__)
 
-''' % ('test' * 1000)
+class HTTPRequestTests(unittest.TestCase):
 
-class AuthCredentialsTests( unittest.TestCase ):
-
     def _getTargetClass(self):
         from ZPublisher.HTTPRequest import HTTPRequest
         return HTTPRequest
@@ -23,6 +25,9 @@
         if environ is None:
             environ = {}
 
+        if 'REQUEST_METHOD' not in environ:
+            environ['REQUEST_METHOD'] = 'GET'
+
         if 'SERVER_NAME' not in environ:
             environ['SERVER_NAME'] = 'http://localhost'
 
@@ -37,59 +42,6 @@
 
         return self._getTargetClass()(stdin, environ, response, clean)
 
-    def test__authUserPW_simple( self ):
-        import base64
-        user_id = 'user'
-        password = 'password'
-        encoded = base64.encodestring( '%s:%s' % ( user_id, password ) )
-        auth_header = 'basic %s' % encoded
-
-        environ = { 'HTTP_AUTHORIZATION': auth_header }
-        request = self._makeOne( environ=environ )
-
-        user_id_x, password_x = request._authUserPW()
-
-        self.assertEqual( user_id_x, user_id )
-        self.assertEqual( password_x, password )
-
-    def test__authUserPW_with_embedded_colon( self ):
-        # http://www.zope.org/Collectors/Zope/2039
-        import base64
-        user_id = 'user'
-        password = 'embedded:colon'
-        encoded = base64.encodestring( '%s:%s' % ( user_id, password ) )
-        auth_header = 'basic %s' % encoded
-
-        environ = { 'HTTP_AUTHORIZATION': auth_header }
-        request = self._makeOne( environ=environ )
-
-        user_id_x, password_x = request._authUserPW()
-
-        self.assertEqual( user_id_x, user_id )
-        self.assertEqual( password_x, password )
-
-
-class RecordTests(unittest.TestCase):
-
-    def test_repr(self):
-        from ZPublisher.HTTPRequest import record
-        rec = record()
-        rec.a = 1
-        rec.b = 'foo'
-        r = repr(rec)
-        d = eval(r)
-        self.assertEqual(d, rec.__dict__)
-
-
-class ProcessInputsTests(unittest.TestCase):
-
-    def _getTargetClass(self):
-        from ZPublisher.HTTPRequest import HTTPRequest
-        return HTTPRequest
-
-    def _makeOne(self, environ):
-        return self._getTargetClass()(None, environ, None)
-
     def _processInputs(self, inputs):
         from urllib import quote_plus
         # Have the inputs processed, and return a HTTPRequest object holding the
@@ -105,7 +57,7 @@
 
         env = {'SERVER_NAME': 'testingharnas', 'SERVER_PORT': '80'}
         env['QUERY_STRING'] = query_string
-        req = self._makeOne(env)
+        req = self._makeOne(environ=env)
         req.processInputs()
         self._noFormValuesInOther(req)
         return req
@@ -176,7 +128,7 @@
                 "Key %s not correctly reproduced in tainted; expected %r, "
                 "got %r" % (key, req.form[key], req.taintedform[key]))
 
-    def testNoMarshalling(self):
+    def test_processInputs_wo_marshalling(self):
         inputs = (
             ('foo', 'bar'), ('spam', 'eggs'),
             ('number', '1'),
@@ -196,7 +148,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testSimpleMarshalling(self):
+    def test_processInputs_w_simple_marshalling(self):
         from DateTime.DateTime import DateTime
         inputs = (
             ('num:int', '42'), ('fract:float', '4.2'), ('bign:long', '45'),
@@ -225,7 +177,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testUnicodeConversions(self):
+    def test_processInputs_w_unicode_conversions(self):
         inputs = (('ustring:ustring:utf8', 'test\xc2\xae'),
                   ('utext:utext:utf8', 'test\xc2\xae\ntest\xc2\xae\n'),
                   ('utokens:utokens:utf8', 'test\xc2\xae test\xc2\xae'),
@@ -250,7 +202,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testSimpleContainers(self):
+    def test_processInputs_w_simple_containers(self):
         inputs = (
             ('oneitem:list', 'one'),
             ('alist:list', 'one'), ('alist:list', 'two'),
@@ -281,7 +233,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testMarshallIntoSequences(self):
+    def test_processInputs_w_marshalling_into_sequences(self):
         inputs = (
             ('ilist:int:list', '1'), ('ilist:int:list', '2'),
             ('ilist:list:int', '3'),
@@ -301,7 +253,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testRecordsWithSequences(self):
+    def test_processInputs_w_records_w_sequences(self):
         inputs = (
             ('onerec.name:record', 'foo'),
             ('onerec.tokens:tokens:record', 'one two'),
@@ -340,7 +292,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testDefaults(self):
+    def test_processInputs_w_defaults(self):
         inputs = (
             ('foo:default:int', '5'),
 
@@ -388,7 +340,7 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testNoMarshallingWithTaints(self):
+    def test_processInputs_wo_marshalling_w_Taints(self):
         inputs = (
             ('foo', 'bar'), ('spam', 'eggs'),
             ('number', '1'),
@@ -408,7 +360,7 @@
         self._taintedKeysAlsoInForm(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testSimpleMarshallingWithTaints(self):
+    def test_processInputs_w_simple_marshalling_w_taints(self):
         inputs = (
             ('<tnum>:int', '42'), ('<tfract>:float', '4.2'),
             ('<tbign>:long', '45'),
@@ -428,7 +380,7 @@
         self._taintedKeysAlsoInForm(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testUnicodeWithTaints(self):
+    def test_processInputs_w_unicode_w_taints(self):
         inputs = (('tustring:ustring:utf8', '<test\xc2\xae>'),
                   ('tutext:utext:utf8', '<test\xc2\xae>\n<test\xc2\xae\n>'),
 
@@ -450,7 +402,7 @@
         self._taintedKeysAlsoInForm(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testSimpleContainersWithTaints(self):
+    def test_processInputs_w_simple_containers_w_taints(self):
         inputs = (
             ('toneitem:list', '<one>'),
             ('<tkeyoneitem>:list', 'one'),
@@ -497,7 +449,7 @@
         self._taintedKeysAlsoInForm(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testRecordsWithSequencesAndTainted(self):
+    def test_processInputs_w_records_w_sequences_tainted(self):
         inputs = (
             ('tinitonerec.tokens:tokens:record', '<one> two'),
             ('tdeferonerec.tokens:tokens:record', 'one <two>'),
@@ -545,7 +497,7 @@
         self._taintedKeysAlsoInForm(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testDefaultsWithTaints(self):
+    def test_processInputs_w_defaults_w_taints(self):
         inputs = (
             ('tfoo:default', '<5>'),
 
@@ -597,12 +549,12 @@
         self._taintedKeysAlsoInForm(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testTaintedAttributeRaises(self):
+    def test_processInputs_w_tainted_attribute_raises(self):
         input = ('taintedattr.here<be<taint:record', 'value',)
 
         self.assertRaises(ValueError, self._processInputs, input)
 
-    def testNoTaintedExceptions(self):
+    def test_processInputs_w_tainted_values_cleans_exceptions(self):
         # Feed tainted garbage to the conversion methods, and any exception
         # returned should be HTML safe
         from DateTime.DateTime import DateTime
@@ -617,7 +569,7 @@
                 self.failIf('<' in e,
                     '%s converter does not quote unsafe value!' % type)
 
-    def testNameWithDotAsTuple(self):
+    def test_processInputs_w_dotted_name_as_tuple(self):
         # Collector #500
         inputs = (
             ('name.:tuple', 'name with dot as tuple'),)
@@ -632,101 +584,73 @@
         self._noTaintedValues(req)
         self._onlyTaintedformHoldsTaintedStrings(req)
 
-    def testCookieParsing(self):
+    def test_processInputs_w_cookie_parsing(self):
         env = {'SERVER_NAME': 'testingharnas', 'SERVER_PORT': '80'}
 
         env['HTTP_COOKIE'] = 'foo=bar; baz=gee'
-        req = self._makeOne(env)
+        req = self._makeOne(environ=env)
         self.assertEquals(req.cookies['foo'], 'bar')
         self.assertEquals(req.cookies['baz'], 'gee')
 
         env['HTTP_COOKIE'] = 'foo=bar; baz="gee, like, e=mc^2"'
-        req = self._makeOne(env)
+        req = self._makeOne(environ=env)
         self.assertEquals(req.cookies['foo'], 'bar')
         self.assertEquals(req.cookies['baz'], 'gee, like, e=mc^2')
 
         # Collector #1498: empty cookies
         env['HTTP_COOKIE'] = 'foo=bar; hmm; baz=gee'
-        req = self._makeOne(env)
+        req = self._makeOne(environ=env)
         self.assertEquals(req.cookies['foo'], 'bar')
         self.assertEquals(req.cookies['hmm'], '')
         self.assertEquals(req.cookies['baz'], 'gee')
 
-	# Unquoted multi-space cookies
+	    # Unquoted multi-space cookies
         env['HTTP_COOKIE'] = 'single=cookie data; ' \
 	                     'quoted="cookie data with unquoted spaces"; ' \
 			     'multi=cookie data with unquoted spaces; ' \
 			     'multi2=cookie data with unquoted spaces'
-        req = self._makeOne(env)
+        req = self._makeOne(environ=env)
         self.assertEquals(req.cookies['single'], 'cookie data')
-        self.assertEquals(req.cookies['quoted'], 
+        self.assertEquals(req.cookies['quoted'],
 	                              'cookie data with unquoted spaces')
-        self.assertEquals(req.cookies['multi'], 
+        self.assertEquals(req.cookies['multi'],
 	                              'cookie data with unquoted spaces')
-        self.assertEquals(req.cookies['multi2'], 
+        self.assertEquals(req.cookies['multi2'],
 	                              'cookie data with unquoted spaces')
 
-TEST_ENVIRON = {
-    'CONTENT_TYPE': 'multipart/form-data; boundary=12345',
-    'REQUEST_METHOD': 'POST',
-    'SERVER_NAME': 'localhost',
-    'SERVER_PORT': '80',
-    }
 
-TEST_FILE_DATA = '''
---12345
-Content-Disposition: form-data; name="file"; filename="file"
-Content-Type: application/octet-stream
 
-test
-
---12345--
-'''
-
-
-class RequestTests( unittest.TestCase ):
-
-    def _getTargetClass(self):
-        from ZPublisher.HTTPRequest import HTTPRequest
-        return HTTPRequest
-
-    def _makeOne(self, stdin, environ, response, clean=0):
-        return self._getTargetClass()(stdin, environ, response, clean)
-
-    def testRemoveStdinReferences(self):
+    def test_close_removes_stdin_references(self):
         # Verifies that all references to the input stream go away on
         # request.close().  Otherwise a tempfile may stick around.
         import sys
         from StringIO import StringIO
         s = StringIO(TEST_FILE_DATA)
-        env = TEST_ENVIRON.copy()
         start_count = sys.getrefcount(s)
 
-        req = self._makeOne(s, env, None)
+        req = self._makeOne(stdin=s, environ=TEST_ENVIRON.copy())
         req.processInputs()
         self.assertNotEqual(start_count, sys.getrefcount(s))  # Precondition
         req.close()
         self.assertEqual(start_count, sys.getrefcount(s))  # The test
 
-    def testFileName(self):
+    def test_processInputs_w_large_input_gets_tempfile(self):
         # checks fileupload object supports the filename
         from StringIO import StringIO
         s = StringIO(TEST_LARGEFILE_DATA)
-        env = TEST_ENVIRON.copy()
 
-        req = self._makeOne(s, env, None)
+        req = self._makeOne(stdin=s, environ=TEST_ENVIRON.copy())
         req.processInputs()
         f = req.form.get('file')
         self.assert_(f.name)
 
-    def testFileIterator(self):
+    def test_processInputs_with_file_upload_gets_iterator(self):
         # checks fileupload object supports the iterator protocol
         # collector entry 1837
         from StringIO import StringIO
         s = StringIO(TEST_FILE_DATA)
-        env = TEST_ENVIRON.copy()
 
-        req = self._makeOne(s, env, None)
+        req = self._makeOne(stdin=s, environ=TEST_ENVIRON.copy())
         req.processInputs()
         f=req.form.get('file')
         self.assertEqual(list(f),['test\n'])
@@ -735,100 +659,152 @@
         f.seek(0)
         self.assertEqual(f.xreadlines(),f)
 
-    def testDebug(self):
+    def test__authUserPW_simple( self ):
+        import base64
+        user_id = 'user'
+        password = 'password'
+        encoded = base64.encodestring( '%s:%s' % ( user_id, password ) )
+        auth_header = 'basic %s' % encoded
+
+        environ = { 'HTTP_AUTHORIZATION': auth_header }
+        request = self._makeOne( environ=environ )
+
+        user_id_x, password_x = request._authUserPW()
+
+        self.assertEqual( user_id_x, user_id )
+        self.assertEqual( password_x, password )
+
+    def test__authUserPW_with_embedded_colon( self ):
+        # http://www.zope.org/Collectors/Zope/2039
+        import base64
+        user_id = 'user'
+        password = 'embedded:colon'
+        encoded = base64.encodestring( '%s:%s' % ( user_id, password ) )
+        auth_header = 'basic %s' % encoded
+
+        environ = { 'HTTP_AUTHORIZATION': auth_header }
+        request = self._makeOne( environ=environ )
+
+        user_id_x, password_x = request._authUserPW()
+
+        self.assertEqual( user_id_x, user_id )
+        self.assertEqual( password_x, password )
+
+    def test_debug_not_in_qs_still_gets_attr(self):
         from zope.publisher.base import DebugFlags
-        from StringIO import StringIO
-        TEST_ENVIRON = {
-            'REQUEST_METHOD': 'GET',
-            'SERVER_NAME': 'localhost',
-            'SERVER_PORT': '80',
-            }
-        s = StringIO('')
-
         # when accessing request.debug we will see the DebugFlags instance
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
+        request = self._makeOne()
         self.assert_(isinstance(request.debug, DebugFlags))
         # It won't be available through dictonary lookup, though
         self.assert_(request.get('debug') is None)
 
+    def test_debug_in_qs_gets_form_var(self):
+        env = {'QUERY_STRING': 'debug=1'}
+
         # request.debug will actually yield a 'debug' form variable
         # if it exists
-        env = TEST_ENVIRON.copy()
-        env['QUERY_STRING'] = 'debug=1'
-        request = self._makeOne(s, env, None)
+        request = self._makeOne(environ=env)
         request.processInputs()
         self.assertEqual(request.debug, '1')
         self.assertEqual(request.get('debug'), '1')
         self.assertEqual(request['debug'], '1')
 
         # we can still override request.debug with a form variable or directly
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
+
+    def test_debug_override_via_form_other(self):
+        request = self._makeOne()
         request.processInputs()
-        self.assert_(isinstance(request.debug, DebugFlags))
         request.form['debug'] = '1'
         self.assertEqual(request.debug, '1')
         request['debug'] = '2'
         self.assertEqual(request.debug, '2')
 
-    def testLocale(self):
-        TEST_ENVIRON = {
-            'HTTP_ACCEPT_LANGUAGE': 'en',
-            'REQUEST_METHOD': 'GET',
-            'SERVER_NAME': 'localhost',
-            'SERVER_PORT': '80',
-            }
-        from StringIO import StringIO
-        from ZPublisher.HTTPRequest import HTTPRequest
+    def test_locale_property_accessor(self):
         from zope.component import provideAdapter
         from zope.publisher.browser import BrowserLanguages
         from zope.publisher.interfaces.http import IHTTPRequest
         from zope.i18n.interfaces import IUserPreferredLanguages
         from zope.i18n.interfaces.locales import ILocale
+        from ZPublisher.HTTPRequest import _marker
 
         provideAdapter(BrowserLanguages, [IHTTPRequest],
                        IUserPreferredLanguages)
-        s = StringIO('')
 
+        env = {'HTTP_ACCEPT_LANGUAGE': 'en'}
+        request = self._makeOne(environ=env)
+
         # before accessing request.locale for the first time, request._locale
         # is still a marker
-        from ZPublisher.HTTPRequest import _marker
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
         self.assert_(request._locale is _marker)
+
         # when accessing request.locale we will see an ILocale
         self.assert_(ILocale.providedBy(request.locale))
+
         # and request._locale has been set
         self.assert_(request._locale is request.locale)
+
         # It won't be available through dictonary lookup, though
         self.assert_(request.get('locale') is None)
 
+    def test_locale_in_qs(self):
+        from zope.component import provideAdapter
+        from zope.publisher.browser import BrowserLanguages
+        from zope.publisher.interfaces.http import IHTTPRequest
+        from zope.i18n.interfaces import IUserPreferredLanguages
+        from zope.i18n.interfaces.locales import ILocale
+
+        provideAdapter(BrowserLanguages, [IHTTPRequest],
+                       IUserPreferredLanguages)
+
         # request.locale will actually yield a 'locale' form variable
         # if it exists
-        env = TEST_ENVIRON.copy()
-        env['QUERY_STRING'] = 'locale=1'
-        request = self._makeOne(s, env, None)
+        env = {'HTTP_ACCEPT_LANGUAGE': 'en', 'QUERY_STRING': 'locale=1'}
+        request = self._makeOne(environ=env)
         request.processInputs()
+
         self.assertEqual(request.locale, '1')
         self.assertEqual(request.get('locale'), '1')
         self.assertEqual(request['locale'], '1')
 
+    def test_locale_property_override_via_form_other(self):
+        from zope.component import provideAdapter
+        from zope.publisher.browser import BrowserLanguages
+        from zope.publisher.interfaces.http import IHTTPRequest
+        from zope.i18n.interfaces import IUserPreferredLanguages
+        from zope.i18n.interfaces.locales import ILocale
+
+        provideAdapter(BrowserLanguages, [IHTTPRequest],
+                       IUserPreferredLanguages)
+        env = {'HTTP_ACCEPT_LANGUAGE': 'en'}
+
         # we can still override request.locale with a form variable
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
+        request = self._makeOne(environ=env)
         request.processInputs()
+
         self.assert_(ILocale.providedBy(request.locale))
+
         request.form['locale'] = '1'
         self.assertEqual(request.locale, '1')
+
         request['locale'] = '2'
         self.assertEqual(request.locale, '2')
 
+    def test_locale_semantics(self):
+        from zope.component import provideAdapter
+        from zope.publisher.browser import BrowserLanguages
+        from zope.publisher.interfaces.http import IHTTPRequest
+        from zope.i18n.interfaces import IUserPreferredLanguages
+        from zope.i18n.interfaces.locales import ILocale
+
+        provideAdapter(BrowserLanguages, [IHTTPRequest],
+                       IUserPreferredLanguages)
+        env_ = {'HTTP_ACCEPT_LANGUAGE': 'en'}
+
         # we should also test the correct semantics of the locale
         for httplang in ('it', 'it-ch', 'it-CH', 'IT', 'IT-CH', 'IT-ch'):
-            env = TEST_ENVIRON.copy()
+            env = env_.copy()
             env['HTTP_ACCEPT_LANGUAGE'] = httplang
-            request = self._makeOne(s, env, None)
+            request = self._makeOne(environ=env)
             locale = request.locale
             self.assert_(ILocale.providedBy(locale))
             parts = httplang.split('-')
@@ -842,97 +818,137 @@
             self.assertEqual(locale.id.territory, territory)
             self.assertEqual(locale.id.variant, variant)
 
+    def test_locale_fallback(self):
+        from zope.component import provideAdapter
+        from zope.publisher.browser import BrowserLanguages
+        from zope.publisher.interfaces.http import IHTTPRequest
+        from zope.i18n.interfaces import IUserPreferredLanguages
+        from zope.i18n.interfaces.locales import ILocale
+
+        provideAdapter(BrowserLanguages, [IHTTPRequest],
+                       IUserPreferredLanguages)
+
+        env = {'HTTP_ACCEPT_LANGUAGE': 'en', 'HTTP_ACCEPT_LANGUAGE': 'xx'}
+
         # Now test for non-existant locale fallback
-        env = TEST_ENVIRON.copy()
-        env['HTTP_ACCEPT_LANGUAGE'] = 'xx'
-        request = self._makeOne(s, env, None)
+        request = self._makeOne(environ=env)
         locale = request.locale
+
         self.assert_(ILocale.providedBy(locale))
         self.assert_(locale.id.language is None)
         self.assert_(locale.id.territory is None)
         self.assert_(locale.id.variant is None)
 
-    def testMethod(self):
-        from StringIO import StringIO
-        TEST_ENVIRON = {
-            'REQUEST_METHOD': 'GET',
-            'SERVER_NAME': 'localhost',
-            'SERVER_PORT': '80',
-            }
-        s = StringIO('')
+    def test_method_GET(self):
+        env = {'REQUEST_METHOD': 'GET'}
+        request = self._makeOne(environ=env)
+        self.assertEqual(request.method, 'GET')
 
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
-        self.assertEqual(request.method, 'GET')
-        
-        env = TEST_ENVIRON.copy()
-        env['REQUEST_METHOD'] = 'post'
-        request = self._makeOne(s, env, None)
+    def test_method_GET(self):
+        env = {'REQUEST_METHOD': 'POST'}
+        request = self._makeOne(environ=env)
         self.assertEqual(request.method, 'POST')
 
-    def testTrustedProxies(self):
-        from StringIO import StringIO
+    def test_getClientAddr_wo_trusted_proxy(self):
+        env = {'REMOTE_ADDR': '127.0.0.1',
+               'HTTP_X_FORWARDED_FOR': '10.1.20.30, 192.168.1.100'}
+        request = self._makeOne(environ=env)
+        self.assertEqual(request.getClientAddr(), '127.0.0.1')
+
+    def test_getClientAddr_one_trusted_proxy(self):
         from ZPublisher.HTTPRequest import trusted_proxies
-        TEST_ENVIRON = {
-            'REQUEST_METHOD': 'GET',
-            'SERVER_NAME': 'localhost',
-            'SERVER_PORT': '80',
-            'REMOTE_ADDR': '127.0.0.1',
-            'HTTP_X_FORWARDED_FOR': '10.1.20.30, 192.168.1.100',
-            }
-        s = StringIO('')
+        env = {'REMOTE_ADDR': '127.0.0.1',
+               'HTTP_X_FORWARDED_FOR': '10.1.20.30, 192.168.1.100' }
 
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
-        self.assertEqual(request.getClientAddr(), '127.0.0.1')
+        orig = trusted_proxies[:]
+        try:
+            trusted_proxies.append('127.0.0.1')
+            request = self._makeOne(environ=env)
+            self.assertEqual(request.getClientAddr(), '192.168.1.100')
+        finally:
+            trusted_proxies[:] = orig
 
-        trusted_proxies.append('127.0.0.1')
-        request = self._makeOne(s, env, None)
-        self.assertEqual(request.getClientAddr(), '192.168.1.100')
+    def test_getClientAddr_trusted_proxy_last(self):
+        from ZPublisher.HTTPRequest import trusted_proxies
+        env = {'REMOTE_ADDR': '192.168.1.100',
+               'HTTP_X_FORWARDED_FOR': '10.1.20.30, 192.168.1.100'}
 
-        trusted_proxies[0] = '192.168.1.100' 
-        env = TEST_ENVIRON.copy()
-        env['REMOTE_ADDR'] = '192.168.1.100'
-        request = self._makeOne(s, env, None)
-        self.assertEqual(request.getClientAddr(), '10.1.20.30')
+        orig = trusted_proxies[:]
+        try:
+            trusted_proxies.append('192.168.1.100')
+            request = self._makeOne(environ=env)
+            self.assertEqual(request.getClientAddr(), '10.1.20.30')
+        finally:
+            trusted_proxies[:] = orig
 
-        env = TEST_ENVIRON.copy()
-        del env['REMOTE_ADDR']
-        request = self._makeOne(s, env, None)
-        self.assertEqual(request.getClientAddr(), '')
+    def test_getClientAddr_trusted_proxy_no_REMOTE_ADDR(self):
+        from ZPublisher.HTTPRequest import trusted_proxies
+        env = {'HTTP_X_FORWARDED_FOR': '10.1.20.30, 192.168.1.100'}
 
-    def testGetHeader(self):
-        from StringIO import StringIO
-        s = StringIO('')
-        env = TEST_ENVIRON.copy()
-        request = self._makeOne(s, env, None)
+        orig = trusted_proxies[:]
+        try:
+            trusted_proxies.append('192.168.1.100')
+            request = self._makeOne(environ=env)
+            self.assertEqual(request.getClientAddr(), '')
+        finally:
+            trusted_proxies[:] = orig
 
-        self.assertEqual(request.getHeader('Content-Type'),
+    def test_getHeader_exact(self):
+        request = self._makeOne(environ=TEST_ENVIRON.copy())
+        self.assertEqual(request.getHeader('content-type'),
                          'multipart/form-data; boundary=12345')
 
-        # getHeader is agnostic of case
-        self.assertEqual(request.getHeader('content-type'),
+    def test_getHeader_case_insensitive(self):
+        request = self._makeOne(environ=TEST_ENVIRON.copy())
+        self.assertEqual(request.getHeader('Content-Type'),
                          'multipart/form-data; boundary=12345')
 
-        # and of dashes vs. underscores
+    def test_getHeader_underscore_is_dash(self):
+        request = self._makeOne(environ=TEST_ENVIRON.copy())
         self.assertEqual(request.getHeader('content_type'),
                          'multipart/form-data; boundary=12345')
 
-        # the 'literal' argument can turn this normalization off:
+    def test_getHeader_literal_turns_off_case_normalization(self):
+        request = self._makeOne(environ=TEST_ENVIRON.copy())
         self.assertEqual(request.getHeader('Content-Type', literal=True), None)
 
-        # the 'default' argument can be used to get something other than
-        # None when the lookup fails:
+    def test_getHeader_nonesuch(self):
+        request = self._makeOne(environ=TEST_ENVIRON.copy())
+        self.assertEqual(request.getHeader('none-such'), None)
+
+    def test_getHeader_nonesuch_with_default(self):
+        request = self._makeOne(environ=TEST_ENVIRON.copy())
         self.assertEqual(request.getHeader('Not-existant', default='Whatever'),
                          'Whatever')
 
+TEST_ENVIRON = {
+    'CONTENT_TYPE': 'multipart/form-data; boundary=12345',
+    'REQUEST_METHOD': 'POST',
+    'SERVER_NAME': 'localhost',
+    'SERVER_PORT': '80',
+    }
+
+TEST_FILE_DATA = '''
+--12345
+Content-Disposition: form-data; name="file"; filename="file"
+Content-Type: application/octet-stream
+
+test
+
+--12345--
+'''
+
+TEST_LARGEFILE_DATA = '''
+--12345
+Content-Disposition: form-data; name="file"; filename="file"
+Content-Type: application/octet-stream
+
+test %s
+
+''' % ('test' * 1000)
+
 def test_suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(AuthCredentialsTests, 'test'))
     suite.addTest(unittest.makeSuite(RecordTests, 'test'))
-    suite.addTest(unittest.makeSuite(ProcessInputsTests, 'test'))
-    suite.addTest(unittest.makeSuite(RequestTests, 'test'))
+    suite.addTest(unittest.makeSuite(HTTPRequestTests, 'test'))
     return suite
-
-if __name__ == '__main__':
-    unittest.main(defaultTest='test_suite')



More information about the Checkins mailing list