[Zope-Checkins] CVS: Zope/lib/python/ZPublisher/tests - testBaseRequest.py:1.2

Yvo Schubbe schubbe at web.de
Tue Oct 14 05:08:45 EDT 2003


Update of /cvs-repository/Zope/lib/python/ZPublisher/tests
In directory cvs.zope.org:/tmp/cvs-serv2882/lib/python/ZPublisher/tests

Added Files:
	testBaseRequest.py 
Log Message:
Merged yuppie-collector1079-branch:
- Fixed BaseRequest's traversal loop. (Collector #1079)

=== Zope/lib/python/ZPublisher/tests/testBaseRequest.py 1.1 => 1.2 ===
--- /dev/null	Tue Oct 14 05:08:45 2003
+++ Zope/lib/python/ZPublisher/tests/testBaseRequest.py	Tue Oct 14 05:08:44 2003
@@ -0,0 +1,155 @@
+from unittest import TestCase, TestSuite, makeSuite, main
+
+import Zope
+Zope.startup()
+
+from Acquisition import Implicit
+from ZPublisher.BaseRequest import BaseRequest
+from ZPublisher.HTTPResponse import HTTPResponse
+
+
+class DummyObjectBasic(Implicit):
+    """ Dummy class with docstring.
+    """
+
+    def _setObject(self, id, object):
+        setattr(self, id, object)
+        return getattr(self, id)
+
+    def view(self):
+        """ Atrribute with docstring.
+        """
+        return 'view content'
+
+
+class DummyObjectWithDefault(DummyObjectBasic):
+    """ Dummy class with docstring.
+    """
+
+    def index_html(self):
+        """ Atrribute with docstring.
+        """
+        return 'index_html content'
+
+
+class DummyObjectWithDefaultNone(DummyObjectWithDefault):
+    """ Dummy class with docstring.
+    """
+
+    index_html = None
+
+
+class DummyObjectWithBPTH(DummyObjectBasic):
+    """ Dummy class with docstring.
+    """
+
+    def __before_publishing_traverse__(self, object, REQUEST):
+        if REQUEST['_test_counter'] < 100:
+            REQUEST['_test_counter'] += 1
+        else:
+            raise RuntimeError('Infinite loop detected.')
+        REQUEST['TraversalRequestNameStack'] += self._path
+        REQUEST._hacked_path=1
+
+
+class DummyObjectWithBD(DummyObjectBasic):
+    """ Dummy class with docstring.
+    """
+
+    def __browser_default__(self, REQUEST):
+        if REQUEST['_test_counter'] < 100:
+            REQUEST['_test_counter'] += 1
+        else:
+            raise RuntimeError('Infinite loop detected.')
+        return self, self._default_path
+
+
+class TestBaseRequest(TestCase):
+
+    def setUp(self):
+        self.root = DummyObjectBasic()
+        self.f1 = self.root._setObject('folder', DummyObjectBasic() )
+        self.f1._setObject('objBasic', DummyObjectBasic() )
+        self.f1._setObject('objWithDefault', DummyObjectWithDefault() )
+        self.f1._setObject('objWithDefaultNone', DummyObjectWithDefaultNone() )
+        self.f1._setObject('objWithBPTH', DummyObjectWithBPTH() )
+        self.f1._setObject('objWithBD', DummyObjectWithBD() )
+
+    def makeBaseRequest(self):
+        response = HTTPResponse()
+        environment = { 'URL': '',
+                        'PARENTS': [self.root],
+                        'steps': [],
+                        '_hacked_path': 0,
+                        '_test_counter': 0,
+                        'response': response }
+        return BaseRequest(environment)
+
+    def test_traverse_basic(self):
+        r = self.makeBaseRequest()
+        r.traverse('folder/objBasic')
+        self.assertEqual(r.URL, '/folder/objBasic')
+        self.assertEqual(r.response.base, '')
+
+    def test_traverse_withDefault(self):
+        r = self.makeBaseRequest()
+        r.traverse('folder/objWithDefault')
+        self.assertEqual(r.URL, '/folder/objWithDefault/index_html')
+        self.assertEqual(r.response.base, '/folder/objWithDefault/')
+
+    def test_traverse_withDefaultNone(self):
+        r = self.makeBaseRequest()
+        r.traverse('folder/objWithDefaultNone')
+        self.assertEqual(r.URL, '/folder/objWithDefaultNone')
+        self.assertEqual(r.response.base, '')
+
+    def test_traverse_withBPTH(self):
+        r = self.makeBaseRequest()
+        self.f1.objWithBPTH._path = ['view']
+        r.traverse('folder/objWithBPTH')
+        self.assertEqual(r.URL, '/folder/objWithBPTH/view')
+        self.assertEqual(r.response.base, '/folder/objWithBPTH/')
+
+    def test_traverse_withBDView(self):
+        r = self.makeBaseRequest()
+        self.f1.objWithBD._default_path = ['view']
+        r.traverse('folder/objWithBD')
+        self.assertEqual(r.URL, '/folder/objWithBD/view')
+        self.assertEqual(r.response.base, '/folder/objWithBD/')
+
+    def test_traverse_withAcquisition(self):
+        r = self.makeBaseRequest()
+        self.f1.objWithBPTH._path = ['view']
+        self.f1.objWithBD._default_path = ['view']
+        r.traverse('folder/objWithBD/objWithBPTH')
+        self.assertEqual(r.URL, '/folder/objWithBD/objWithBPTH/view')
+        self.assertEqual(r.response.base, '/folder/objWithBD/objWithBPTH/')
+
+    def test_traverse_withBDAndBPTH(self):
+        # Collector 1079 (infinite loop 1)
+        r = self.makeBaseRequest()
+        self.f1.objWithBPTH._path = ['objBasic']
+        self.f1.objWithBD._default_path = ['objWithBPTH']
+        r.traverse('folder/objWithBD')
+        self.assertEqual(r.URL, '/folder/objWithBD/objWithBPTH/objBasic')
+        self.assertEqual(r.response.base, '/folder/objWithBD/objWithBPTH/')
+
+    def test_traverse_withBDEmpty(self):
+        # Collector 1079 (infinite loop 2)
+        r = self.makeBaseRequest()
+        self.f1.objWithBD._default_path = ['']
+        self.failUnlessRaises('NotFound', r.traverse, 'folder/objWithBD')
+
+    def test_traverse_slash(self):
+        r = self.makeBaseRequest()
+        r['PARENTS'] = [self.f1.objWithDefault]
+        r.traverse('/')
+        self.assertEqual(r.URL, '/index_html')
+        self.assertEqual(r.response.base, '')
+
+
+def test_suite():
+    return TestSuite( ( makeSuite(TestBaseRequest), ) )
+
+if __name__ == '__main__':
+    main(defaultTest='test_suite')




More information about the Zope-Checkins mailing list