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

Last change on this file since 1633 was 1633, checked in by kroman0, 14 years ago

Fixed tests for quintagroup.plonecomments

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