[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