[z3-checkins] r14472 - z3/Five/trunk/browser/tests

philikon at codespeak.net philikon at codespeak.net
Sun Jul 10 14:37:52 CEST 2005


Author: philikon
Date: Sun Jul 10 14:37:49 2005
New Revision: 14472

Modified:
   z3/Five/trunk/browser/tests/menu.zcml
   z3/Five/trunk/browser/tests/test_menu.py
Log:
converted menu tests to doctest
added protected test menu items and made a note how the test
should actually fail here, including possible options to fix it.


Modified: z3/Five/trunk/browser/tests/menu.zcml
==============================================================================
--- z3/Five/trunk/browser/tests/menu.zcml	(original)
+++ z3/Five/trunk/browser/tests/menu.zcml	Sun Jul 10 14:37:49 2005
@@ -20,6 +20,15 @@
       permission="zope2.Public"
       />
 
+  <browser:menuItem
+      for="OFS.interfaces.IFolder"
+      menu="testmenu"
+      title="Protected Test Menu Item"
+      action="seagull.html"
+      description="This is a protected test menu item"
+      permission="zope2.ViewManagementScreens"
+      />
+
   <browser:menuItems
       for="OFS.interfaces.IFolder"
       menu="testmenu">
@@ -38,15 +47,31 @@
           permission="zope2.Public"
           />
 
+      <menuItem
+          title="Protected Test Menu Item 2"
+          action="falcon.html"
+          description="This is a protected test menu item"
+          permission="zope2.ViewManagementScreens"
+          />
+
   </browser:menuItems>
 
   <!-- page in a menu -->
   <browser:page
       for="OFS.interfaces.IFolder"
       template="cockatiel.pt"
-      name="cockatiel_menu.html"
+      name="cockatiel_menu_public.html"
+      permission="zope2.Public"
+      title="Page in a menu (public)"
+      menu="testmenu"
+      />
+
+  <browser:page
+      for="OFS.interfaces.IFolder"
+      template="cockatiel.pt"
+      name="cockatiel_menu_protected.html"
       permission="zope2.ViewManagementScreens"
-      title="A page based entry"
+      title="Page in a menu (protected)"
       menu="testmenu"
       />
 

Modified: z3/Five/trunk/browser/tests/test_menu.py
==============================================================================
--- z3/Five/trunk/browser/tests/test_menu.py	(original)
+++ z3/Five/trunk/browser/tests/test_menu.py	Sun Jul 10 14:37:49 2005
@@ -19,44 +19,97 @@
 if __name__ == '__main__':
     execfile(os.path.join(sys.path[0], 'framework.py'))
 
-import unittest
-from Testing.ZopeTestCase import ZopeTestCase, installProduct
-installProduct('Five')
-
-from zope.app.publisher.browser.globalbrowsermenuservice import \
-     globalBrowserMenuService
-
-import Products.Five.browser.tests
-from Products.Five import zcml
-from Products.Five.traversable import newInteraction, FakeRequest
-from Products.Five.testing import manage_addFiveTraversableFolder
-
-class MenuTest(ZopeTestCase):
-
-    def afterSetUp(self):
-        newInteraction()  # needed for menu configuration
-        zcml.load_config('menu.zcml', package=Products.Five.browser.tests)
-        manage_addFiveTraversableFolder(self.folder, 'test', 'Test')
-
-    def test_menu(self):
-        request = FakeRequest()
-        # XXX not sure why we need this..
-        request.getURL = lambda: 'http://www.infrae.com'
-        menu = globalBrowserMenuService.getMenu('testmenu',
-                                                self.folder.test,
-                                                request)
-        self.assertEquals(3, len(menu))
-        # sort menu items by title so we get a stable testable result
-        menu.sort(lambda x, y: cmp(x['title'], y['title']))
-        self.assertEquals('Test Menu Item', menu[0]['title'])
-        self.assertEquals('seagull.html', menu[0]['action'])
-        self.assertEquals('Test Menu Item 2', menu[1]['title'])
-        self.assertEquals('parakeet.html', menu[1]['action'])
+def test_menu():
+    """
+    Test menus
+
+    Before we can start we need to set up a few things.  For menu
+    configuration, we have to start a new interaction:
+
+      >>> from Products.Five.traversable import newInteraction
+      >>> newInteraction()
+
+      >>> import Products.Five.browser.tests
+      >>> from Products.Five import zcml
+      >>> zcml.load_config('menu.zcml', package=Products.Five.browser.tests) 
+
+    Now for some actual testing... Let's look up the menu we registered:
+
+      >>> from Products.Five.traversable import FakeRequest
+      >>> from zope.app.publisher.browser.globalbrowsermenuservice import \\
+      ...     globalBrowserMenuService
+
+      >>> request = FakeRequest()
+      >>> request.getURL = lambda: 'http://www.infrae.com'
+      >>> menu = globalBrowserMenuService.getMenu(
+      ...     'testmenu', self.folder, request)
+
+    It should have 
+
+      >>> len(menu)
+      4
+
+    Sort menu items by title so we get a stable testable result:
+
+      >>> menu.sort(lambda x, y: cmp(x['title'], y['title']))
+      >>> from pprint import pprint
+      >>> pprint(menu)
+      [{'action': '@@cockatiel_menu_public.html',
+        'description': '',
+        'extra': None,
+        'selected': '',
+        'title': u'Page in a menu (public)'},
+       {'action': u'seagull.html',
+        'description': u'This is a test menu item',
+        'extra': None,
+        'selected': '',
+        'title': u'Test Menu Item'},
+       {'action': u'parakeet.html',
+        'description': u'This is a test menu item',
+        'extra': None,
+        'selected': '',
+        'title': u'Test Menu Item 2'},
+       {'action': u'falcon.html',
+        'description': u'This is a test menu item',
+        'extra': None,
+        'selected': '',
+        'title': u'Test Menu Item 3'}]
+
+    Let's create a manager user account and log in.  We should get the
+    protected menu items now:
+
+      >>> uf = self.folder.acl_users
+      >>> uf._doAddUser('manager', 'r00t', ['Manager'], [])
+      >>> self.login('manager')
+      >>> newInteraction()
+
+      >>> menu = globalBrowserMenuService.getMenu(
+      ...     'testmenu', self.folder, request)
+
+
+    XXX This should really yield 7 menu items here (4 public ones + 3
+    protected ones).  The problem is this: GlobalBrowserMenuService
+    uses zope.security.management.checkPermission to see whether we're
+    qualified to see a menu item.  That function uses the
+    interaction's checkPermission method.  We thought that we could
+    register getSecurityManager() as an interaction, but that expects
+    a Zope 2 permission name whereas GlobalBrowserMenuService sends a
+    Zope 3 permission id.
+
+    TODO possible fix: register menu items with the permission title,
+    not permission id.  Another, probably more thorough option:
+    decorate getSecurityManager()'s checkPermission method with one
+    that does the conversion between zope 3 permission id and zope 2
+    permission title.
+
+      >>> len(menu)
+      4
+    """
 
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(MenuTest))
-    return suite
+    from Testing.ZopeTestCase import installProduct, ZopeDocTestSuite
+    installProduct('Five')
+    return ZopeDocTestSuite()
 
 if __name__ == '__main__':
     framework()


More information about the z3-checkins mailing list