2010-09-16 16:58:11 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
2009-06-18 22:57:47 +02:00
|
|
|
import unittest
|
2009-12-19 16:03:12 +01:00
|
|
|
|
|
|
|
from DateTime import DateTime
|
2009-06-18 22:57:47 +02:00
|
|
|
|
|
|
|
from zope.component import createObject
|
|
|
|
|
|
|
|
from Products.CMFCore.utils import getToolByName
|
|
|
|
from Products.PloneTestCase.ptc import PloneTestCase
|
|
|
|
|
|
|
|
from plone.app.discussion.browser.moderation import View
|
2010-09-16 16:58:11 +02:00
|
|
|
from plone.app.discussion.browser.moderation import BulkActionsView
|
2010-07-13 12:45:53 +02:00
|
|
|
from plone.app.discussion.interfaces import IConversation
|
2009-06-18 22:57:47 +02:00
|
|
|
from plone.app.discussion.tests.layer import DiscussionLayer
|
|
|
|
|
|
|
|
|
|
|
|
class ModerationViewTest(PloneTestCase):
|
|
|
|
|
|
|
|
layer = DiscussionLayer
|
|
|
|
|
|
|
|
def afterSetUp(self):
|
|
|
|
self.loginAsPortalOwner()
|
|
|
|
typetool = self.portal.portal_types
|
|
|
|
typetool.constructContent('Document', self.portal, 'doc1')
|
2009-12-19 16:03:12 +01:00
|
|
|
|
2009-10-18 15:12:52 +02:00
|
|
|
self.portal_discussion = getToolByName(self.portal,
|
|
|
|
'portal_discussion',
|
|
|
|
None)
|
|
|
|
self.membership_tool = getToolByName(self.folder,
|
|
|
|
'portal_membership')
|
2009-06-18 22:57:47 +02:00
|
|
|
self.memberdata = self.portal.portal_memberdata
|
|
|
|
request = self.app.REQUEST
|
|
|
|
context = getattr(self.portal, 'doc1')
|
|
|
|
self.view = View(context, request)
|
2010-01-22 17:28:00 +01:00
|
|
|
self.view.__of__(context)
|
2009-10-18 15:12:52 +02:00
|
|
|
self.portal.portal_workflow.setChainForPortalTypes(
|
|
|
|
('Discussion Item',), 'comment_review_workflow')
|
2009-06-27 11:35:52 +02:00
|
|
|
self.wf_tool = self.portal.portal_workflow
|
2009-06-18 22:57:47 +02:00
|
|
|
|
2009-06-27 11:35:52 +02:00
|
|
|
# Add a conversation with three comments
|
2009-06-18 22:57:47 +02:00
|
|
|
|
|
|
|
conversation = IConversation(self.portal.doc1)
|
|
|
|
|
2009-06-27 11:35:52 +02:00
|
|
|
comment1 = createObject('plone.Comment')
|
|
|
|
comment1.title = 'Comment 1'
|
|
|
|
comment1.text = 'Comment text'
|
|
|
|
comment1.Creator = 'Jim'
|
|
|
|
new_id_1 = conversation.addComment(comment1)
|
2009-10-18 15:12:52 +02:00
|
|
|
self.comment1 = self.portal.doc1.restrictedTraverse(\
|
|
|
|
'++conversation++default/%s' % new_id_1)
|
2009-06-27 11:35:52 +02:00
|
|
|
|
|
|
|
comment2 = createObject('plone.Comment')
|
|
|
|
comment2.title = 'Comment 2'
|
|
|
|
comment2.text = 'Comment text'
|
|
|
|
comment2.Creator = 'Joe'
|
|
|
|
new_id_2 = conversation.addComment(comment2)
|
2009-10-18 15:12:52 +02:00
|
|
|
self.comment2 = self.portal.doc1.restrictedTraverse(\
|
|
|
|
'++conversation++default/%s' % new_id_2)
|
2009-06-27 11:35:52 +02:00
|
|
|
|
|
|
|
comment3 = createObject('plone.Comment')
|
|
|
|
comment3.title = 'Comment 3'
|
|
|
|
comment3.text = 'Comment text'
|
|
|
|
comment3.Creator = 'Emma'
|
|
|
|
new_id_3 = conversation.addComment(comment3)
|
2009-10-18 15:12:52 +02:00
|
|
|
self.comment3 = self.portal.doc1.restrictedTraverse(\
|
|
|
|
'++conversation++default/%s' % new_id_3)
|
|
|
|
|
|
|
|
def test_moderation_enabled(self):
|
2010-10-08 12:22:40 +02:00
|
|
|
"""Make sure that moderation_enabled returns true if the comment
|
|
|
|
workflow implements a 'pending' state.
|
|
|
|
"""
|
|
|
|
# The one_state_workflow does not have a 'pending' state
|
2009-10-18 15:12:52 +02:00
|
|
|
self.wf_tool.setChainForPortalTypes(('Discussion Item',),
|
2010-10-08 12:22:40 +02:00
|
|
|
('one_state_workflow,'))
|
2009-10-18 15:12:52 +02:00
|
|
|
self.assertEquals(self.view.moderation_enabled(), False)
|
2010-10-08 12:22:40 +02:00
|
|
|
# The comment_review_workflow does have a 'pending' state
|
|
|
|
self.wf_tool.setChainForPortalTypes(('Discussion Item',),
|
|
|
|
('comment_review_workflow,'))
|
|
|
|
self.assertEquals(self.view.moderation_enabled(), True)
|
2009-06-27 11:35:52 +02:00
|
|
|
|
2009-12-19 16:03:12 +01:00
|
|
|
def test_old_comments_not_shown_in_moderation_view(self):
|
|
|
|
# Create an old comment and make sure it is not shown
|
|
|
|
# in the moderation view.
|
|
|
|
|
|
|
|
# Create old comment
|
|
|
|
discussion = getToolByName(self.portal, 'portal_discussion', None)
|
|
|
|
discussion.overrideDiscussionFor(self.portal.doc1, 1)
|
|
|
|
talkback = discussion.getDiscussionFor(self.portal.doc1)
|
|
|
|
self.portal.doc1.talkback.createReply('My Title', 'My Text', Creator='Jim')
|
|
|
|
reply = talkback.getReplies()[0]
|
|
|
|
reply.setReplyTo(self.portal.doc1)
|
|
|
|
reply.creation_date = DateTime(2003, 3, 11, 9, 28, 6)
|
|
|
|
reply.modification_date = DateTime(2009, 7, 12, 19, 38, 7)
|
|
|
|
self.assertEquals(reply.Title(), 'My Title')
|
|
|
|
self.assertEquals(reply.EditableBody(), 'My Text')
|
|
|
|
self.failUnless('Jim' in reply.listCreators())
|
|
|
|
self.assertEquals(talkback.replyCount(self.portal.doc1), 1)
|
|
|
|
self.assertEquals(reply.inReplyTo(), self.portal.doc1)
|
|
|
|
|
|
|
|
# Make sure only the two new comments are shown
|
|
|
|
self.view()
|
|
|
|
self.assertEquals(len(self.view.comments), 3)
|
2009-06-18 22:57:47 +02:00
|
|
|
|
2010-09-16 16:58:11 +02:00
|
|
|
|
|
|
|
class ModerationBulkActionsViewTest(PloneTestCase):
|
|
|
|
|
|
|
|
layer = DiscussionLayer
|
|
|
|
|
|
|
|
def afterSetUp(self):
|
|
|
|
self.loginAsPortalOwner()
|
|
|
|
typetool = self.portal.portal_types
|
|
|
|
typetool.constructContent('Document', self.portal, 'doc1')
|
2010-09-16 17:12:59 +02:00
|
|
|
self.wf = getToolByName(self.portal,
|
|
|
|
'portal_workflow',
|
|
|
|
None)
|
2010-09-16 16:58:11 +02:00
|
|
|
|
|
|
|
self.request = self.app.REQUEST
|
|
|
|
self.context = self.portal
|
|
|
|
self.portal.portal_workflow.setChainForPortalTypes(
|
|
|
|
('Discussion Item',), 'comment_review_workflow')
|
|
|
|
self.wf_tool = self.portal.portal_workflow
|
|
|
|
|
|
|
|
# Add a conversation with three comments
|
|
|
|
|
|
|
|
conversation = IConversation(self.portal.doc1)
|
|
|
|
|
|
|
|
comment1 = createObject('plone.Comment')
|
|
|
|
comment1.title = 'Comment 1'
|
|
|
|
comment1.text = 'Comment text'
|
|
|
|
comment1.Creator = 'Jim'
|
|
|
|
new_id_1 = conversation.addComment(comment1)
|
|
|
|
self.comment1 = self.portal.doc1.restrictedTraverse(\
|
|
|
|
'++conversation++default/%s' % new_id_1)
|
|
|
|
|
|
|
|
comment2 = createObject('plone.Comment')
|
|
|
|
comment2.title = 'Comment 2'
|
|
|
|
comment2.text = 'Comment text'
|
|
|
|
comment2.Creator = 'Joe'
|
|
|
|
new_id_2 = conversation.addComment(comment2)
|
|
|
|
self.comment2 = self.portal.doc1.restrictedTraverse(\
|
|
|
|
'++conversation++default/%s' % new_id_2)
|
|
|
|
|
|
|
|
comment3 = createObject('plone.Comment')
|
|
|
|
comment3.title = 'Comment 3'
|
|
|
|
comment3.text = 'Comment text'
|
|
|
|
comment3.Creator = 'Emma'
|
|
|
|
new_id_3 = conversation.addComment(comment3)
|
|
|
|
self.comment3 = self.portal.doc1.restrictedTraverse(\
|
|
|
|
'++conversation++default/%s' % new_id_3)
|
|
|
|
|
|
|
|
self.conversation = conversation
|
2010-09-16 17:42:27 +02:00
|
|
|
|
|
|
|
def test_default_bulkaction(self):
|
2010-09-16 17:44:07 +02:00
|
|
|
# Make sure no error is raised when no bulk actions has been supplied
|
2010-09-16 17:42:27 +02:00
|
|
|
self.request = self.app.REQUEST
|
|
|
|
self.context = self.portal
|
|
|
|
self.request.set('form.select.BulkAction', '-1')
|
2010-09-18 19:02:37 +02:00
|
|
|
self.request.set('paths', ['/'.join(self.comment1.getPhysicalPath())])
|
2010-09-16 17:42:27 +02:00
|
|
|
view = BulkActionsView(self.context, self.request)
|
|
|
|
self.failIf(view())
|
|
|
|
|
2010-09-16 16:58:11 +02:00
|
|
|
def test_retract(self):
|
|
|
|
self.request = self.app.REQUEST
|
|
|
|
self.context = self.portal
|
|
|
|
self.request.set('form.select.BulkAction', 'retract')
|
2010-09-18 19:02:37 +02:00
|
|
|
self.request.set('paths', ['/'.join(self.comment1.getPhysicalPath())])
|
2010-09-16 16:58:11 +02:00
|
|
|
view = BulkActionsView(self.context, self.request)
|
|
|
|
|
|
|
|
self.assertRaises(NotImplementedError,
|
2010-09-18 19:02:37 +02:00
|
|
|
view)
|
2010-09-16 16:58:11 +02:00
|
|
|
|
|
|
|
def test_publish(self):
|
|
|
|
self.request = self.app.REQUEST
|
|
|
|
self.context = self.portal
|
|
|
|
self.request.set('form.select.BulkAction', 'publish')
|
2010-09-18 19:02:37 +02:00
|
|
|
self.request.set('paths', ['/'.join(self.comment1.getPhysicalPath())])
|
2010-09-16 16:58:11 +02:00
|
|
|
view = BulkActionsView(self.context, self.request)
|
2010-09-16 17:12:59 +02:00
|
|
|
view()
|
|
|
|
|
|
|
|
# Count published comments
|
|
|
|
published_comments = 0
|
|
|
|
for r in self.conversation.getThreads():
|
|
|
|
comment_obj = r['comment']
|
|
|
|
workflow_status = self.wf.getInfoFor(comment_obj, 'review_state')
|
|
|
|
if workflow_status == 'published':
|
|
|
|
published_comments += 1
|
|
|
|
|
2010-09-16 17:42:27 +02:00
|
|
|
# Make sure the comment has been published
|
2010-09-16 17:12:59 +02:00
|
|
|
self.assertEquals(published_comments, 1)
|
|
|
|
|
2010-09-16 16:58:11 +02:00
|
|
|
def test_mark_as_spam(self):
|
|
|
|
self.request = self.app.REQUEST
|
|
|
|
self.context = self.portal
|
|
|
|
self.request.set('form.select.BulkAction', 'mark_as_spam')
|
2010-09-18 19:02:37 +02:00
|
|
|
self.request.set('paths', ['/'.join(self.comment1.getPhysicalPath())])
|
2010-09-16 16:58:11 +02:00
|
|
|
view = BulkActionsView(self.context, self.request)
|
|
|
|
|
|
|
|
self.assertRaises(NotImplementedError,
|
2010-09-18 19:02:37 +02:00
|
|
|
view)
|
2010-09-16 16:58:11 +02:00
|
|
|
|
|
|
|
def test_delete(self):
|
|
|
|
self.request = self.app.REQUEST
|
|
|
|
self.context = self.app
|
|
|
|
|
|
|
|
# Initially we have three comments
|
|
|
|
self.assertEquals(self.conversation.total_comments, 3)
|
|
|
|
|
|
|
|
# Delete two comments with bulk actions
|
|
|
|
self.request.set('form.select.BulkAction', 'delete')
|
|
|
|
self.request.set('paths', ['/'.join(self.comment1.getPhysicalPath()),
|
|
|
|
'/'.join(self.comment3.getPhysicalPath())])
|
|
|
|
view = BulkActionsView(self.context, self.request)
|
|
|
|
view()
|
|
|
|
|
|
|
|
# Make sure that the two comments have been deleted
|
|
|
|
self.assertEquals(self.conversation.total_comments, 1)
|
|
|
|
comment = self.conversation.getComments().next()
|
|
|
|
self.failUnless(comment)
|
2010-10-31 12:09:32 +01:00
|
|
|
self.assertEquals(comment, self.comment2)
|
2010-09-16 16:58:11 +02:00
|
|
|
|
2009-06-18 22:57:47 +02:00
|
|
|
def test_suite():
|
2010-09-16 16:58:11 +02:00
|
|
|
return unittest.defaultTestLoader.loadTestsFromName(__name__)
|