alfresco-community-repo/source/java/org/alfresco/repo/discussion/DiscussionServiceImplTest.java
Derek Hulley e4cd0465bb Merged DEV to HEAD
52182: MT: Remove some unused code and add @Override for DAO methods
   52183: ALF-19172: Disable sys:undeletable aspect while deleting test's tenants
   52274: Allow post-test tenant deletion by implementing hacks against ALF-19155


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@52284 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2013-07-09 13:45:58 +00:00

1992 lines
93 KiB
Java

/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.discussion;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.model.ForumModel;
import org.alfresco.query.PagingRequest;
import org.alfresco.query.PagingResults;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.site.SiteModel;
import org.alfresco.repo.tenant.TenantAdminService;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.discussion.DiscussionService;
import org.alfresco.service.cmr.discussion.PostInfo;
import org.alfresco.service.cmr.discussion.PostWithReplies;
import org.alfresco.service.cmr.discussion.TopicInfo;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.MutableAuthenticationService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.cmr.tagging.TaggingService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ApplicationContextHelper;
import org.alfresco.util.Pair;
import org.alfresco.util.PropertyMap;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
/**
* Test cases for {@link DiscussionServiceImpl}.
*
* @author Nick Burch
* @since 4.0
*/
public class DiscussionServiceImplTest
{
private static final String TEST_SITE_PREFIX = "DiscussionsSiteTest";
private static final long ONE_DAY_MS = 24*60*60*1000;
private static final ApplicationContext testContext = ApplicationContextHelper.getApplicationContext();
// injected services
private static MutableAuthenticationService AUTHENTICATION_SERVICE;
private static BehaviourFilter BEHAVIOUR_FILTER;
private static DiscussionService DISCUSSION_SERVICE;
private static NodeService NODE_SERVICE;
private static NodeService PUBLIC_NODE_SERVICE;
private static PersonService PERSON_SERVICE;
private static RetryingTransactionHelper TRANSACTION_HELPER;
private static PermissionService PERMISSION_SERVICE;
private static SiteService SITE_SERVICE;
private static TaggingService TAGGING_SERVICE;
private static TenantAdminService TENANT_ADMIN_SERVICE;
private static final String TENANT_DOMAIN = (DiscussionServiceImplTest.class.getSimpleName() + "Tenant").toLowerCase();
private static final String TEST_USER = DiscussionServiceImplTest.class.getSimpleName() + "_testuser@" + TENANT_DOMAIN;
private static final String ADMIN_USER = AuthenticationUtil.getAdminUserName() + "@" + TENANT_DOMAIN;
private static SiteInfo DISCUSSION_SITE;
private static SiteInfo ALTERNATE_DISCUSSION_SITE;
private static NodeRef FORUM_NODE;
/**
* Temporary test nodes (created during a test method) that need deletion after the test method.
*/
private List<NodeRef> testNodesToTidy = new ArrayList<NodeRef>();
/**
* Temporary test nodes (created BeforeClass) that need deletion after this test class.
*/
private static List<NodeRef> CLASS_TEST_NODES_TO_TIDY = new ArrayList<NodeRef>();
@BeforeClass public static void initTestsContext() throws Exception
{
AUTHENTICATION_SERVICE = (MutableAuthenticationService)testContext.getBean("authenticationService");
BEHAVIOUR_FILTER = (BehaviourFilter)testContext.getBean("policyBehaviourFilter");
DISCUSSION_SERVICE = (DiscussionService)testContext.getBean("DiscussionService");
NODE_SERVICE = (NodeService)testContext.getBean("nodeService");
PUBLIC_NODE_SERVICE = (NodeService)testContext.getBean("NodeService");
PERSON_SERVICE = (PersonService)testContext.getBean("personService");
TRANSACTION_HELPER = (RetryingTransactionHelper)testContext.getBean("retryingTransactionHelper");
PERMISSION_SERVICE = (PermissionService)testContext.getBean("permissionService");
SITE_SERVICE = (SiteService)testContext.getBean("SiteService");
TAGGING_SERVICE = (TaggingService)testContext.getBean("TaggingService");
TENANT_ADMIN_SERVICE = testContext.getBean("tenantAdminService", TenantAdminService.class);
createTenant();
// Do the setup as admin
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
createUser(TEST_USER);
// We need to create the test site as the test user so that they can contribute content to it in tests below.
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
createTestSites();
}
@Test public void createNewTopic() throws Exception
{
TopicInfo siteTopic;
TopicInfo nodeTopic;
// Nothing to start with
PagingResults<TopicInfo> results =
DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, new PagingRequest(10));
assertEquals(0, results.getPage().size());
results = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, new PagingRequest(10));
assertEquals(0, results.getPage().size());
// Get with an arbitrary name gives nothing
siteTopic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), "madeUp");
assertEquals(null, siteTopic);
siteTopic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), "madeUp2");
assertEquals(null, siteTopic);
siteTopic = DISCUSSION_SERVICE.getTopic(FORUM_NODE, "madeUp");
assertEquals(null, siteTopic);
siteTopic = DISCUSSION_SERVICE.getTopic(FORUM_NODE, "madeUp2");
assertEquals(null, siteTopic);
// Create a topic on the site
siteTopic = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "Site Title");
// Ensure it got a noderef, and the correct site
assertNotNull(siteTopic.getNodeRef());
assertNotNull(siteTopic.getSystemName());
NodeRef container = NODE_SERVICE.getPrimaryParent(siteTopic.getNodeRef()).getParentRef();
NodeRef site = NODE_SERVICE.getPrimaryParent(container).getParentRef();
assertEquals(DISCUSSION_SITE.getNodeRef(), site);
// Check the details on the object
assertEquals("Site Title", siteTopic.getTitle());
assertEquals(ADMIN_USER, siteTopic.getCreator());
assertEquals(0, siteTopic.getTags().size());
// Fetch it, and check the details
siteTopic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), siteTopic.getSystemName());
assertEquals("Site Title", siteTopic.getTitle());
assertEquals(ADMIN_USER, siteTopic.getCreator());
assertEquals(0, siteTopic.getTags().size());
// Now create one with on the forum
nodeTopic = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "Node Title");
assertNotNull(nodeTopic.getNodeRef());
assertNotNull(nodeTopic.getSystemName());
// Check it went in the right place
assertEquals(FORUM_NODE, NODE_SERVICE.getPrimaryParent(nodeTopic.getNodeRef()).getParentRef());
// Check the details
assertEquals("Node Title", nodeTopic.getTitle());
assertEquals(ADMIN_USER, nodeTopic.getCreator());
assertEquals(0, siteTopic.getTags().size());
// Fetch and re-check
nodeTopic = DISCUSSION_SERVICE.getTopic(FORUM_NODE, nodeTopic.getSystemName());
assertEquals("Node Title", nodeTopic.getTitle());
assertEquals(ADMIN_USER, nodeTopic.getCreator());
assertEquals(0, siteTopic.getTags().size());
// Mark them as done with
testNodesToTidy.add(siteTopic.getNodeRef());
testNodesToTidy.add(nodeTopic.getNodeRef());
}
@Test public void createNewTopicAndPostAndReply() throws Exception
{
TopicInfo siteTopic;
TopicInfo nodeTopic;
PostInfo post;
PostInfo reply1;
PostInfo reply2;
Pair<TopicInfo,PostInfo> objects;
// Nothing to start with
PagingResults<TopicInfo> results =
DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, new PagingRequest(10));
assertEquals(0, results.getPage().size());
results = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, new PagingRequest(10));
assertEquals(0, results.getPage().size());
// Create two topics, one node and one site based
siteTopic = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "Site Title");
nodeTopic = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "Node Title");
testNodesToTidy.add(siteTopic.getNodeRef());
testNodesToTidy.add(nodeTopic.getNodeRef());
// Check these actions in turn
for (TopicInfo topic : new TopicInfo[] {siteTopic, nodeTopic})
{
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
// There are no posts to start with
PagingResults<PostInfo> posts =
DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(0, posts.getPage().size());
// The topic has no primary post
assertEquals(null, DISCUSSION_SERVICE.getPrimaryPost(topic));
// Which means no recent post
assertEquals(null, DISCUSSION_SERVICE.getMostRecentPost(topic));
// Get with an arbitrary name gives nothing
post = DISCUSSION_SERVICE.getPost(topic, "madeUp");
assertEquals(null, post);
post = DISCUSSION_SERVICE.getPost(topic, "madeUp2");
assertEquals(null, post);
// Create the first post
String contents = "This Is Some Content";
post = DISCUSSION_SERVICE.createPost(topic, contents);
// Ensure it got a NodeRef, a Name and the Topic
assertNotNull(post.getNodeRef());
assertNotNull(post.getSystemName());
assertEquals(topic, post.getTopic());
// Ensure it shares a name with the topic
assertEquals(topic.getSystemName(), post.getSystemName());
// As this is the primary post, it'll share the topic title
assertEquals(topic.getTitle(), post.getTitle());
// It will have contents and a creator
assertEquals(contents, post.getContents());
assertEquals(ADMIN_USER, post.getCreator());
// Fetch and check
post = DISCUSSION_SERVICE.getPost(topic, post.getSystemName());
assertNotNull(post.getNodeRef());
assertNotNull(post.getSystemName());
assertEquals(topic, post.getTopic());
assertEquals(topic.getTitle(), post.getTitle());
assertEquals(contents, post.getContents());
assertEquals(ADMIN_USER, post.getCreator());
// Topic will now have a primary post
assertNotNull(DISCUSSION_SERVICE.getPrimaryPost(topic));
assertEquals(post.getNodeRef(), DISCUSSION_SERVICE.getPrimaryPost(topic).getNodeRef());
// The new post will be the most recent one
assertNotNull(DISCUSSION_SERVICE.getMostRecentPost(topic));
assertEquals(post.getNodeRef(), DISCUSSION_SERVICE.getMostRecentPost(topic).getNodeRef());
// Topic will now have one post listed
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(1, posts.getPage().size());
// Add a reply
String reply1Contents = "Reply Contents";
reply1 = DISCUSSION_SERVICE.createReply(post, reply1Contents);
assertNotNull(reply1.getNodeRef());
assertNotNull(reply1.getSystemName());
assertEquals(topic, reply1.getTopic());
assertEquals(null, reply1.getTitle()); // No title by default for replies
assertEquals(reply1Contents, reply1.getContents());
assertEquals(ADMIN_USER, reply1.getCreator());
// Fetch and check
reply1 = DISCUSSION_SERVICE.getPost(topic, reply1.getSystemName());
assertNotNull(reply1.getNodeRef());
assertNotNull(reply1.getSystemName());
assertEquals(topic, reply1.getTopic());
assertEquals(null, reply1.getTitle()); // No title by default for replies
assertEquals(reply1Contents, reply1.getContents());
assertEquals(ADMIN_USER, reply1.getCreator());
// Create another reply, as a different user
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
String reply2Contents = "2Reply 2Contents";
reply2 = DISCUSSION_SERVICE.createReply(post, reply2Contents);
assertNotNull(reply2.getNodeRef());
assertNotNull(reply2.getSystemName());
assertEquals(topic, reply2.getTopic());
assertEquals(null, reply2.getTitle()); // No title by default for replies
assertEquals(reply2Contents, reply2.getContents());
assertEquals(TEST_USER, reply2.getCreator());
// Fetch and check
reply2 = DISCUSSION_SERVICE.getPost(topic, reply2.getSystemName());
assertNotNull(reply2.getNodeRef());
assertNotNull(reply2.getSystemName());
assertEquals(topic, reply2.getTopic());
assertEquals(null, reply2.getTitle()); // No title by default for replies
assertEquals(reply2Contents, reply2.getContents());
assertEquals(TEST_USER, reply2.getCreator());
// Ensure that by noderef, we get the correct things
objects = DISCUSSION_SERVICE.getForNodeRef(FORUM_NODE);
assertEquals(null, objects);
objects = DISCUSSION_SERVICE.getForNodeRef(topic.getNodeRef());
assertNotNull(objects);
assertEquals(topic.getNodeRef(), objects.getFirst().getNodeRef());
assertEquals(null, objects.getSecond());
objects = DISCUSSION_SERVICE.getForNodeRef(post.getNodeRef());
assertNotNull(objects);
assertEquals(topic.getNodeRef(), objects.getFirst().getNodeRef());
assertEquals(post.getNodeRef(), objects.getSecond().getNodeRef());
objects = DISCUSSION_SERVICE.getForNodeRef(reply1.getNodeRef());
assertNotNull(objects);
assertEquals(topic.getNodeRef(), objects.getFirst().getNodeRef());
assertEquals(reply1.getNodeRef(), objects.getSecond().getNodeRef());
// The primary post will be unchanged
assertNotNull(DISCUSSION_SERVICE.getPrimaryPost(topic));
assertEquals(post.getNodeRef(), DISCUSSION_SERVICE.getPrimaryPost(topic).getNodeRef());
// But the most recent will be the newest reply
assertNotNull(DISCUSSION_SERVICE.getMostRecentPost(topic));
assertEquals(reply2.getNodeRef(), DISCUSSION_SERVICE.getMostRecentPost(topic).getNodeRef());
// Check the overall count now
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(3, posts.getPage().size());
}
}
@Test public void createUpdateDeleteEntries() throws Exception
{
TopicInfo siteTopic;
TopicInfo siteTopic2;
TopicInfo nodeTopic;
PostInfo post;
PostInfo reply;
// Run as the test user instead
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
// Create two topics
siteTopic = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "Site Title");
nodeTopic = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "Node Title");
testNodesToTidy.add(siteTopic.getNodeRef());
testNodesToTidy.add(nodeTopic.getNodeRef());
// Create a second object with the same topic as siteTopic to test equals.
siteTopic2 = DISCUSSION_SERVICE.getForNodeRef(siteTopic.getNodeRef()).getFirst();
// Check them
assertEquals("Site Title", siteTopic.getTitle());
assertEquals(TEST_USER, siteTopic.getCreator());
assertEquals(0, siteTopic.getTags().size());
assertEquals("Node Title", nodeTopic.getTitle());
assertEquals(TEST_USER, nodeTopic.getCreator());
assertEquals(0, nodeTopic.getTags().size());
// Check that the overridden equals is correct.
assertEquals(siteTopic, siteTopic2);
// Ensure they are not pointing to the same object.
assertNotSame(siteTopic, siteTopic2);
// Change them
siteTopic.setTitle("Site Changed");
nodeTopic.setTitle("Node Changed");
siteTopic = DISCUSSION_SERVICE.updateTopic(siteTopic);
nodeTopic = DISCUSSION_SERVICE.updateTopic(nodeTopic);
// Fetch, and check
siteTopic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), siteTopic.getSystemName());
nodeTopic = DISCUSSION_SERVICE.getTopic(FORUM_NODE, nodeTopic.getSystemName());
assertEquals("Site Changed", siteTopic.getTitle());
assertEquals(TEST_USER, siteTopic.getCreator());
assertEquals(0, siteTopic.getTags().size());
assertEquals("Node Changed", nodeTopic.getTitle());
assertEquals(TEST_USER, nodeTopic.getCreator());
assertEquals(0, nodeTopic.getTags().size());
// For each, create and edit some posts
for (TopicInfo topic : new TopicInfo[] {siteTopic, nodeTopic})
{
// Create a post and a reply
String contents = "This Is Some Content";
post = DISCUSSION_SERVICE.createPost(topic, contents);
String replyContents = "Reply Contents";
reply = DISCUSSION_SERVICE.createReply(post, replyContents);
// Check them
assertEquals(topic.getTitle(), post.getTitle());
assertEquals(contents, post.getContents());
assertEquals(null, post.getUpdatedAt());
assertEquals(null, reply.getTitle());
assertEquals(replyContents, reply.getContents());
assertEquals(null, reply.getUpdatedAt());
// Fetch and re-check
post = DISCUSSION_SERVICE.getPost(topic, post.getSystemName());
reply = DISCUSSION_SERVICE.getPost(topic, reply.getSystemName());
assertEquals(topic.getTitle(), post.getTitle());
assertEquals(contents, post.getContents());
assertEquals(null, post.getUpdatedAt());
assertEquals(null, reply.getTitle());
assertEquals(replyContents, reply.getContents());
assertEquals(null, reply.getUpdatedAt());
// Edit them
String pTitle = "Title on the Post";
String rTitle = "Title on the Reply";
String pContents = "Changed! Changed!";
String rContents = "Reply was changed...";
post.setTitle(pTitle);
post.setContents(pContents);
reply.setTitle(rTitle);
reply.setContents(rContents);
post = DISCUSSION_SERVICE.updatePost(post);
reply = DISCUSSION_SERVICE.updatePost(reply);
assertEquals(pTitle, post.getTitle());
assertEquals(pContents, post.getContents());
assertEquals(rTitle, reply.getTitle());
assertEquals(rContents, reply.getContents());
// Check that the modified and updated dates were set
assertNotNull(post.getUpdatedAt());
assertNotNull(post.getModifiedAt());
assertNotNull(reply.getUpdatedAt());
assertNotNull(reply.getModifiedAt());
// Check the changes were taken
post = DISCUSSION_SERVICE.getPost(topic, post.getSystemName());
reply = DISCUSSION_SERVICE.getPost(topic, reply.getSystemName());
assertEquals(pTitle, post.getTitle());
assertEquals(pContents, post.getContents());
assertEquals(rTitle, reply.getTitle());
assertEquals(rContents, reply.getContents());
// Check that the modified and updated dates were set
assertNotNull(post.getUpdatedAt());
assertNotNull(post.getModifiedAt());
assertNotNull(reply.getUpdatedAt());
assertNotNull(reply.getModifiedAt());
// Remove the title from the topic manually
String oldTitle = topic.getTitle();
PUBLIC_NODE_SERVICE.setProperty(topic.getNodeRef(), ContentModel.PROP_TITLE, null);
// Check that we pick it up from the primary post instead
// (That's the pre-swift Share fallback case)
assertEquals(oldTitle, topic.getTitle());
topic = DISCUSSION_SERVICE.getTopic(topic.getContainerNodeRef(), topic.getSystemName());
assertEquals(pTitle, topic.getTitle());
// Delete the reply and the post
DISCUSSION_SERVICE.deletePost(reply);
DISCUSSION_SERVICE.deletePost(post);
// Check they went
post = DISCUSSION_SERVICE.getPost(topic, post.getSystemName());
reply = DISCUSSION_SERVICE.getPost(topic, reply.getSystemName());
assertEquals(null, post);
assertEquals(null, reply);
}
// Delete the topics
DISCUSSION_SERVICE.deleteTopic(siteTopic);
DISCUSSION_SERVICE.deleteTopic(nodeTopic);
// Check they went
siteTopic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), siteTopic.getSystemName());
nodeTopic = DISCUSSION_SERVICE.getTopic(FORUM_NODE, nodeTopic.getSystemName());
assertEquals(null, siteTopic);
assertEquals(null, nodeTopic);
}
/**
* Tests listing of topics in a site/node, and posts in a topic
*/
@Test public void basicListings() throws Exception
{
PagingResults<TopicInfo> topics;
PagingResults<PostInfo> posts;
final String TAG_1 = "topic_tag_one";
final String TAG_2 = "topic_tag_two";
// To start with, there will be no topics
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
// Create several, some as Admin and some as the Test User
TopicInfo siteT1 = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "ST1");
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
TopicInfo siteT2 = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "ST2");
TopicInfo nodeT1 = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "NT1");
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
TopicInfo nodeT2 = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "NT2");
TopicInfo nodeT3 = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "NT3");
testNodesToTidy.add(siteT1.getNodeRef());
testNodesToTidy.add(siteT2.getNodeRef());
testNodesToTidy.add(nodeT1.getNodeRef());
testNodesToTidy.add(nodeT2.getNodeRef());
testNodesToTidy.add(nodeT3.getNodeRef());
// Check now, will order by creation date
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
assertEquals("ST2", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT3", topics.getPage().get(2).getTitle());
// And requested newest ones first too
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), false, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
assertEquals("ST1", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, false, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT3", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT1", topics.getPage().get(2).getTitle());
// Check by user
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), ADMIN_USER, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, ADMIN_USER, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
assertEquals("NT3", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), TEST_USER, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, TEST_USER, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
// Check by user, newest first
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), ADMIN_USER, false, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, ADMIN_USER, false, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT3", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), TEST_USER, false, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, TEST_USER, false, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
// Check by created date, everything was just created
Date now = new Date();
Date yesterday = new Date(now.getTime()-ONE_DAY_MS-60000);
Date tomorrow = new Date(now.getTime()+ONE_DAY_MS);
Date future = new Date(now.getTime()+10*ONE_DAY_MS);
Date fourDaysAgo = new Date(now.getTime()-4*ONE_DAY_MS);
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), yesterday, tomorrow, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
assertEquals("ST2", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, yesterday, tomorrow, true, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT3", topics.getPage().get(2).getTitle());
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, yesterday, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, fourDaysAgo, yesterday, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), tomorrow, future, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, tomorrow, future, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
// Now check by created date, newest first
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), yesterday, tomorrow, false, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
assertEquals("ST1", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, yesterday, tomorrow, false, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT3", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT1", topics.getPage().get(2).getTitle());
// Add tags to a few
siteT2.getTags().add(TAG_1);
nodeT2.getTags().add(TAG_1);
nodeT2.getTags().add(TAG_2);
nodeT3.getTags().add(TAG_1);
DISCUSSION_SERVICE.updateTopic(siteT2);
DISCUSSION_SERVICE.updateTopic(nodeT2);
DISCUSSION_SERVICE.updateTopic(nodeT3);
// Find without tags
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), null, null, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
assertEquals("ST2", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, null, null, true, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT3", topics.getPage().get(2).getTitle());
// Find with tags
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), null, TAG_1, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, null, TAG_1, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
assertEquals("NT3", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), null, TAG_2, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, null, TAG_2, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
// Find by user but not by tag
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), ADMIN_USER, null, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, ADMIN_USER, null, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
assertEquals("NT3", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), TEST_USER, null, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, TEST_USER, null, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
// Find by user and tag together
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), ADMIN_USER, TAG_1, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), TEST_USER, TAG_1, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, ADMIN_USER, TAG_2, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, TEST_USER, TAG_2, true, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
// Do a find to check the ordering alters as requested
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, ADMIN_USER, null, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
assertEquals("NT3", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, ADMIN_USER, null, false, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT3", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
// Alter the creation date on a couple, see the ordering change
pushAuditableDatesBack(siteT2, 2, 2);
pushAuditableDatesBack(nodeT3, 3, 3);
pushAuditableDatesBack(nodeT1, 1, 1);
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
assertEquals("ST1", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT3", topics.getPage().get(0).getTitle());
assertEquals("NT1", topics.getPage().get(1).getTitle());
assertEquals("NT2", topics.getPage().get(2).getTitle());
// Try listing by date range
// Only Site1 and Node2 are still created today, Node1 was a day ago
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), yesterday, tomorrow, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, yesterday, tomorrow, true, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, yesterday, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, fourDaysAgo, yesterday, true, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT3", topics.getPage().get(0).getTitle());
// Now create a couple of check posts
PostInfo siteCP1 = DISCUSSION_SERVICE.createPost(siteT2, "Check");
PostInfo nodeCP1 = DISCUSSION_SERVICE.createPost(nodeT2, "Check");
testNodesToTidy.add(siteCP1.getNodeRef());
testNodesToTidy.add(nodeCP1.getNodeRef());
// For both site and node based topics, check adding and
// removing posts correctly affects counts
for (TopicInfo topic : new TopicInfo[] {siteT1, nodeT1})
{
// None to start with
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(0, posts.getPage().size());
// Create one post
PostInfo post = DISCUSSION_SERVICE.createPost(topic, "Post");
assertEquals(post.getNodeRef(), DISCUSSION_SERVICE.getPrimaryPost(topic).getNodeRef());
// Check the count
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(1, posts.getPage().size());
assertEquals("Post", posts.getPage().get(0).getContents());
// Add two replies
PostInfo reply1 = DISCUSSION_SERVICE.createReply(post, "R1");
PostInfo reply2 = DISCUSSION_SERVICE.createReply(post, "R2");
// Check
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(3, posts.getPage().size());
assertEquals("Post", posts.getPage().get(0).getContents());
assertEquals("R1", posts.getPage().get(1).getContents());
assertEquals("R2", posts.getPage().get(2).getContents());
// Alter the date of one, order changes
pushAuditableDatesBack(reply1, -1, -1);
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(3, posts.getPage().size());
assertEquals("Post", posts.getPage().get(0).getContents());
assertEquals("R2", posts.getPage().get(1).getContents());
assertEquals("R1", posts.getPage().get(2).getContents());
// Delete one reply
DISCUSSION_SERVICE.deletePost(reply1);
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(2, posts.getPage().size());
assertEquals("Post", posts.getPage().get(0).getContents());
assertEquals("R2", posts.getPage().get(1).getContents());
// Delete the main post
DISCUSSION_SERVICE.deletePost(post);
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(1, posts.getPage().size());
assertEquals("R2", posts.getPage().get(0).getContents());
// Check the last reply now counts as the "primary"
assertEquals(reply2.getNodeRef(), DISCUSSION_SERVICE.getPrimaryPost(topic).getNodeRef());
// Zap the last one
DISCUSSION_SERVICE.deletePost(reply2);
posts = DISCUSSION_SERVICE.listPosts(topic, new PagingRequest(10));
assertEquals(0, posts.getPage().size());
}
}
/**
* Ensures that the listing / nesting of replies is correct
*/
@Test public void replyListing() throws Exception
{
// Create two sites and test
TopicInfo siteT1 = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "ST1");
TopicInfo nodeT1 = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "NT1");
testNodesToTidy.add(siteT1.getNodeRef());
testNodesToTidy.add(nodeT1.getNodeRef());
for (TopicInfo topic : new TopicInfo[] {siteT1, nodeT1})
{
// Listing initially gives nothing
PostWithReplies pr = DISCUSSION_SERVICE.listPostReplies(topic, 1);
assertEquals(null, pr);
// Add the first post
PostInfo post = DISCUSSION_SERVICE.createPost(topic, "Post");
testNodesToTidy.add(post.getNodeRef());
// Should come back with no replies
pr = DISCUSSION_SERVICE.listPostReplies(topic, 1);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(0, pr.getReplies().size());
// Add two replies
PostInfo reply1 = DISCUSSION_SERVICE.createReply(post, "R1");
PostInfo reply2 = DISCUSSION_SERVICE.createReply(post, "R2");
testNodesToTidy.add(reply1.getNodeRef());
testNodesToTidy.add(reply2.getNodeRef());
// Ask for the replies to the post
pr = DISCUSSION_SERVICE.listPostReplies(topic, 1);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(0, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
// Check at other levels too:
// Level 0 will mean no replies were fetched
pr = DISCUSSION_SERVICE.listPostReplies(topic, 0);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(0, pr.getReplies().size());
// Level 5 won't affect things, as there are only 2
pr = DISCUSSION_SERVICE.listPostReplies(topic, 5);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(0, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
// Add a nesting of replies on only one
PostInfo reply1_1 = DISCUSSION_SERVICE.createReply(reply1, "R1_1");
PostInfo reply1_2 = DISCUSSION_SERVICE.createReply(reply1, "R1_2");
PostInfo reply1_3 = DISCUSSION_SERVICE.createReply(reply1, "R1_3");
PostInfo reply1_2_1 = DISCUSSION_SERVICE.createReply(reply1_2, "R1_2_1");
PostInfo reply1_2_2 = DISCUSSION_SERVICE.createReply(reply1_2, "R1_2_2");
PostInfo reply1_3_1 = DISCUSSION_SERVICE.createReply(reply1_3, "R1_3_1");
PostInfo reply1_3_1_1 = DISCUSSION_SERVICE.createReply(reply1_3_1, "R1_3_1_1");
PostInfo reply1_3_1_1_1 = DISCUSSION_SERVICE.createReply(reply1_3_1_1, "R1_3_1_1_1");
// Mark them for tidy
testNodesToTidy.add(reply1_1.getNodeRef());
testNodesToTidy.add(reply1_2.getNodeRef());
testNodesToTidy.add(reply1_3.getNodeRef());
testNodesToTidy.add(reply1_2_1.getNodeRef());
testNodesToTidy.add(reply1_2_2.getNodeRef());
testNodesToTidy.add(reply1_3_1.getNodeRef());
testNodesToTidy.add(reply1_3_1_1.getNodeRef());
testNodesToTidy.add(reply1_3_1_1_1.getNodeRef());
// Check with various levels:
// Level 0 will get the primary post but no replies
pr = DISCUSSION_SERVICE.listPostReplies(topic, 0);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(0, pr.getReplies().size());
// Level 1 will get the post, it's replies, but nothing further
pr = DISCUSSION_SERVICE.listPostReplies(topic, 1);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(0, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
// Level 1 on the primary post is the same
pr = DISCUSSION_SERVICE.listPostReplies(post, 1);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(0, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
// Level 2 gets the next bit
// Reply 1 has 3 children, Reply 2 has none
pr = DISCUSSION_SERVICE.listPostReplies(topic, 2);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(3, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
assertEquals(reply1_1.getNodeRef(), pr.getReplies().get(0).getReplies().get(0).getNodeRef());
assertEquals(reply1_2.getNodeRef(), pr.getReplies().get(0).getReplies().get(1).getNodeRef());
assertEquals(reply1_3.getNodeRef(), pr.getReplies().get(0).getReplies().get(2).getNodeRef());
assertEquals(0, pr.getReplies().get(0).getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(0).getReplies().get(1).getReplies().size());
assertEquals(0, pr.getReplies().get(0).getReplies().get(2).getReplies().size());
// Level 3 nests further
// Reply 1 has 3 children, 1 has 0, 2 has 2, 3 has 1 but nested
pr = DISCUSSION_SERVICE.listPostReplies(topic, 3);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(3, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
PostWithReplies pr1 = pr.getReplies().get(0);
assertEquals(reply1_1.getNodeRef(), pr1.getReplies().get(0).getNodeRef());
assertEquals(reply1_2.getNodeRef(), pr1.getReplies().get(1).getNodeRef());
assertEquals(reply1_3.getNodeRef(), pr1.getReplies().get(2).getNodeRef());
assertEquals(0, pr1.getReplies().get(0).getReplies().size());
assertEquals(2, pr1.getReplies().get(1).getReplies().size());
assertEquals(1, pr1.getReplies().get(2).getReplies().size());
assertEquals(reply1_2_1.getNodeRef(), pr1.getReplies().get(1).getReplies().get(0).getNodeRef());
assertEquals(reply1_2_2.getNodeRef(), pr1.getReplies().get(1).getReplies().get(1).getNodeRef());
assertEquals(reply1_3_1.getNodeRef(), pr1.getReplies().get(2).getReplies().get(0).getNodeRef());
assertEquals(0, pr1.getReplies().get(1).getReplies().get(0).getReplies().size());
assertEquals(0, pr1.getReplies().get(2).getReplies().get(0).getReplies().size());
// Level 10 gets everything it can (there aren't 10 levels though)
pr = DISCUSSION_SERVICE.listPostReplies(topic, 10);
assertNotNull(pr);
assertEquals(post.getNodeRef(), pr.getNodeRef());
assertEquals(2, pr.getReplies().size());
assertEquals(reply1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(reply2.getNodeRef(), pr.getReplies().get(1).getNodeRef());
assertEquals(3, pr.getReplies().get(0).getReplies().size());
assertEquals(0, pr.getReplies().get(1).getReplies().size());
pr1 = pr.getReplies().get(0);
assertEquals(reply1_1.getNodeRef(), pr1.getReplies().get(0).getNodeRef());
assertEquals(reply1_2.getNodeRef(), pr1.getReplies().get(1).getNodeRef());
assertEquals(reply1_3.getNodeRef(), pr1.getReplies().get(2).getNodeRef());
assertEquals(0, pr1.getReplies().get(0).getReplies().size());
assertEquals(2, pr1.getReplies().get(1).getReplies().size());
assertEquals(1, pr1.getReplies().get(2).getReplies().size());
assertEquals(reply1_2_1.getNodeRef(), pr1.getReplies().get(1).getReplies().get(0).getNodeRef());
assertEquals(reply1_2_2.getNodeRef(), pr1.getReplies().get(1).getReplies().get(1).getNodeRef());
assertEquals(reply1_3_1.getNodeRef(), pr1.getReplies().get(2).getReplies().get(0).getNodeRef());
assertEquals(0, pr1.getReplies().get(1).getReplies().get(0).getReplies().size());
assertEquals(1, pr1.getReplies().get(2).getReplies().get(0).getReplies().size());
PostWithReplies rp1_3_1 = pr1.getReplies().get(2).getReplies().get(0);
assertEquals(reply1_3_1.getNodeRef(), rp1_3_1.getNodeRef());
assertEquals(1, rp1_3_1.getReplies().size());
assertEquals(reply1_3_1_1.getNodeRef(), rp1_3_1.getReplies().get(0).getNodeRef());
assertEquals(1, rp1_3_1.getReplies().get(0).getReplies().size());
assertEquals(reply1_3_1_1_1.getNodeRef(), rp1_3_1.getReplies().get(0).getReplies().get(0).getNodeRef());
assertEquals(0, rp1_3_1.getReplies().get(0).getReplies().get(0).getReplies().size());
// Now check for nodes part way down
pr = DISCUSSION_SERVICE.listPostReplies(reply2, 10);
assertNotNull(pr);
assertEquals(reply2.getNodeRef(), pr.getNodeRef());
assertEquals(0, pr.getReplies().size());
pr = DISCUSSION_SERVICE.listPostReplies(reply1_3_1, 10);
assertNotNull(pr);
assertEquals(reply1_3_1.getNodeRef(), pr.getNodeRef());
assertEquals(1, pr.getReplies().size());
assertEquals(reply1_3_1_1.getNodeRef(), pr.getReplies().get(0).getNodeRef());
assertEquals(1, pr.getReplies().get(0).getReplies().size());
assertEquals(reply1_3_1_1_1.getNodeRef(), pr.getReplies().get(0).getReplies().get(0).getNodeRef());
assertEquals(0, pr.getReplies().get(0).getReplies().get(0).getReplies().size());
}
}
/**
* Ensures that when we try to write an entry to the
* container of a new site, it is correctly setup for us.
* This test does it's own transactions
*/
@Test public void newContainerSetup() throws Exception
{
final String TEST_SITE_NAME = "DiscussionsTestNewTestSite";
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
if (SITE_SERVICE.getSite(TEST_SITE_NAME) != null)
{
SITE_SERVICE.deleteSite(TEST_SITE_NAME);
}
SITE_SERVICE.createSite(
TEST_SITE_PREFIX, TEST_SITE_NAME, "Test", "Test", SiteVisibility.PUBLIC);
// Won't have the container to start with
assertFalse(SITE_SERVICE.hasContainer(TEST_SITE_NAME, DiscussionServiceImpl.DISCUSSION_COMPONENT));
// Create a link
DISCUSSION_SERVICE.createTopic(TEST_SITE_NAME, "Title");
// It will now exist
assertTrue(SITE_SERVICE.hasContainer(TEST_SITE_NAME, DiscussionServiceImpl.DISCUSSION_COMPONENT));
// It'll be a tag scope too
NodeRef container = SITE_SERVICE.getContainer(TEST_SITE_NAME, DiscussionServiceImpl.DISCUSSION_COMPONENT);
assertTrue(TAGGING_SERVICE.isTagScope(container));
// Tidy up
SITE_SERVICE.deleteSite(TEST_SITE_NAME);
return null;
}
});
}
@Test public void tagging() throws Exception
{
TopicInfo topic;
final String TAG_1 = "link_tag_1";
final String TAG_2 = "link_tag_2";
final String TAG_3 = "link_tag_3";
// Create one without tagging
topic = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "Title");
testNodesToTidy.add(topic.getNodeRef());
// Check
assertEquals(0, topic.getTags().size());
topic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), topic.getSystemName());
assertEquals(0, topic.getTags().size());
// Update it to have tags
topic.getTags().add(TAG_1);
topic.getTags().add(TAG_2);
topic.getTags().add(TAG_1);
assertEquals(3, topic.getTags().size());
DISCUSSION_SERVICE.updateTopic(topic);
// Check
topic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), topic.getSystemName());
assertEquals(2, topic.getTags().size());
assertEquals(true, topic.getTags().contains(TAG_1));
assertEquals(true, topic.getTags().contains(TAG_2));
assertEquals(false, topic.getTags().contains(TAG_3));
// Update it to have different tags
topic.getTags().remove(TAG_2);
topic.getTags().add(TAG_3);
topic.getTags().add(TAG_1);
DISCUSSION_SERVICE.updateTopic(topic);
// Check it as-is
assertEquals(3, topic.getTags().size()); // Includes duplicate tag until re-loaded
assertEquals(true, topic.getTags().contains(TAG_1));
assertEquals(false, topic.getTags().contains(TAG_2));
assertEquals(true, topic.getTags().contains(TAG_3));
// Now load and re-check
topic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), topic.getSystemName());
assertEquals(2, topic.getTags().size()); // Duplicate now gone
assertEquals(true, topic.getTags().contains(TAG_1));
assertEquals(false, topic.getTags().contains(TAG_2));
assertEquals(true, topic.getTags().contains(TAG_3));
// Update it to have no tags
topic.getTags().clear();
DISCUSSION_SERVICE.updateTopic(topic);
// Check
topic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), topic.getSystemName());
assertEquals(0, topic.getTags().size());
// Update it to have tags again
topic.getTags().add(TAG_1);
topic.getTags().add(TAG_2);
topic.getTags().add(TAG_3);
DISCUSSION_SERVICE.updateTopic(topic);
// Check
topic = DISCUSSION_SERVICE.getTopic(DISCUSSION_SITE.getShortName(), topic.getSystemName());
assertEquals(3, topic.getTags().size());
assertEquals(true, topic.getTags().contains(TAG_1));
assertEquals(true, topic.getTags().contains(TAG_2));
assertEquals(true, topic.getTags().contains(TAG_3));
// Tidy
DISCUSSION_SERVICE.deleteTopic(topic);
}
/**
* Checks we correctly identify hot topics
*/
@Test public void discussionsHotTopicsListing() throws Exception
{
PagingRequest paging = new PagingRequest(10);
PagingResults<Pair<TopicInfo,Integer>> topics;
Date now = new Date();
Date yesterday = new Date(now.getTime()-ONE_DAY_MS-60000);
Date tomorrow = new Date(now.getTime()+ONE_DAY_MS);
Date future = new Date(now.getTime()+10*ONE_DAY_MS);
Date fourDaysAgo = new Date(now.getTime()-4*ONE_DAY_MS);
// To start with, we have no hot topics
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(0, topics.getPage().size());
// Create some topics
TopicInfo topicSA = DISCUSSION_SERVICE.createTopic(
DISCUSSION_SITE.getShortName(), "Title1A");
TopicInfo topicSB = DISCUSSION_SERVICE.createTopic(
DISCUSSION_SITE.getShortName(), "Title1B");
testNodesToTidy.add(topicSA.getNodeRef());
testNodesToTidy.add(topicSB.getNodeRef());
TopicInfo topicNA = DISCUSSION_SERVICE.createTopic(
FORUM_NODE, "TitleNA");
TopicInfo topicNB = DISCUSSION_SERVICE.createTopic(
FORUM_NODE, "TitleNB");
testNodesToTidy.add(topicNA.getNodeRef());
testNodesToTidy.add(topicNB.getNodeRef());
// These won't show as hot, as they have no posts on them
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(0, topics.getPage().size());
// Add primary posts, this won't help as only replies count
PostInfo postSA = DISCUSSION_SERVICE.createPost(topicSA, "Test S Post");
PostInfo postSB = DISCUSSION_SERVICE.createPost(topicSB, "Test S Post");
PostInfo postNA = DISCUSSION_SERVICE.createPost(topicNA, "Test N Post");
PostInfo postNB = DISCUSSION_SERVICE.createPost(topicNB, "Test N Post");
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(0, topics.getPage().size());
// Add a few replies, topics will begin showing up
PostInfo replySA1 = DISCUSSION_SERVICE.createReply(postSA, "Reply SA 1");
PostInfo replySB1 = DISCUSSION_SERVICE.createReply(postSB, "Reply SB 1");
PostInfo replySB2 = DISCUSSION_SERVICE.createReply(postSB, "Reply SB 2");
PostInfo replySB3 = DISCUSSION_SERVICE.createReply(postSB, "Reply SB 3");
PostInfo replyNA1 = DISCUSSION_SERVICE.createReply(postNA, "Reply NA 1");
PostInfo replyNB1 = DISCUSSION_SERVICE.createReply(postNB, "Reply NB 1");
PostInfo replyNB2 = DISCUSSION_SERVICE.createReply(postNB, "Reply NB 2");
PostInfo replyNB3 = DISCUSSION_SERVICE.createReply(postNB, "Reply NB 3");
PostInfo replyNB4 = DISCUSSION_SERVICE.createReply(postNB, "Reply NB 4");
// Check we now see things as expected, ordered by count
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicSB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(3, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicSA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(1, topics.getPage().get(1).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicNB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(4, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicNA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(1, topics.getPage().get(1).getSecond().intValue());
// Add reply to reply, counts go up
PostInfo replySA1_1 = DISCUSSION_SERVICE.createReply(replySA1, "Reply to a reply");
PostInfo replyNA1_1 = DISCUSSION_SERVICE.createReply(replyNA1, "Reply to a reply");
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicSB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(3, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicSA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(2, topics.getPage().get(1).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicNB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(4, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicNA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(2, topics.getPage().get(1).getSecond().intValue());
// Changing the date of the primary post or the topic makes no difference
pushAuditableDatesBack(topicSA, 11, 1);
pushAuditableDatesBack(topicSB, 12, 2);
pushAuditableDatesBack(topicNA, 13, 3);
pushAuditableDatesBack(topicNB, 14, 4);
pushAuditableDatesBack(postSA, 3, 3);
pushAuditableDatesBack(postNA, 3, 3);
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicSB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(3, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicSA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(2, topics.getPage().get(1).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicNB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(4, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicNA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(2, topics.getPage().get(1).getSecond().intValue());
// Push some replies into the past, counts go down
pushAuditableDatesBack(replySA1, 6, 6);
pushAuditableDatesBack(replyNA1, 6, 6);
pushAuditableDatesBack(replySB1, 1, 1); // Not enough to affect it
pushAuditableDatesBack(replyNB1, 1, 1); // Not enough to affect it
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicSB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(3, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicSA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(1, topics.getPage().get(1).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicNB.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(4, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicNA.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(1, topics.getPage().get(1).getSecond().intValue());
// Push most replies into the past, still shows, created date ordering matters here
pushAuditableDatesBack(replySB2, 10, 10);
pushAuditableDatesBack(replySB3, 10, 10);
pushAuditableDatesBack(replyNB2, 10, 10);
pushAuditableDatesBack(replyNB3, 10, 10);
pushAuditableDatesBack(replyNB4, 10, 10);
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicSA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicSB.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(1, topics.getPage().get(1).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(2, topics.getPage().size());
assertEquals(topicNA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
assertEquals(topicNB.getTitle(), topics.getPage().get(1).getFirst().getTitle());
assertEquals(1, topics.getPage().get(1).getSecond().intValue());
// Delete the few recent replies, topics will then vanish
DISCUSSION_SERVICE.deletePost(replySB1);
DISCUSSION_SERVICE.deletePost(replyNB1);
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(1, topics.getPage().size());
assertEquals(topicSA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(1, topics.getPage().size());
assertEquals(topicNA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
// Exact date matching check
pushAuditableDatesBack(replySA1_1, 1, 1);
pushAuditableDatesBack(replyNA1_1, 1, 1);
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), fourDaysAgo, paging);
assertEquals(1, topics.getPage().size());
assertEquals(topicSA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, fourDaysAgo, paging);
assertEquals(1, topics.getPage().size());
assertEquals(topicNA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), yesterday, paging);
assertEquals(1, topics.getPage().size());
assertEquals(topicSA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, yesterday, paging);
assertEquals(1, topics.getPage().size());
assertEquals(topicNA.getTitle(), topics.getPage().get(0).getFirst().getTitle());
assertEquals(1, topics.getPage().get(0).getSecond().intValue());
// If we ask for a date in the future, we don't get anything though
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), tomorrow, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, tomorrow, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listHotTopics(DISCUSSION_SITE.getShortName(), future, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listHotTopics(FORUM_NODE, future, paging);
assertEquals(0, topics.getPage().size());
}
/**
* Checks that the correct permission checking occurs on fetching
* topic and post listings (which go through canned queries)
*/
@Test public void discussionsListingPermissionsChecking() throws Exception
{
PagingRequest paging = new PagingRequest(10);
PagingResults<TopicInfo> topics;
PagingResults<PostInfo> posts;
// Nothing to start with in either site or on the node
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(ALTERNATE_DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, paging);
assertEquals(0, topics.getPage().size());
// Double check that we're only allowed to see the 1st site
assertEquals(true, SITE_SERVICE.isMember(DISCUSSION_SITE.getShortName(), TEST_USER));
assertEquals(false, SITE_SERVICE.isMember(ALTERNATE_DISCUSSION_SITE.getShortName(), TEST_USER));
// Now become the test user
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
// Add Topics to the two sites and the test node
// Note - add the events as a different user for the site that the
// test user isn't a member of!
TopicInfo topicSA = DISCUSSION_SERVICE.createTopic(
DISCUSSION_SITE.getShortName(), "Title1A");
TopicInfo topicSB = DISCUSSION_SERVICE.createTopic(
DISCUSSION_SITE.getShortName(), "Title1B");
testNodesToTidy.add(topicSA.getNodeRef());
testNodesToTidy.add(topicSB.getNodeRef());
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
TopicInfo topicPrivA = DISCUSSION_SERVICE.createTopic(
ALTERNATE_DISCUSSION_SITE.getShortName(), "PrivTitleA");
TopicInfo topicPrivB = DISCUSSION_SERVICE.createTopic(
ALTERNATE_DISCUSSION_SITE.getShortName(), "PrivTitleB");
TopicInfo topicPrivC = DISCUSSION_SERVICE.createTopic(
ALTERNATE_DISCUSSION_SITE.getShortName(), "PrivTitleC");
testNodesToTidy.add(topicPrivA.getNodeRef());
testNodesToTidy.add(topicPrivB.getNodeRef());
testNodesToTidy.add(topicPrivC.getNodeRef());
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
TopicInfo topicNA = DISCUSSION_SERVICE.createTopic(
FORUM_NODE, "TitleNA");
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
TopicInfo topicNB = DISCUSSION_SERVICE.createTopic(
FORUM_NODE, "TitleNB");
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
testNodesToTidy.add(topicNA.getNodeRef());
testNodesToTidy.add(topicNB.getNodeRef());
// Check again, as we're not in the 2nd site won't see any there
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(2, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(ALTERNATE_DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, paging);
assertEquals(2, topics.getPage().size());
// Join the site, now we can see both
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
SITE_SERVICE.setMembership(ALTERNATE_DISCUSSION_SITE.getShortName(), TEST_USER, SiteModel.SITE_COLLABORATOR);
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
return null;
}
});
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(2, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(ALTERNATE_DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(3, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, paging);
assertEquals(2, topics.getPage().size());
// Explicitly remove their permissions from one node on each,
// check it vanishes from the list
PERMISSION_SERVICE.setInheritParentPermissions(topicPrivC.getNodeRef(), false);
PERMISSION_SERVICE.clearPermission(topicPrivC.getNodeRef(), TEST_USER);
PERMISSION_SERVICE.setInheritParentPermissions(topicNB.getNodeRef(), false);
PERMISSION_SERVICE.clearPermission(topicNB.getNodeRef(), TEST_USER);
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(2, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(ALTERNATE_DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(2, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, paging);
assertEquals(1, topics.getPage().size());
// Create a primary post on each topic
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
DISCUSSION_SERVICE.createPost(topicSA, "Test S Post");
DISCUSSION_SERVICE.createPost(topicSB, "Test S Post");
DISCUSSION_SERVICE.createPost(topicPrivA, "Test P Post");
DISCUSSION_SERVICE.createPost(topicPrivB, "Test P Post");
DISCUSSION_SERVICE.createPost(topicPrivC, "Test P Post");
DISCUSSION_SERVICE.createPost(topicNA, "Test N Post");
DISCUSSION_SERVICE.createPost(topicNB, "Test N Post");
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
// Check we see the primary post everywhere we can see the node
posts = DISCUSSION_SERVICE.listPosts(topicSA, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicSB, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicPrivA, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicPrivB, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicPrivC, paging);
assertEquals(0, posts.getPage().size()); // Topic hidden
posts = DISCUSSION_SERVICE.listPosts(topicNA, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicNB, paging);
assertEquals(0, posts.getPage().size()); // Topic hidden
// Remove permissions from some posts, check they vanish
PostInfo ppSA = DISCUSSION_SERVICE.getPrimaryPost(topicSA);
PERMISSION_SERVICE.setInheritParentPermissions(ppSA.getNodeRef(), false);
PERMISSION_SERVICE.clearPermission(ppSA.getNodeRef(), TEST_USER);
PostInfo ppPA = DISCUSSION_SERVICE.getPrimaryPost(topicPrivA);
PERMISSION_SERVICE.setInheritParentPermissions(ppPA.getNodeRef(), false);
PERMISSION_SERVICE.clearPermission(ppPA.getNodeRef(), TEST_USER);
PostInfo ppNA = DISCUSSION_SERVICE.getPrimaryPost(topicNA);
PERMISSION_SERVICE.setInheritParentPermissions(ppNA.getNodeRef(), false);
PERMISSION_SERVICE.clearPermission(ppNA.getNodeRef(), TEST_USER);
posts = DISCUSSION_SERVICE.listPosts(topicSA, paging);
assertEquals(0, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicSB, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicPrivA, paging);
assertEquals(0, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicPrivB, paging);
assertEquals(1, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicPrivC, paging);
assertEquals(0, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicNA, paging);
assertEquals(0, posts.getPage().size());
posts = DISCUSSION_SERVICE.listPosts(topicNB, paging);
assertEquals(0, posts.getPage().size());
// Leave, the site, they go away again
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
SITE_SERVICE.removeMembership(ALTERNATE_DISCUSSION_SITE.getShortName(), TEST_USER);
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
return null;
}
});
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(2, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(ALTERNATE_DISCUSSION_SITE.getShortName(), true, paging);
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, paging);
assertEquals(1, topics.getPage().size());
// Tidy
paging = new PagingRequest(10);
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
topics = DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, paging);
for (TopicInfo topic : topics.getPage())
{
PUBLIC_NODE_SERVICE.deleteNode(topic.getNodeRef());
}
topics = DISCUSSION_SERVICE.listTopics(ALTERNATE_DISCUSSION_SITE.getShortName(), true, paging);
for (TopicInfo topic : topics.getPage())
{
PUBLIC_NODE_SERVICE.deleteNode(topic.getNodeRef());
}
topics = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, paging);
for (TopicInfo topic : topics.getPage())
{
PUBLIC_NODE_SERVICE.deleteNode(topic.getNodeRef());
}
}
/**
* Tests that "fm:post" content is not archived.
*/
@Test public void alf_9460()
{
TopicInfo siteTopic;
TopicInfo nodeTopic;
PostInfo post;
PostInfo reply;
// Nothing to start with
PagingResults<TopicInfo> results =
DISCUSSION_SERVICE.listTopics(DISCUSSION_SITE.getShortName(), true, new PagingRequest(10));
assertEquals(0, results.getPage().size());
results = DISCUSSION_SERVICE.listTopics(FORUM_NODE, true, new PagingRequest(10));
assertEquals(0, results.getPage().size());
// Create two topics, one node and one site based
siteTopic = DISCUSSION_SERVICE.createTopic(DISCUSSION_SITE.getShortName(), "Site Title");
nodeTopic = DISCUSSION_SERVICE.createTopic(FORUM_NODE, "Node Title");
testNodesToTidy.add(siteTopic.getNodeRef());
testNodesToTidy.add(nodeTopic.getNodeRef());
for (TopicInfo topic : new TopicInfo[] {siteTopic, nodeTopic})
{
// Create the first post
String contents = "This Is Some Content";
post = DISCUSSION_SERVICE.createPost(topic, contents);
// Add a reply
String reply1Contents = "Reply Contents";
reply = DISCUSSION_SERVICE.createReply(post, reply1Contents);
List<AssociationRef> assocs = NODE_SERVICE.getTargetAssocs(reply.getNodeRef(), ContentModel.ASSOC_REFERENCES);
// check that reply has an association with original post
assertNotNull(assocs);
assertEquals(1, assocs.size());
assertEquals(post.getNodeRef(), assocs.get(0).getTargetRef());
// delete the original post
DISCUSSION_SERVICE.deletePost(post);
// check that post was deleted
assertFalse(NODE_SERVICE.exists(post.getNodeRef()));
// check that associations to the original post was also deleted
assocs = NODE_SERVICE.getTargetAssocs(reply.getNodeRef(), ContentModel.ASSOC_REFERENCES);
assertNotNull(assocs);
assertEquals(0, assocs.size());
}
}
// --------------------------------------------------------------------------------
/**
* Alters the created date on a wiki page for testing
*/
private void pushAuditableDatesBack(final Object thing, final int createdDaysAgo, final int modifiedDaysAgo) throws Exception
{
NodeRef tmpNodeRef;
if (thing instanceof NodeRef)
{
tmpNodeRef = (NodeRef)thing;
}
else if (thing instanceof TopicInfo)
{
tmpNodeRef = ((TopicInfo)thing).getNodeRef();
}
else if (thing instanceof PostInfo)
{
tmpNodeRef = ((PostInfo)thing).getNodeRef();
}
else
{
throw new IllegalArgumentException("Unknown thing " + thing);
}
final NodeRef node = tmpNodeRef;
final Date created = (Date)PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED);
final Date newCreated = new Date(created.getTime() - createdDaysAgo*ONE_DAY_MS);
final Date modified = (Date)PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_MODIFIED);
final Date newModified = new Date(modified.getTime() - modifiedDaysAgo*ONE_DAY_MS);
// Update the created date
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
BEHAVIOUR_FILTER.disableBehaviour(ContentModel.ASPECT_AUDITABLE);
NODE_SERVICE.setProperty(node, ContentModel.PROP_CREATED, newCreated);
NODE_SERVICE.setProperty(node, ContentModel.PROP_MODIFIED, newModified);
return null;
}
}, false, true);
// Change something else too in the public nodeservice, to force a re-index
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
BEHAVIOUR_FILTER.disableBehaviour(ContentModel.ASPECT_AUDITABLE);
PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_CREATED, newCreated);
PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_MODIFIED, newModified);
PUBLIC_NODE_SERVICE.setProperty(node, ContentModel.PROP_DESCRIPTION, "Forced Change");
return null;
}
}, false, true);
// Check it was taken
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
assertEquals(newCreated, NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED));
assertEquals(newCreated, PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_CREATED));
assertEquals(newModified, NODE_SERVICE.getProperty(node, ContentModel.PROP_MODIFIED));
assertEquals(newModified, PUBLIC_NODE_SERVICE.getProperty(node, ContentModel.PROP_MODIFIED));
return null;
}
}, false, true);
// Update the object itself
if (thing instanceof TopicInfo)
{
((TopicInfoImpl)thing).setCreatedAt(newCreated);
((TopicInfoImpl)thing).setModifiedAt(newModified);
}
if (thing instanceof PostInfo)
{
((PostInfoImpl)thing).setCreatedAt(newCreated);
((PostInfoImpl)thing).setModifiedAt(newModified);
}
}
private static void createTestSites() throws Exception
{
final DiscussionServiceImpl privateDiscussionService = (DiscussionServiceImpl)testContext.getBean("discussionService");
DISCUSSION_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<SiteInfo>()
{
@Override
public SiteInfo execute() throws Throwable
{
SiteInfo site = SITE_SERVICE.createSite(
TEST_SITE_PREFIX,
DiscussionServiceImplTest.class.getSimpleName() + "_testSite" + System.currentTimeMillis(),
"test site title", "test site description",
SiteVisibility.PUBLIC);
privateDiscussionService.getSiteDiscussionsContainer(site.getShortName(), true);
CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef());
return site;
}
});
// Add a forum within it, used for the alternate testing
FORUM_NODE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
@Override
public NodeRef execute() throws Throwable
{
NodeRef node = NODE_SERVICE.createNode(
DISCUSSION_SITE.getNodeRef(), ForumModel.ASSOC_DISCUSSION,
QName.createQName("Forum"), ForumModel.TYPE_FORUM
).getChildRef();
NODE_SERVICE.setProperty(node, ContentModel.PROP_NAME, "Forum");
NODE_SERVICE.setProperty(node, ContentModel.PROP_TITLE, "Forum");
CLASS_TEST_NODES_TO_TIDY.add(node);
return node;
}
});
// Create the alternate site as admin
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
ALTERNATE_DISCUSSION_SITE = TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<SiteInfo>()
{
@Override
public SiteInfo execute() throws Throwable
{
SiteInfo site = SITE_SERVICE.createSite(
TEST_SITE_PREFIX,
DiscussionServiceImplTest.class.getSimpleName() + "_testAltSite" + System.currentTimeMillis(),
"alternate site title", "alternate site description",
SiteVisibility.PRIVATE);
privateDiscussionService.getSiteDiscussionsContainer(site.getShortName(), true);
CLASS_TEST_NODES_TO_TIDY.add(site.getNodeRef());
return site;
}
});
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER);
}
private static void createTenant()
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
if (!TENANT_ADMIN_SERVICE.existsTenant(TENANT_DOMAIN))
{
TENANT_ADMIN_SERVICE.createTenant(TENANT_DOMAIN, "password".toCharArray());
}
return null;
}
});
}
/**
* By default, all tests are run as the admin user.
*/
@Before public void setAdminUser()
{
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
}
@After public void deleteTestNodes() throws Exception
{
performDeletionOfNodes(testNodesToTidy);
}
@AfterClass public static void deleteClassTestNodesAndUsers() throws Exception
{
performDeletionOfNodes(CLASS_TEST_NODES_TO_TIDY);
deleteUser(TEST_USER);
deleteTenant();
}
private static void deleteTenant()
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
// TODO: WARNING: HACK for ALF-19155: MT deleteTenant does not work
// PersonService prevents 'guest' authorities from being deleted
{
BehaviourFilter behaviourFilter = (BehaviourFilter) testContext.getBean("policyBehaviourFilter");
behaviourFilter.disableBehaviour(ContentModel.TYPE_PERSON);
behaviourFilter.disableBehaviour(ContentModel.ASPECT_UNDELETABLE);
}
TENANT_ADMIN_SERVICE.deleteTenant(TENANT_DOMAIN);
return null;
}
});
}
/**
* Deletes the specified NodeRefs, if they exist.
* @param nodesToDelete
*/
private static void performDeletionOfNodes(final List<NodeRef> nodesToDelete)
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER);
for (NodeRef node : nodesToDelete)
{
if (NODE_SERVICE.exists(node))
{
// st:site nodes can only be deleted via the SiteService
if (NODE_SERVICE.getType(node).equals(SiteModel.TYPE_SITE))
{
SiteInfo siteInfo = SITE_SERVICE.getSite(node);
SITE_SERVICE.deleteSite(siteInfo.getShortName());
}
else
{
NODE_SERVICE.deleteNode(node);
}
}
}
return null;
}
});
}
private static void createUser(final String userName)
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
if (!AUTHENTICATION_SERVICE.authenticationExists(userName))
{
AUTHENTICATION_SERVICE.createAuthentication(userName, "PWD".toCharArray());
}
if (!PERSON_SERVICE.personExists(userName))
{
PropertyMap ppOne = new PropertyMap();
ppOne.put(ContentModel.PROP_USERNAME, userName);
ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName");
ppOne.put(ContentModel.PROP_LASTNAME, "lastName");
ppOne.put(ContentModel.PROP_EMAIL, "email@email.com");
ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle");
PERSON_SERVICE.createPerson(ppOne);
}
return null;
}
});
}
private static void deleteUser(final String userName)
{
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
@Override
public Void execute() throws Throwable
{
if (PERSON_SERVICE.personExists(userName))
{
PERSON_SERVICE.deletePerson(userName);
}
return null;
}
});
}
}