source: products/quintagroup.plonecomments/trunk/quintagroup/plonecomments/tests/testQPloneCommentsNotificationRecipients.py @ 3127

Last change on this file since 3127 was 3127, checked in by kroman0, 13 years ago

Fixed tests after pep8 cleaning

File size: 7.6 KB
Line 
1#
2# Test configuration form working
3#
4
5from Products.CMFCore.utils import getToolByName
6from Products.CMFPlone.tests.utils import MockMailHost
7import re
8from quintagroup.plonecomments.tests.helperNotify import setProperties
9from quintagroup.plonecomments.tests.base import FunctionalTestCase
10from quintagroup.plonecomments.tests.common import addMembers, add2Group
11from quintagroup.plonecomments.tests.config import PROPERTY_SHEET
12
13USERS = {   # Common Members
14         'admin': {'passw': 'secret_admin', 'roles': ['Manager']},
15         'owner': {'passw': 'secret_creator', 'roles': ['Member']},
16         'replier1': {'passw': 'secret_member', 'roles': ['Member']},
17         'replier2': {'passw': 'secret_member', 'roles': ['Member']},
18            # Members for discussion manager group
19         'dm_admin': {'passw': 'secret_dm_admin', 'roles': ['Manager']},
20        }
21DM_USERS_IDS = [u for u in USERS.keys() if u.startswith('dm_')]
22
23REXP_TO = re.compile("To:\s*(.*?)$", re.M)
24REXP_SUBJ = re.compile("Subject:\s*(.*?)$", re.M)
25
26
27class TestNotificationRecipients(FunctionalTestCase):
28    """ Test is notifications sends to right recipients. """
29
30    def prepareRequest4Reply(self, member_id):
31        self.login(member_id)
32        self.request = self.app.REQUEST
33        creator = self.membership.getAuthenticatedMember()
34        self.request.form['Creator'] = creator.getUserName()
35        subject = "Reply of '%s'" % self.request.form['Creator']
36        self.request.form['subject'] = subject
37        self.request.form['body_text'] = "text of reply"
38
39    def beforeTearDown(self):
40        self.portal.MailHost = self.portal._original_MailHost
41
42    def afterSetUp(self):
43        self.portal._original_MailHost = self.portal.MailHost
44        self.portal.MailHost = MockMailHost('MailHost')
45
46        self.loginAsPortalOwner()
47
48        # VERY IMPORTANT to guarantee product skin's content visibility
49        self._refreshSkinData()
50        '''Preparation for functional testing'''
51        self.membership = getToolByName(self.portal, 'portal_membership', None)
52        self.discussion = getToolByName(self.portal, 'portal_discussion', None)
53
54        # Allow discussion for Document
55        portal_types = getToolByName(self.portal, 'portal_types', None)
56        doc_fti = portal_types.getTypeInfo('Document')
57        doc_fti._updateProperty('allow_discussion', 1)
58
59        # Make sure Documents are visible by default
60        # XXX only do this for plone 3
61        self.portal.portal_workflow.setChainForPortalTypes(('Document',),
62                                                           'plone_workflow')
63        portal_properties = getToolByName(self.portal, 'portal_properties',
64                                          None)
65        self.prefs = portal_properties[PROPERTY_SHEET]
66
67        # Add users and add members to DiscussionManager group
68        addMembers(self.portal, USERS)
69        add2Group(self.portal, 'DiscussionManager', DM_USERS_IDS)
70        self.createMemberarea('owner')
71
72        # Prepare mail sending - enter an e-mail adress,
73        # and allow all possible notifications
74        self.portal.email_from_address = 'mail@plone.test'
75        setProperties(self.prefs, 'enable_moderation',
76            'enable_approve_notification', 'enable_approve_user_notification',
77            'enable_reply_user_notification', 'enable_published_notification',
78            'enable_rejected_user_notification')
79        self.prefs._updateProperty('email_discussion_manager',
80                                   'discussion.manager@test.com')
81        self.prefs._updateProperty('email_subject_prefix', 'PREFIX')
82
83        # Add testing document to portal
84        self.login('owner')
85        self.portal.Members['owner'].invokeFactory('Document', id='my_doc',
86                                                   title="Test document")
87        self.my_doc = self.portal.Members['owner']['my_doc']
88        self.my_doc.edit(text_format='plain', text='hello world')
89
90        # Create talkback for document and Prepare REQUEST
91        self.discussion.getDiscussionFor(self.my_doc)
92        #prepareMailSendTest()
93
94    def checkToANDSubj(self, mails, to, subj):
95        messages = [str(m)
96                    for m in mails
97                    if REXP_TO.search(str(m)) and \
98                       REXP_TO.search(str(m)).group(1) == to]
99        self.failUnless(len(messages) > 0,
100                        "No message sent to '%s' recipient" % to)
101        self.failUnless([1
102                         for m in messages
103                         if REXP_SUBJ.search(m) and \
104                            REXP_SUBJ.search(m).group(1) == subj],
105             "There is no message for '%s' recipient with '%s' subject" % \
106             (to, subj))
107
108    def test_Reply(self):
109        self.portal.MailHost.reset()
110        self.prepareRequest4Reply('replier1')
111        self.my_doc.discussion_reply('A Reply for my_doc',
112                                     'text of reply for my_doc')
113        mails = self.portal.MailHost.messages
114        self.assertEqual(len(mails), 1)
115        self.checkToANDSubj(mails, to="discussion.manager@test.com",
116                            subj="[PREFIX] New comment awaits moderation")
117
118    def test_PublishReply(self):
119        self.prepareRequest4Reply('replier1')
120        self.my_doc.discussion_reply('A Reply for my_doc',
121                                     'text of reply for my_doc')
122        self.login('dm_admin')
123        reply = self.discussion.getDiscussionFor(self.my_doc).getReplies()[0]
124        self.portal.MailHost.reset()
125        reply.discussion_publish_comment()
126        mails = self.portal.MailHost.messages
127        self.assertEqual(len(mails), 2)
128        self.checkToANDSubj(mails, to="owner@test.com",
129            subj="[PREFIX] New comment added")
130        self.checkToANDSubj(mails, to="replier1@test.com",
131            subj='Your comment on Test document is now published')
132
133    def test_Publish2ndReply(self):
134        self.prepareRequest4Reply('replier1')
135        self.my_doc.discussion_reply('A Reply for my_doc',
136                                     'text of reply for my_doc')
137        self.login('dm_admin')
138        reply = self.discussion.getDiscussionFor(self.my_doc).getReplies()[0]
139        reply.discussion_publish_comment()
140        self.prepareRequest4Reply('replier2')
141        reply.discussion_reply('A Reply for reply for my_doc',
142                               'text of reply on reply for my_doc')
143        self.login('dm_admin')
144        reply2 = self.discussion.getDiscussionFor(reply).getReplies()[0]
145        self.portal.MailHost.reset()
146        reply2.discussion_publish_comment()
147        mails = self.portal.MailHost.messages
148        self.assertEqual(len(mails), 3)
149        self.checkToANDSubj(mails, to="owner@test.com",
150            subj="[PREFIX] New comment added")
151        self.checkToANDSubj(mails, to="replier1@test.com",
152            subj='Someone replied to your comment on Test document')
153        self.checkToANDSubj(mails, to="replier2@test.com",
154            subj='Your comment on Test document is now published')
155
156    def test_DeleteReply(self):
157        self.prepareRequest4Reply('replier1')
158        self.my_doc.discussion_reply('A Reply for my_doc',
159                                     'text of reply for my_doc')
160        self.login('dm_admin')
161        reply = self.discussion.getDiscussionFor(self.my_doc).getReplies()[0]
162        self.portal.MailHost.reset()
163        reply.deleteDiscussion()
164        mails = self.portal.MailHost.messages
165        self.assertEqual(len(mails), 1)
166        self.checkToANDSubj(mails, to="replier1@test.com",
167            subj='Your comment on Test document was not approved')
168
169
170def test_suite():
171    from unittest import TestSuite, makeSuite
172    suite = TestSuite()
173    suite.addTest(makeSuite(TestNotificationRecipients))
174    return suite
Note: See TracBrowser for help on using the repository browser.