source: products/quintagroup.plonecomments/branches/jquery/quintagroup/plonecomments/tests/testQPloneCommentsCommenting.py @ 2138

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

PEP8 fixes

File size: 17.3 KB
Line 
1#
2# Test adding comments possibility on switching on/off moderation
3#
4
5from zExceptions import Unauthorized
6from base import getToolByName, FunctionalTestCase
7from config import *
8
9
10class TestCommBase(FunctionalTestCase):
11
12    def afterSetUp(self):
13        self.loginAsPortalOwner()
14        self.request = self.app.REQUEST
15
16        # VERY IMPORTANT to guarantee product skin's content visibility
17        self._refreshSkinData()
18
19        # Add all users
20        self.membership = getToolByName(self.portal, 'portal_membership', None)
21        for user_id in USERS.keys():
22            self.membership.addMember(user_id, USERS[user_id]['passw'],
23                                      USERS[user_id]['roles'], [])
24
25        # Add users to Discussion Manager group
26        portal_groups = getToolByName(self.portal, 'portal_groups')
27        dm_group = portal_groups.getGroupById('DiscussionManager')
28        dm_users = [dm_group.addMember(u) for u in DM_USERS_IDS]
29
30        # Allow discussion for Document
31        portal_types = getToolByName(self.portal, 'portal_types', None)
32        doc_fti = portal_types.getTypeInfo('Document')
33        doc_fti._updateProperty('allow_discussion', 1)
34
35        # Make sure Documents are visible by default
36        # XXX only do this for plone 3
37        self.portal.portal_workflow.setChainForPortalTypes(('Document',),
38                                                           'plone_workflow')
39
40        # Add testing documents to portal. Add one document for avery user.
41        # For testing behaviors, where made some changes to document state
42        # it's more usefull.
43        self.discussion = getToolByName(self.portal, 'portal_discussion', None)
44        self.all_users_id = DM_USERS_IDS + COMMON_USERS_IDS
45        for user_id in self.all_users_id:
46            doc_id = 'doc_%s' % user_id
47            self.portal.invokeFactory('Document', id=doc_id)
48            doc_obj = getattr(self.portal, doc_id)
49            doc_obj.edit(text_format='plain',
50                         text='hello world from %s' % doc_id)
51            # Create talkback for document and Add comment to doc_obj
52            self.discussion.getDiscussionFor(doc_obj)
53            doc_obj.discussion_reply('A Reply for %s' % doc_id,
54                                     'text of reply for %s' % doc_id)
55
56
57class TestMixinAnonymOn:
58
59    def getDiscussionReplies(self, doc_obj):
60        return self.discussion.getDiscussionFor(doc_obj).getReplies()
61
62    def afterSetUp(self):
63        pass
64
65    def testAddCommentToDocAnonymUsers(self):
66
67        # ADDING COMMENTS MUST ALLOWED for anonymous users
68        self.login('dm_admin')
69        doc_obj = getattr(self.portal, "doc_anonym")
70        replies_before = len(self.getDiscussionReplies(doc_obj))
71
72        # Create talkback for document and Add comment
73        self.logout()
74        doc_obj.discussion_reply("Anonym reply", "text of 'anonym' reply")
75        self.login('dm_admin')
76        replies_after = len(self.getDiscussionReplies(doc_obj))
77        self.failUnless(replies_after - replies_before,
78        "Anonymous user CAN'T really add comment in terned ON *Anonymous "
79        "commenting mode*.")
80
81    def testAddCommentToDocNotAnonymUsers(self):
82
83        # All users CAN ADD COMMENTS
84        not_anonym_users = [u for u in self.all_users_id if not u == 'anonym']
85        failed_users = []
86        for u in not_anonym_users:
87            self.login('dm_admin')
88            doc_id = "doc_%s" % u
89            doc_obj = getattr(self.portal, doc_id)
90            replies_before = self.getDiscussionReplies(doc_obj)
91            self.login(u)
92
93            # Create talkback for document and Add comment
94            doc_obj.discussion_reply("%s's reply" % u,
95                                     "text of '%s' reply" % u)
96
97            # Check is comment added
98            self.login('dm_admin')
99            replies_after = self.getDiscussionReplies(doc_obj)
100            disparity = len(replies_after) - len(replies_before)
101            if not disparity:
102                failed_users.append(u)
103        self.failIf(failed_users,
104        "%s - user(s) can not really add comment." % failed_users)
105
106
107class TestMixinAnonymOff:
108
109    def getDiscussionReplies(self, doc_obj):
110        return self.discussion.getDiscussionFor(doc_obj).getReplies()
111
112    def afterSetUp(self):
113        all_users_id = DM_USERS_IDS + COMMON_USERS_IDS
114        self.not_like_anonym = ['admin', 'member', 'dm_admin', 'dm_member']
115        self.like_anonym = [u for u in all_users_id
116                              if u not in self.not_like_anonym]
117
118    def testAddCommentToDocLikeAnonymUsers(self):
119        # ADDING COMMENTS MUST REFUSED for anonymous users
120        failed_users = []
121        for u in self.like_anonym:
122            self.login('dm_admin')
123            doc_obj = getattr(self.portal, "doc_%s" % u)
124            replies_before = self.getDiscussionReplies(doc_obj)
125
126            # Create talkback for document and Add comment
127            self.logout()
128            if not u == 'anonym':
129                self.login(u)
130            self.assertRaises(Unauthorized, doc_obj.discussion_reply,
131            "%s's reply" % u, "text of '%s' reply" % u)
132            self.login('dm_admin')
133            replies_after = self.getDiscussionReplies(doc_obj)
134            disparity = len(replies_after) - len(replies_before)
135            if disparity:
136                failed_users.append(u)
137        self.failIf(failed_users,
138        "%s user(s) CAN really add comment in terned OFF "
139        "*Anonymous commenting mode*." % failed_users)
140
141    def testAddCommentToDocNotLikeAnonymUsers(self):
142        # All users CAN ADD COMMENTS
143        failed_users = []
144        for u in self.not_like_anonym:
145            self.login('dm_admin')
146            doc_id = "doc_%s" % u
147            doc_obj = getattr(self.portal, doc_id)
148            replies_before = self.getDiscussionReplies(doc_obj)
149            self.login(u)
150
151            # Create talkback for document and Add comment
152            doc_obj.discussion_reply("%s's reply" % u,
153                                     "text of '%s' reply" % u)
154
155            # Check is comment added
156            self.login('dm_admin')
157            replies_after = self.getDiscussionReplies(doc_obj)
158            disparity = len(replies_after) - len(replies_before)
159            if not disparity:
160                failed_users.append(u)
161        self.failIf(failed_users,
162        "%s - user(s) can not really add commentin terned OFF "
163        "*Anonymous commenting mode*." % failed_users)
164
165
166class TestMixinModerationOn:
167
168    def getDiscussionReplies(self, doc_obj):
169        return self.discussion.getDiscussionFor(doc_obj).getReplies()
170
171    def afterSetUp(self):
172        # Get Moderation state
173        pp = getToolByName(self.portal, 'portal_properties')
174        config_ps = getattr(pp, PROPERTY_SHEET, None)
175        EnableAnonymComm = getattr(config_ps, "enable_anonymous_commenting")
176
177        # Group users depending on Anonymous commenting enabling/disabling
178        if EnableAnonymComm:
179            self.allowable_dm_users = DM_USERS_IDS
180            self.allowable_common_users = COMMON_USERS_IDS
181            self.illegal_dm_users = []
182            self.illegal_common_users = []
183        else:
184            self.allowable_dm_users = ['dm_admin', 'dm_member']
185            self.allowable_common_users = ['admin', 'member']
186            self.illegal_dm_users = [u for u in DM_USERS_IDS
187                if not u in self.allowable_dm_users]
188            self.illegal_common_users = [u for u in COMMON_USERS_IDS
189                if not u in self.allowable_common_users]
190
191    def testAddCommentToNotPublishedReplyDMUsers(self):
192        # DiscussionManager's group's members with Manager or Member roles
193        # CAN ADD COMMENTS to reply IN ANY STATE (published/not published)
194        failed_users = []
195        for u in self.allowable_dm_users:
196            self.login(u)
197            doc_obj = getattr(self.portal, "doc_%s" % u)
198            # Get reply to this document
199            reply = self.getDiscussionReplies(doc_obj)[0]
200            # Create talkback for reply and Add comment
201            self.discussion.getDiscussionFor(reply)
202            reply.discussion_reply("%s's reply" % u, "text of '%s' reply" % u)
203            replies_to_reply = self.getDiscussionReplies(reply)
204            if not replies_to_reply:
205                failed_users.append(u)
206        self.failIf(failed_users,
207        "%s - member(s) of DiscussionManager group CAN'T really "
208        "ADD comment" % failed_users)
209
210        # This is actual only in terned OFF *Anonymous commenting mode*
211        failed_users = []
212        for u in self.illegal_dm_users:
213            self.login(u)
214            doc_obj = getattr(self.portal, "doc_%s" % u)
215            # Get reply to this document
216            reply = self.getDiscussionReplies(doc_obj)[0]
217            # Create talkback for reply and Add comment
218            self.discussion.getDiscussionFor(reply)
219            self.assertRaises(Unauthorized, reply.discussion_reply,
220                "%s's reply" % u, "text of '%s' reply" % u)
221            replies_to_reply = self.getDiscussionReplies(reply)
222            if replies_to_reply:
223                failed_users.append(u)
224        self.failIf(failed_users,
225        "%s user(s) CAN really add comment in terned OFF "
226        "*Anonymous commenting mode*." % failed_users)
227
228    """
229    def testAddCommentToNotPublishedReplyNotDMUsers(self):
230        # Users without DiscussionManager role CAN'T ACCESS an so ADD COMMENTS
231        # TO NOT PUBLISHED reply.
232        manager = 'dm_admin'
233        for u in self.allowable_common_users:
234            self.login(manager)
235            doc_obj = getattr(self.portal, "doc_%s" % u)
236            reply = self.getDiscussionReplies(doc_obj)[0]
237            reply_to_reply = self.getDiscussionReplies(reply)
238            reply_to_reply_before = len(reply_to_reply)
239            self.logout()
240            if not u=='anonym':
241                self.login(u)
242            # On adding reply to not published reply MUST generate
243            # Unauthorized exception
244            self.assertRaises(Unauthorized, reply.discussion_reply,
245                              "Reply %s" % u, "text of %s reply" % u)
246    """
247
248    def testAddCommentToPublishedReplyALLUsers(self):
249        # All users CAN ADD COMMENTS to published reply
250        manager = 'dm_admin'
251        allowable_users = self.allowable_dm_users + self.allowable_common_users
252        illegal_users = self.illegal_dm_users + self.illegal_common_users
253        all_users = allowable_users + illegal_users
254
255        # 1. Publish comments
256        self.login(manager)
257        for u in all_users:
258            doc_obj = getattr(self.portal, "doc_%s" % u)
259            reply = self.getDiscussionReplies(doc_obj)[0]
260            reply.discussion_publish_comment()
261
262        # 2.Check adding reply to reply for allowable users
263        failed_users = []
264        for u in allowable_users:
265            self.logout()
266            if not u == 'anonym':
267                self.login(u)
268
269            # Create talkback for document and Add comment
270            self.discussion.getDiscussionFor(reply)
271            reply.discussion_reply("Reply %s" % u, "text of %s reply" % u)
272
273            # Check is comment added
274            self.login(manager)
275            reply_to_reply = self.getDiscussionReplies(reply)
276            if not reply_to_reply:
277                failed_users.append(u)
278        self.failIf(failed_users,
279        "%s - user(s) can not really add comment "
280        "to PUBLISHED reply." % failed_users)
281
282        # 3.Check adding reply to reply for illegal users
283        for u in illegal_users:
284            self.logout()
285            if not u == 'anonym':
286                self.login(u)
287
288            # On adding reply to not published reply MUST generate
289            # Unauthorized exception
290            self.discussion.getDiscussionFor(reply)
291            self.assertRaises(Unauthorized, reply.discussion_reply,
292            "Reply %s" % u, "text of %s reply" % u)
293
294
295class TestMixinModerationOff:
296
297    def afterSetUp(self):
298        # Get Moderation state
299        pp = getToolByName(self.portal, 'portal_properties')
300        config_ps = getattr(pp, PROPERTY_SHEET, None)
301        EnableAnonymComm = getattr(config_ps, "enable_anonymous_commenting")
302
303        # Group users depending on Anonymous commenting enabling/disabling
304        if EnableAnonymComm:
305            self.allowable_users = DM_USERS_IDS + COMMON_USERS_IDS
306            self.illegal_users = []
307        else:
308            self.allowable_users = ['dm_admin', 'dm_member', 'admin', 'member']
309            self.illegal_users = [u for u in self.all_users_id
310                                    if not u in self.allowable_users]
311
312        # Add testing document to portal in Moderation OFF mode.
313        self.discussion = getToolByName(self.portal, 'portal_discussion', None)
314        self.doc_moder_off_id = 'doc_moderation_off'
315        self.portal.invokeFactory('Document', id=self.doc_moder_off_id)
316        doc_obj = getattr(self.portal, self.doc_moder_off_id)
317        doc_obj.edit(text_format='plain',
318                     text='hello world from in moderation off mode')
319
320        # Create talkback for document and Add comment to 'doc_moderatio_off'
321        self.discussion.getDiscussionFor(doc_obj)
322        doc_obj.discussion_reply("A Reply to '%s'" % self.doc_moder_off_id,
323        "text of reply to '%s'" % self.doc_moder_off_id)
324
325    def testAddCommentToReplyAllowableUsers(self):
326        # Users CAN ADD COMMENTS
327        failed_users = []
328        for u in self.allowable_users:
329            self.logout()
330            if not u == 'anonym':
331                self.login(u)
332            doc_obj = getattr(self.portal, self.doc_moder_off_id)
333
334            # Get reply to this document
335            reply_to_doc = self.getDiscussionReplies(doc_obj)[0]
336
337            # Create talkback for reply and Add comment
338            replies_before = self.getDiscussionReplies(reply_to_doc)
339            if not replies_before:
340                self.discussion.getDiscussionFor(reply_to_doc)
341            reply_to_doc.discussion_reply("%s's reply" % u,
342                                          "text of '%s' reply" % u)
343            replies_after = self.getDiscussionReplies(reply_to_doc)
344            disparity = len(replies_after) - len(replies_before)
345            if not disparity:
346                failed_users.append(u)
347        self.failIf(failed_users,
348        "%s - member(s) CAN'T really ADD comment in terned "
349        "off comments Moderation mode." % failed_users)
350
351    def testAddCommentToReplyIllegalUsers(self):
352        # This users CAN'T ADD COMMENTS
353        # This is actual only in terned OFF *Anonymous commenting mode*
354        for u in self.illegal_users:
355            self.logout()
356            if not u == 'anonym':
357                self.login(u)
358            doc_obj = getattr(self.portal, self.doc_moder_off_id)
359
360            # Get reply to this document
361            reply_to_doc = self.getDiscussionReplies(doc_obj)[0]
362
363            # Create talkback for reply and Add comment
364            self.discussion.getDiscussionFor(reply_to_doc)
365            self.assertRaises(Unauthorized, reply_to_doc.discussion_reply,
366        "%s's reply" % u, "text of '%s' reply" % u)
367
368
369class TestModerationAnonymComm(TestCommBase, TestMixinAnonymOn,
370                               TestMixinModerationOn):
371
372    def afterSetUp(self):
373        TestCommBase.afterSetUp(self)
374
375        # Preparation for functional testing
376        # Tern On Moderation and tern on Anonymous commenting
377        self.request.form['enable_anonymous_commenting'] = 'True'
378        self.request.form['enable_moderation'] = 'True'
379        self.portal.prefs_comments_setup()
380
381        # Initialize base classes
382        TestMixinAnonymOn.afterSetUp(self)
383        TestMixinModerationOn.afterSetUp(self)
384
385
386class TestModerationOFFAnonymComm(TestCommBase, TestMixinAnonymOff,
387                                  TestMixinModerationOn):
388
389    def afterSetUp(self):
390        TestCommBase.afterSetUp(self)
391
392        # Preparation for functional testing
393        # Tern On Moderation and tern off Anonymous commenting
394        self.request.form['enable_moderation'] = 'True'
395        self.portal.prefs_comments_setup()
396
397        # Initialize base classes
398        TestMixinAnonymOff.afterSetUp(self)
399        TestMixinModerationOn.afterSetUp(self)
400
401
402class TestAnonymCommOFFModeration(TestCommBase, TestMixinAnonymOn,
403                                  TestMixinModerationOff):
404
405    def afterSetUp(self):
406        TestCommBase.afterSetUp(self)
407
408        # Preparation for functional testing
409        # Tern On Anonymous commenting and tern off  Moderation
410        self.request.form['enable_anonymous_commenting'] = 'True'
411        self.portal.prefs_comments_setup()
412
413        # Initialize base classes
414        TestMixinAnonymOn.afterSetUp(self)
415        TestMixinModerationOff.afterSetUp(self)
416
417
418class TestOFFModerationOFFAnonymComm(TestCommBase, TestMixinAnonymOff,
419                                     TestMixinModerationOff):
420
421    def afterSetUp(self):
422        TestCommBase.afterSetUp(self)
423
424        # Preparation for functional testing
425        # Tern Off Moderation and tern off Anonymous commenting
426        self.portal.prefs_comments_setup()
427
428        # Initialize base classes
429        TestMixinAnonymOff.afterSetUp(self)
430        TestMixinModerationOff.afterSetUp(self)
431
432
433def test_suite():
434    from unittest import TestSuite, makeSuite
435    suite = TestSuite()
436    suite.addTest(makeSuite(TestModerationAnonymComm))
437    suite.addTest(makeSuite(TestModerationOFFAnonymComm))
438    suite.addTest(makeSuite(TestAnonymCommOFFModeration))
439    suite.addTest(makeSuite(TestOFFModerationOFFAnonymComm))
440
441    return suite
Note: See TracBrowser for help on using the repository browser.