[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/ Added unit tests.

Charlie Clark charlie at begeistert.org
Sat Sep 25 16:44:46 EDT 2010


Log message for revision 116936:
  Added unit tests.

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_delete.pt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/members.txt
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py	2010-09-25 18:30:59 UTC (rev 116935)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py	2010-09-25 20:44:45 UTC (rev 116936)
@@ -64,6 +64,7 @@
     label = _(u"Manage Members")
     template = ViewPageTemplateFile("members.pt")
     delete_template = ViewPageTemplateFile("members_delete.pt")
+    guillotine = None
     form_fields = form.FormFields()
     hidden_fields = form.FormFields(IBatchForm)
     
@@ -92,6 +93,7 @@
         form.Action(
             name='cancel',
             label=_(u'Cancel'),
+            success='handle_cancel'
                 )
             )
     actions = manage_actions + delete_actions
@@ -105,8 +107,8 @@
 
     def _get_ids(self, data):
         """Identify objects that have been selected"""
-        ids = [k.split(".select")[0] for k, v in data.items()
-                 if v is True]
+        ids = [k[:-7] for k, v in data.items()
+                 if v is True and k.endswith('.select')]
         return ids
         
     def member_fields(self):
@@ -117,7 +119,7 @@
         members = []
         fields = form.FormFields()
         for item in self._getBatchObj():
-            field = form.FormField(f, 'select', item.id)
+            field = form.FormField(f, 'select', item.getId())
             fields += form.FormFields(field)
             members.append(MemberProxy(item))
         self.listBatchItems = members
@@ -145,14 +147,19 @@
     def handle_select_for_deletion(self, action, data):
         """Identify members to be deleted and redirect to confirmation
         template"""
-        self.status = ", ".join(self._get_ids(data))
+        self.guillotine = ", ".join(self._get_ids(data))
         return self.delete_template()
         
     def handle_delete(self, action, data):
         """Delete selected members"""
         mtool = self._getTool('portal_membership')
         mtool.deleteMembers(self._get_ids(data))
-        return self.request.response.redirect(self.request.URL)
+        self.status = _(u"Selected members deleted")
+        self._setRedirect('portal_actions', "global/manage_members")
+        
+    def handle_cancel(self, action, data):
+        """Don't delete anyone, return to list"""
+        self._setRedirect('portal_actions', "global/manage_members")
 
 
 class Roster(BatchViewBase):

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_delete.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_delete.pt	2010-09-25 18:30:59 UTC (rev 116935)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_delete.pt	2010-09-25 20:44:45 UTC (rev 116936)
@@ -11,7 +11,7 @@
   
  <p i18n:translate="">The following members - including all their data, home
   folders and roles - are selected for deletion:</p>
- <p><strong tal:content="view/status">MEMBERS</strong></p>
+ <p><strong tal:content="view/guillotine">MEMBERS</strong></p>
  
  <div class="buttons">
    <tal:loop tal:repeat="action view/delete_actions"

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/members.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/members.txt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/members.txt	2010-09-25 20:44:45 UTC (rev 116936)
@@ -0,0 +1,26 @@
+Membership forms
+----------------
+
+Set up manager.
+
+    >>> from urllib import quote
+    >>> uf = app.site.acl_users
+    >>> uf._doAddUser('mbr', 'mbrpw', ['Member'], [])
+    >>> mbr_credentials = quote('mbr:mbrpw'.encode('base64').rstrip())
+
+Create the browser object we'll be using.
+
+    # BBB for Zope 2.12
+    >>> try:
+    ...     from Testing.testbrowser import Browser
+    ... except ImportError:
+    ...     from Products.Five.testbrowser import Browser
+    >>> browser = Browser()
+
+Log the user in
+    >>> browser.open('http://localhost/site/@@login.html')
+    >>> browser.getControl(name="__ac_name").value = 'mbr'
+    >>> browser.getControl(name="__ac_password").value = 'mbrpw'
+    >>> browser.getControl(name="actions.login").click()
+    >>> '[[cmf_default][Login success]]' in browser.contents
+    True
\ No newline at end of file

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py	2010-09-25 20:44:45 UTC (rev 116936)
@@ -0,0 +1,142 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Foundation and Contributors.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (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.
+#
+##############################################################################
+""" Test Products.CMFDefault.browser.folder
+"""
+
+import unittest
+
+from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl.User import UnrestrictedUser
+from Testing import ZopeTestCase
+
+from zope.component import getSiteManager
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces.browser import IBrowserPublisher
+
+from Products.CMFCore.PortalFolder import PortalFolder
+from Products.CMFCore.tests.base.dummy import DummySite, DummyTool
+from Products.CMFCore.tests.base.dummy import (
+            DummyUserFolder, DummyUser
+            )
+
+from Products.CMFDefault.browser.membership.members import Manage, MemberProxy
+from Products.CMFDefault.testing import FunctionalLayer
+
+
+class DummyUser(DummyUser):
+    
+    def getProperty(self, attr):
+        return None
+
+
+class DummyMemberTool(object):
+    
+    def __init__(self):
+        self.members = {}
+    
+    def listMembers(self):
+        return self.members.values()
+        
+    def addMember(self, member):
+        self.members[member.getId()] = member
+        
+    def deleteMembers(self, member_ids):
+        for i in member_ids:
+            del self.members[i]
+            
+    def isAnonymousUser(self):
+        return True
+
+class MembershipViewTests(unittest.TestCase):
+
+    def setUp(self):
+        """Setup a site"""
+        self.site = site = DummySite('site')
+        self.sm = getSiteManager()
+        self.mtool = site._setObject('portal_membership', DummyMemberTool())
+        site._setObject('portal_actions', DummyTool())
+        site._setObject('portal_url', DummyTool())
+        
+
+    def _make_one(self, name="DummyUser"):
+        user = DummyUser(name)
+        self.mtool.addMember(user)
+        return user
+
+    def _make_batch(self):
+        """Add enough objects to force pagination"""
+        batch_size = Manage._BATCH_SIZE
+        for i in range(batch_size + 2):
+            user_id = "Dummy%s" % i
+            self._make_one(user_id)
+
+    def test_view(self):
+        view = Manage(self.site, TestRequest())
+        self.assertTrue(IBrowserPublisher.providedBy(view))
+
+    def test_list_batch_items(self):
+        user = self._make_one("Bob")
+        view = Manage(self.site, TestRequest())
+        view.member_fields()
+        members = view.listBatchItems
+        self.assertTrue(isinstance(members[0], MemberProxy))
+        self.assertEquals(members[0].name, "Bob")
+
+    def test_get_ids(self):
+        view = Manage(self.site, TestRequest())
+        self.assertEquals(
+                        view._get_ids({'foo':'bar'}),
+                        [])
+        self.assertEquals(
+                        sorted(
+                            view._get_ids({'DummyUser1.select':True,
+                                       'DummyUser2.select':False,
+                                       'DummyUser3.select':True})
+                            ),
+                        ['DummyUser1', 'DummyUser3']
+                        )
+        self.assertEquals(
+                        view._get_ids({'stupid.name.select.select':True}),
+                        ['stupid.name.select']
+        )
+        
+    def test_handle_select_for_deletion(self):
+        view = Manage(self.site, TestRequest())
+        self.assertTrue(view.guillotine == None)
+        # Catch exception raised when template tries to render
+        self.assertRaises(AttributeError,
+                view.handle_select_for_deletion, None, {"Alice.select":True} )
+        self.assertTrue(view.guillotine == "Alice")
+
+    def test_handle_delete(self):
+        self._make_one("Bob")
+        view = Manage(self.site, TestRequest())
+        self.assertFalse(self.mtool.listMembers() == [])
+        # Catch exception raised when trying to redirect
+        self.assertRaises(TypeError,
+                         view.handle_delete, None, {"Bob.select":True}
+                         )
+        self.assertTrue(self.mtool.listMembers() == [])
+
+
+ftest_suite = ZopeTestCase.FunctionalDocFileSuite('members.txt',
+                        )
+
+
+ftest_suite.layer = FunctionalLayer
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(MembershipViewTests))
+    suite.addTest(unittest.TestSuite((ftest_suite,)))
+    return suite


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native



More information about the checkins mailing list