diff --git a/CHANGES.rst b/CHANGES.rst index 006e0da..6cfb205 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,9 @@ Changelog 1.6 (unreleased) ------------------- +- Add test case for empty recipients. + [fulv] + - Add support for Plone 5.0 and 5.1. On Plone 5.x we use z3c.form instead of formlib. [fulv] diff --git a/collective/contentrules/mailtogroup/actions/mail.py b/collective/contentrules/mailtogroup/actions/mail.py index 71a46dc..5c42eb8 100755 --- a/collective/contentrules/mailtogroup/actions/mail.py +++ b/collective/contentrules/mailtogroup/actions/mail.py @@ -18,11 +18,11 @@ from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from Products.statusmessages.interfaces import IStatusMessage from zope import schema -from zope.component import adapts +from zope.component import adapter from zope.component import getUtility from zope.component.interfaces import ComponentLookupError from zope.globalrequest import getRequest -from zope.interface import implements +from zope.interface import implementer from zope.interface import Interface import logging @@ -74,9 +74,9 @@ class IMailGroupAction(Interface): ) +@implementer(IMailGroupAction, IRuleElementData) class MailGroupAction(SimpleItem): """ The implementation of the action defined before """ - implements(IMailGroupAction, IRuleElementData) subject = u'' source = u'' @@ -95,10 +95,10 @@ def summary(self): mapping=dict(groups=groups, both=both, members=members)) +@implementer(IExecutable) +@adapter(Interface, IMailGroupAction, Interface) class MailActionExecutor(object): """ The executor for this action. """ - implements(IExecutable) - adapts(Interface, IMailGroupAction, Interface) def __init__(self, context, element, event): self.context = context @@ -150,6 +150,8 @@ def __call__(self): self.subject = interpolator(self.element.subject) mime_msg = self.create_mime_msg() + if not mime_msg: + return False # Finally send mail. # Plone-4 diff --git a/collective/contentrules/mailtogroup/actions_formlib/mail.py b/collective/contentrules/mailtogroup/actions_formlib/mail.py index d2bc7f1..f76d17a 100755 --- a/collective/contentrules/mailtogroup/actions_formlib/mail.py +++ b/collective/contentrules/mailtogroup/actions_formlib/mail.py @@ -14,10 +14,10 @@ from Products.CMFCore.utils import getToolByName from Products.CMFPlone import PloneMessageFactory as _ from zope import schema -from zope.component import adapts +from zope.component import adapter from zope.component.interfaces import ComponentLookupError from zope.formlib import form -from zope.interface import implements +from zope.interface import implementer from zope.interface import Interface @@ -63,9 +63,9 @@ class IMailGroupAction(Interface): ) +@implementer(IMailGroupAction, IRuleElementData) class MailGroupAction(SimpleItem): """ The implementation of the action defined before """ - implements(IMailGroupAction, IRuleElementData) subject = u'' source = u'' @@ -83,10 +83,10 @@ def summary(self): ${members}', mapping=dict(groups=groups, members=members)) +@implementer(IExecutable) +@adapter(Interface, IMailGroupAction, Interface) class MailActionExecutor(object): """ The executor for this action. """ - implements(IExecutable) - adapts(Interface, IMailGroupAction, Interface) def __init__(self, context, element, event): self.context = context diff --git a/collective/contentrules/mailtogroup/tests/test_action_mail_to_group.py b/collective/contentrules/mailtogroup/tests/test_action_mail_to_group.py index 2e08aeb..cffa33f 100644 --- a/collective/contentrules/mailtogroup/tests/test_action_mail_to_group.py +++ b/collective/contentrules/mailtogroup/tests/test_action_mail_to_group.py @@ -131,6 +131,8 @@ def afterSetUp(self): groups.addPrincipalToGroup('member2', 'group2') groups.addPrincipalToGroup('member3', 'group2') + groups.addGroup('group3') + def _setup_mockmail(self): sm = getSiteManager(self.portal) sm.unregisterUtility(provided=IMailHost) @@ -142,10 +144,10 @@ def _setup_mockmail(self): def testRegistered(self): element = getUtility(IRuleAction, name='plone.actions.MailGroup') - self.assertEquals('plone.actions.MailGroup', element.addview) - self.assertEquals('edit', element.editview) - self.assertEquals(None, element.for_) - self.assertEquals(None, element.event) + self.assertEqual('plone.actions.MailGroup', element.addview) + self.assertEqual('edit', element.editview) + self.assertEqual(None, element.for_) + self.assertEqual(None, element.event) def testInvokeAddView(self): element = getUtility(IRuleAction, name='plone.actions.MailGroup') @@ -156,7 +158,7 @@ def testInvokeAddView(self): adding = getMultiAdapter((rule, self.portal.REQUEST), name='+action') addview = getMultiAdapter((adding, self.portal.REQUEST), name=element.addview) - self.failUnless(isinstance(addview, MailGroupAddFormView)) + self.assertTrue(isinstance(addview, MailGroupAddFormView)) if IS_PLONE_5: addview.form_instance.update() @@ -176,19 +178,19 @@ def testInvokeAddView(self): 'message': 'Hey, Oh!'}) e = rule.actions[0] - self.failUnless(isinstance(e, MailGroupAction)) - self.assertEquals('My Subject', e.subject) - self.assertEquals('foo@bar.be', e.source) - self.assertEquals(['group1', 'group2'], e.groups) - self.assertEquals([default_user, ], e.members) - self.assertEquals('Hey, Oh!', e.message) + self.assertTrue(isinstance(e, MailGroupAction)) + self.assertEqual('My Subject', e.subject) + self.assertEqual('foo@bar.be', e.source) + self.assertEqual(['group1', 'group2'], e.groups) + self.assertEqual([default_user, ], e.members) + self.assertEqual('Hey, Oh!', e.message) def testInvokeEditView(self): element = getUtility(IRuleAction, name='plone.actions.MailGroup') e = MailGroupAction() editview = getMultiAdapter((e, self.folder.REQUEST), name=element.editview) - self.failUnless(isinstance(editview, MailGroupEditFormView)) + self.assertTrue(isinstance(editview, MailGroupEditFormView)) def testExecute(self): setRoles(self.portal, TEST_USER_ID, ['Manager']) @@ -267,7 +269,7 @@ def testExecuteMultiGroupsAndUsers(self): mailFrom = mailSent.get('From') mailType = mailSent.get('Content-Type') self.assertEqual(len(mailTo), 4) - self.failUnless(isinstance(mailSent, Message)) + self.assertTrue(isinstance(mailSent, Message)) self.assertTrue(mailType.startswith('multipart/related')) self.assertEqual('foo@bar.be', mailFrom) @@ -277,6 +279,23 @@ def testExecuteMultiGroupsAndUsers(self): self.assertIn('member2@dummy.org', mailTo) self.assertIn('Document created !', str(mailSent)) + def testExecuteEmptyGroup(self): + setRoles(self.portal, TEST_USER_ID, ['Manager']) + dummyMailHost = self._setup_mockmail() + + e = MailGroupAction() + e.source = 'foo@bar.be' + e.groups = ['group3'] + e.members = [] + e.message = 'Document created !' + ex = getMultiAdapter((self.folder, e, DummyEvent(self.folder.d1)), + IExecutable) + ret = ex() + + self.assertFalse(ret) + + self.assertEqual(len(dummyMailHost.messages), 0) + def test_suite(): from unittest import TestSuite, makeSuite