[Zope3-checkins] CVS: Zope3/src/zope/app/services/tests - test_menu.py:1.2 test_interface.py:1.9

Stephan Richter srichter at cosmos.phy.tufts.edu
Fri Aug 15 21:45:19 EDT 2003


Update of /cvs-repository/Zope3/src/zope/app/services/tests
In directory cvs.zope.org:/tmp/cvs-serv20171/app/services/tests

Modified Files:
	test_interface.py 
Added Files:
	test_menu.py 
Log Message:
Merging dreamcatcher's TTW Schema branch:

1. Fixed Bug in adding that would cause infinite loops when the menu items
   action was not a valif view or factory id.

2. Extended adding to support more complex views. Until now we only 
   supported constructions like "+/AddView=id". Now you are able to say
   "+/AddView/More=id", which means that more information can be carried 
   in the URL. This can be used in many ways, including multi-page adding
   wizards. In my case I needed it to pass in the type of the TTW Schema-
   based Content Component.

3. Added Local Menus. This was a pain in the butt, but I think I got a 
   fairly nice model, where you can create local Menu Services, and Menus
   are simply named utilities. When active they are menus in the menu 
   service. This is very similar to the local interface service and TTW 
   Schema. 

4. Made some modifications to TTW Schema, cleaned up the code and moved
   the browser code and interfaces to the places they belong.

5. Added a Content Component Definition utility component, which takes a
   Schema and creates a content component for it, including permission
   settings and a menu entry. Currently the menu entry is always made to
   a local 'add_content' menu. I will change this and make it actually a
   screen, where the menu and title of the menu item can be chosen by the
   developer. Mmmh, should I add a factory for the definition as well, so
   that the content component is also available via python?

6. Added a Content Component Instance component that represents an 
   instance od a Content Component Definition. You will never directly 
   encounter this component, since it is automatically used by the adding
   code of the Content Component Definition.

7. Cleanups by both dreamcatcher and myself.

That's it. For more details see the branch checkin messages. I now consider
the dreamcatcher-ttwschema-branch closed.


=== Zope3/src/zope/app/services/tests/test_menu.py 1.1 => 1.2 ===
--- /dev/null	Fri Aug 15 20:45:18 2003
+++ Zope3/src/zope/app/services/tests/test_menu.py	Fri Aug 15 20:44:14 2003
@@ -0,0 +1,330 @@
+##############################################################################
+#
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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.
+#
+##############################################################################
+"""Browser Menu Service Tests
+
+$Id$
+"""
+import unittest
+
+from zope.app import zapi
+from zope.app.interfaces.services.menu import \
+     ILocalBrowserMenuService, ILocalBrowserMenu
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.app.interfaces.annotation import IAttributeAnnotatable
+from zope.app.interfaces.publisher.browser import IBrowserMenuService
+from zope.app.interfaces.services.registration import ActiveStatus
+from zope.app.interfaces.services.utility import ILocalUtility
+from zope.app.publisher.browser.globalbrowsermenuservice import \
+     globalBrowserMenuService
+from zope.app.services.menu import \
+     LocalBrowserMenuService, LocalBrowserMenu, LocalBrowserMenuItem
+from zope.app.services.utility import LocalUtilityService, UtilityRegistration
+from zope.app.services.servicenames import BrowserMenu, Utilities
+from zope.app.tests import setup
+from zope.component import getServiceManager
+from zope.component.exceptions import ComponentLookupError
+from zope.interface import Interface, implements, classImplements
+from zope.publisher.browser import TestRequest
+
+class I1(Interface): pass
+class I12(I1): pass
+class I11(I1): pass
+
+class TestObject:
+    implements(IBrowserPublisher, I11)
+
+    def f(self):
+        pass
+
+    def browserDefault(self, r):
+        return self, ()
+
+    def publishTraverse(self, request, name):
+        if name[:1] == 'f':
+            raise Forbidden, name
+        if name[:1] == 'u':
+            raise Unauthorized, name
+        return self.f
+
+
+def addMenu(servicemanager, menu_id, title, inherit, usage=''):
+    """Add a menu to the service manager's default package."""
+    menu = LocalBrowserMenu()
+    menu.title = title
+    menu.inherit = inherit
+    menu.usage = usage
+
+    default = zapi.traverse(servicemanager, 'default')
+    default.setObject(menu_id, menu)
+    path = "%s/default/%s" % (zapi.getPath(servicemanager), menu_id)
+    registration = UtilityRegistration(menu_id, ILocalBrowserMenu, path)
+    key = default.getRegistrationManager().setObject("", registration)
+    zapi.traverse(default.getRegistrationManager(), key).status = ActiveStatus
+    return zapi.traverse(default, menu_id)    
+
+
+def addMenuItem(menu, interface, action, title):
+    item = LocalBrowserMenuItem()
+    item.title = title
+    item.action = action
+    item.interface = interface
+    menu.setObject('something', item)
+    return item
+
+
+class LocalBrowserMenuServiceTest(unittest.TestCase):
+    """Test Interface for LocalInterfaceService instance."""
+
+    def setUp(self):
+        setup.placefulSetUp()
+        self.rootFolder = setup.buildSampleFolderTree()
+
+        # Define Menu Service
+        sm=getServiceManager(None)
+        sm.defineService(BrowserMenu, IBrowserMenuService)
+        sm.provideService(BrowserMenu, globalBrowserMenuService)
+        classImplements(LocalBrowserMenu, ILocalUtility)
+        classImplements(LocalBrowserMenu, IAttributeAnnotatable)
+        
+        # Create Placeless Components
+        ms = zapi.getService(None, BrowserMenu)
+        ms.menu('test_id', 'test menu', usage='usage')
+        ms.menu('test_id2', 'test menu 2', usage='usage 2')
+        ms.menu('test_id3', 'test menu 3', usage='usage 3')
+        ms.menuItem('test_id', Interface, 'a0', 't0', 'd0')
+        ms.menuItem('test_id',   I1, 'a1', 't1', 'd1')
+        ms.menuItem('test_id',  I11, 'a2', 't2', 'd2')
+        ms.menuItem('test_id',  I12, 'a3', 't3', 'd3')
+        ms.menuItem('test_id2',  I1, 'a4', 't4', 'd4')
+        ms.menuItem('test_id2', I11, 'a5', 't5', 'd5')
+        ms.menuItem('test_id2', I12, 'a6', 't6', 'd6')
+        ms.menuItem('test_id3',  I1, 'a7', 't7', 'd7')
+        ms.menuItem('test_id3', I11, 'a8', 't8', 'd8')
+        ms.menuItem('test_id3', I12, 'a9', 't9', 'd9')
+
+        # Create Components in root folder
+        mgr = setup.createServiceManager(self.rootFolder)
+        setup.addService(mgr, Utilities, LocalUtilityService())
+        self.root_ms = setup.addService(mgr, BrowserMenu,
+                                        LocalBrowserMenuService())
+        menu = addMenu(mgr, 'test_id', 'test menu r', True, 'usage r')
+        addMenuItem(menu, I1,  'ar1', 'tr1')
+        addMenuItem(menu, I11, 'ar2', 'tr2')
+        addMenuItem(menu, I12, 'ar3', 'tr3')
+        menu = addMenu(mgr, 'test_id2', 'test menu 2 r', False, 'usage 2 r')
+        addMenuItem(menu, I1,  'ar4', 'tr4')
+        addMenuItem(menu, I11, 'ar5', 'tr5')
+        addMenuItem(menu, I12, 'ar6', 'tr6')
+        
+        # Create Components in folder1
+        folder1 = zapi.traverse(self.rootFolder, 'folder1')
+        mgr = setup.createServiceManager(folder1)
+        setup.addService(mgr, Utilities, LocalUtilityService())
+        self.folder_ms = setup.addService(mgr, BrowserMenu,
+                                          LocalBrowserMenuService())
+        menu = addMenu(mgr, 'test_id', 'test menu f', True, 'usage f')
+        addMenuItem(menu, I1,  'af1', 'tf1')
+        addMenuItem(menu, I11, 'af2', 'tf2')
+        addMenuItem(menu, I12, 'af3', 'tf3')
+        menu = addMenu(mgr, 'test_id3', 'test menu 3 f', True, 'usage 3 f')
+        addMenuItem(menu, I1,  'af7', 'tf7')
+        addMenuItem(menu, I11, 'af8', 'tf8')
+        addMenuItem(menu, I12, 'af9', 'tf9')
+
+        
+    def tearDown(self):
+        setup.placefulTearDown()
+
+
+    def test_VerifyInterfaceImplementation(self):
+        self.assert_(ILocalBrowserMenuService.isImplementedBy(
+            LocalBrowserMenuService()))
+
+
+    def test_getAllLocalMenus(self):
+        menus = self.root_ms.getAllLocalMenus()
+        titles = map(lambda m: m.title, menus)
+        titles.sort()
+        self.assertEqual(titles, ['test menu 2 r', 'test menu r'])
+
+        menus = self.folder_ms.getAllLocalMenus()
+        titles = map(lambda m: m.title, menus)
+        titles.sort()
+        self.assertEqual(titles, ['test menu 3 f', 'test menu f'])
+
+
+    def test_queryLocalMenu(self):
+        for ms, menu_id, title in [
+            (self.root_ms, 'test_id', 'test menu r'),
+            (self.root_ms, 'test_id2', 'test menu 2 r'),
+            (self.folder_ms, 'test_id', 'test menu f'),
+            (self.folder_ms, 'test_id3', 'test menu 3 f'),
+            ]:
+            self.assertEqual(ms.queryLocalMenu(menu_id).title, title)
+
+        self.assertEqual(self.root_ms.queryLocalMenu('test_id3'), None)
+        self.assertEqual(self.folder_ms.queryLocalMenu('test_id2'), None)
+
+
+    def test_getLocalMenu(self):
+        for ms, menu_id, title in [
+            (self.root_ms, 'test_id', 'test menu r'),
+            (self.root_ms, 'test_id2', 'test menu 2 r'),
+            (self.folder_ms, 'test_id', 'test menu f'),
+            (self.folder_ms, 'test_id3', 'test menu 3 f'),
+            ]:
+            self.assertEqual(ms.getLocalMenu(menu_id).title, title)
+
+        self.assertRaises(ComponentLookupError, self.root_ms.getLocalMenu,
+                          'test_id3')
+        self.assertRaises(ComponentLookupError, self.folder_ms.getLocalMenu,
+                          'test_id2')
+
+
+    def test_queryInheritedMenu(self):
+        for ms, menu_id, canBeLocal, title in [
+            (self.root_ms, 'test_id', True, 'test menu r'),
+            (self.root_ms, 'test_id', False, 'test menu'),
+            (self.root_ms, 'test_id3', True, 'test menu 3'),
+            (self.root_ms, 'test_id3', False, 'test menu 3'),
+            (self.folder_ms, 'test_id', True, 'test menu f'),
+            (self.folder_ms, 'test_id', False, 'test menu r'),
+            (self.folder_ms, 'test_id2', True, 'test menu 2 r'),
+            (self.folder_ms, 'test_id2', False, 'test menu 2 r'),
+            (self.folder_ms, 'test_id3', True, 'test menu 3 f'),
+            (self.folder_ms, 'test_id3', False, 'test menu 3'),
+            ]:
+            self.assertEqual(
+                ms.queryInheritedMenu(menu_id, canBeLocal).title, title)
+
+        self.assertEqual(self.root_ms.queryInheritedMenu('test_id4'), None)
+        self.assertEqual(self.folder_ms.queryInheritedMenu('test_id4'), None)
+
+
+    def test_getInheritedMenu(self):
+        for ms, menu_id, canBeLocal, title in [
+            (self.root_ms, 'test_id', True, 'test menu r'),
+            (self.root_ms, 'test_id', False, 'test menu'),
+            (self.root_ms, 'test_id3', True, 'test menu 3'),
+            (self.root_ms, 'test_id3', False, 'test menu 3'),
+            (self.folder_ms, 'test_id', True, 'test menu f'),
+            (self.folder_ms, 'test_id', False, 'test menu r'),
+            (self.folder_ms, 'test_id2', True, 'test menu 2 r'),
+            (self.folder_ms, 'test_id2', False, 'test menu 2 r'),
+            (self.folder_ms, 'test_id3', True, 'test menu 3 f'),
+            (self.folder_ms, 'test_id3', False, 'test menu 3'),
+            ]:
+            self.assertEqual(
+                ms.getInheritedMenu(menu_id, canBeLocal).title, title)
+
+        self.assertRaises(ComponentLookupError,
+                          self.root_ms.getInheritedMenu, 'test_id4')
+        self.assertRaises(ComponentLookupError,
+                          self.root_ms.getInheritedMenu, 'test_id4', True)
+        self.assertRaises(ComponentLookupError,
+                          self.folder_ms.getInheritedMenu, 'test_id4')
+
+
+    def test_getAllMenuItems(self):
+        for ms, menu_id, titles in [
+            (self.root_ms, 'test_id', ('a0', 'a1', 'a2', 'ar1', 'ar2')),
+            (self.root_ms, 'test_id2', ('ar4', 'ar5')),
+            (self.root_ms, 'test_id3', ('a7', 'a8')),
+            (self.folder_ms, 'test_id', ('a0', 'a1', 'a2', 'af1', 'af2',
+                                         'ar1', 'ar2')),
+            (self.folder_ms, 'test_id2', ('ar4', 'ar5')),
+            (self.folder_ms, 'test_id3', ('a7', 'a8', 'af7', 'af8')),
+            ]:
+            actions = map(lambda m: m[0],
+                          ms.getAllMenuItems(menu_id, TestObject()))
+            actions.sort()
+            self.assertEqual(tuple(actions), titles)
+
+        self.assertRaises(KeyError, self.folder_ms.getAllMenuItems, 'test_id4',
+                          TestObject())
+        self.assertRaises(KeyError, self.root_ms.getAllMenuItems, 'test_id4',
+                          TestObject())
+
+        actions = map(lambda m: m[0],
+                      self.folder_ms.getAllMenuItems('test_id', None))
+        actions.sort()
+        self.assertEqual(tuple(actions), ('a0', 'a1', 'a2', 'a3',
+                                          'af1', 'af2', 'af3',
+                                          'ar1', 'ar2', 'ar3'))
+
+    def test_getMenu(self):
+        for ms, menu_id, titles in [
+            (self.root_ms, 'test_id', ('a0', 'a1', 'a2', 'ar1', 'ar2')),
+            (self.root_ms, 'test_id2', ('ar4', 'ar5')),
+            (self.root_ms, 'test_id3', ('a7', 'a8')),
+            (self.folder_ms, 'test_id', ('a0', 'a1', 'a2', 'af1', 'af2',
+                                         'ar1', 'ar2')),
+            (self.folder_ms, 'test_id2', ('ar4', 'ar5')),
+            (self.folder_ms, 'test_id3', ('a7', 'a8', 'af7', 'af8')),
+            ]:
+            actions = map(lambda m: m['action'],
+                          ms.getMenu(menu_id, TestObject(), TestRequest()))
+            actions.sort()
+            self.assertEqual(tuple(actions), titles)
+
+        self.assertRaises(KeyError, self.root_ms.getMenu, 'test_id4',
+                          TestObject(), TestRequest())
+        self.assertRaises(KeyError, self.folder_ms.getMenu, 'test_id4',
+                          TestObject(), TestRequest())
+        self.assertRaises(KeyError, self.folder_ms.getMenu,
+                          'test_id', None, TestRequest())
+
+
+    def test_getFirstMenuItem(self):
+        for ms, menu_id, action in [
+            (self.root_ms, 'test_id', 'ar1'),
+            (self.root_ms, 'test_id2', 'ar4'),
+            (self.root_ms, 'test_id3', 'a8'),
+            (self.folder_ms, 'test_id', 'af1'),
+            (self.folder_ms, 'test_id2', 'ar4'),
+            (self.folder_ms, 'test_id3', 'af7'),
+            ]:
+            item = ms.getFirstMenuItem(menu_id, TestObject(), TestRequest())
+            self.assertEqual(item['action'], action)
+
+        self.assertRaises(KeyError, self.root_ms.getFirstMenuItem,
+                          'test_id4', TestObject(), TestRequest())
+        self.assertRaises(KeyError, self.folder_ms.getFirstMenuItem,
+                          'test_id4', TestObject(), TestRequest())
+
+        self.assertRaises(KeyError, self.folder_ms.getFirstMenuItem,
+                          'test_id', None, TestRequest())
+
+
+    def test_getMenuUsage(self):
+        for ms, menu_id, usage in [
+            (self.root_ms, 'test_id', 'usage r'),
+            (self.root_ms, 'test_id2', 'usage 2 r'),
+            (self.root_ms, 'test_id3', 'usage 3'),
+            (self.folder_ms, 'test_id', 'usage f'),
+            (self.folder_ms, 'test_id2', 'usage 2 r'),
+            (self.folder_ms, 'test_id3', 'usage 3 f'),
+            ]:
+            self.assertEqual(ms.getMenuUsage(menu_id), usage)
+
+        self.assertRaises(KeyError, self.root_ms.getMenuUsage, 'test_id4')
+        self.assertRaises(KeyError, self.folder_ms.getMenuUsage, 'test_id4')
+        
+        
+
+def test_suite():
+    return unittest.makeSuite(LocalBrowserMenuServiceTest)
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')


=== Zope3/src/zope/app/services/tests/test_interface.py 1.8 => 1.9 ===
--- Zope3/src/zope/app/services/tests/test_interface.py:1.8	Wed Jun 25 11:27:41 2003
+++ Zope3/src/zope/app/services/tests/test_interface.py	Fri Aug 15 20:44:14 2003
@@ -11,7 +11,10 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
+"""Interface Service Tests
 
+$Id$
+"""
 import unittest
 
 from transaction import get_transaction




More information about the Zope3-Checkins mailing list