[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