/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library 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 2.1 of the License, or (at your option)
* any later version.
*
* This library 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.
*/
package com.liferay.blogs.service.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.asset.kernel.model.AssetEntry;
import com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil;
import com.liferay.blogs.exception.EntryTitleException;
import com.liferay.blogs.model.BlogsEntry;
import com.liferay.blogs.service.BlogsEntryLocalServiceUtil;
import com.liferay.blogs.social.BlogsActivityKeys;
import com.liferay.blogs.util.test.BlogsTestUtil;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.portlet.PortletProvider;
import com.liferay.portal.kernel.portlet.PortletProviderUtil;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.rule.Sync;
import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule;
import com.liferay.portal.kernel.test.util.GroupTestUtil;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.SearchContextTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.test.util.UserTestUtil;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.service.test.ServiceTestUtil;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.social.kernel.model.SocialActivity;
import com.liferay.social.kernel.service.SocialActivityLocalServiceUtil;
import java.io.Serializable;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* @author Zsolt Berentey
*/
@RunWith(Arquillian.class)
@Sync
public class BlogsEntryStatusTransitionTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new AggregateTestRule(
new LiferayIntegrationTestRule(),
SynchronousDestinationTestRule.INSTANCE);
@Before
public void setUp() throws Exception {
group = GroupTestUtil.addGroup();
user = UserTestUtil.addUser(group.getGroupId());
ServiceTestUtil.setUser(TestPropsValues.getUser());
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(
group.getGroupId(), user.getUserId());
entry = BlogsTestUtil.addEntryWithWorkflow(
user.getUserId(), RandomTestUtil.randomString(), false,
serviceContext);
}
@Test
public void testApprovedToDraft() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_DRAFT, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
}
@Test
public void testApprovedToTrash() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_IN_TRASH, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
}
@Test
public void testDraftToApprovedByAdd() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertTrue(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(1, searchBlogsEntriesCount(group.getGroupId()));
checkSocialActivity(BlogsActivityKeys.ADD_ENTRY, 1);
}
@Test
public void testDraftToApprovedByUpdate() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_DRAFT, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertTrue(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(1, searchBlogsEntriesCount(group.getGroupId()));
checkSocialActivity(BlogsActivityKeys.UPDATE_ENTRY, 1);
}
@Test(expected = EntryTitleException.class)
public void testDraftToApprovedWithoutTitle() throws Exception {
ServiceContext serviceContext = getServiceContext(entry);
String title = "";
BlogsEntry entryWithoutTitle = BlogsEntryLocalServiceUtil.addEntry(
user.getUserId(), title, RandomTestUtil.randomString(),
serviceContext);
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entryWithoutTitle.getEntryId(),
WorkflowConstants.STATUS_APPROVED, serviceContext,
new HashMap<String, Serializable>());
}
@Test
public void testDraftToScheduledByAdd() throws Exception {
Calendar displayDate = new GregorianCalendar();
displayDate.add(Calendar.DATE, 1);
entry.setDisplayDate(displayDate.getTime());
BlogsEntryLocalServiceUtil.updateBlogsEntry(entry);
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
checkSocialActivity(BlogsActivityKeys.ADD_ENTRY, 1);
AssetEntry assetEntry = AssetEntryLocalServiceUtil.fetchEntry(
BlogsEntry.class.getName(), entry.getEntryId());
Assert.assertNull(assetEntry.getPublishDate());
}
@Test
public void testDraftToScheduledUpdate() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
entry = BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_DRAFT, getServiceContext(entry),
new HashMap<String, Serializable>());
Calendar displayDate = new GregorianCalendar();
displayDate.add(Calendar.DATE, 1);
entry.setDisplayDate(displayDate.getTime());
BlogsEntryLocalServiceUtil.updateBlogsEntry(entry);
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
checkSocialActivity(BlogsActivityKeys.UPDATE_ENTRY, 1);
AssetEntry assetEntry = AssetEntryLocalServiceUtil.fetchEntry(
BlogsEntry.class.getName(), entry.getEntryId());
Assert.assertNotNull(assetEntry.getPublishDate());
}
@Test
public void testDraftToTrash() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_IN_TRASH, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
}
@Test
public void testScheduledByAddToApproved() throws Exception {
Calendar displayDate = new GregorianCalendar();
displayDate.add(Calendar.DATE, 1);
entry.setDisplayDate(displayDate.getTime());
BlogsEntryLocalServiceUtil.updateBlogsEntry(entry);
entry = BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
displayDate.add(Calendar.DATE, -2);
entry.setDisplayDate(displayDate.getTime());
BlogsEntryLocalServiceUtil.updateBlogsEntry(entry);
BlogsEntryLocalServiceUtil.checkEntries();
Assert.assertTrue(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(1, searchBlogsEntriesCount(group.getGroupId()));
}
@Test
public void testScheduledByUpdateToApproved() throws Exception {
entry = BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
Calendar displayDate = new GregorianCalendar();
displayDate.add(Calendar.DATE, 1);
entry.setDisplayDate(displayDate.getTime());
entry.setStatus(WorkflowConstants.STATUS_DRAFT);
BlogsEntryLocalServiceUtil.updateBlogsEntry(entry);
entry = BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
checkSocialActivity(BlogsActivityKeys.UPDATE_ENTRY, 1);
displayDate.add(Calendar.DATE, -2);
entry.setDisplayDate(displayDate.getTime());
BlogsEntryLocalServiceUtil.updateBlogsEntry(entry);
BlogsEntryLocalServiceUtil.checkEntries();
Assert.assertTrue(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(1, searchBlogsEntriesCount(group.getGroupId()));
checkSocialActivity(BlogsActivityKeys.UPDATE_ENTRY, 1);
}
@Test
public void testTrashToApproved() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_IN_TRASH, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertTrue(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(1, searchBlogsEntriesCount(group.getGroupId()));
checkSocialActivity(BlogsActivityKeys.ADD_ENTRY, 1);
}
@Test
public void testTrashToDraft() throws Exception {
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_IN_TRASH, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_DRAFT, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_APPROVED, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_DRAFT, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_IN_TRASH, getServiceContext(entry),
new HashMap<String, Serializable>());
BlogsEntryLocalServiceUtil.updateStatus(
TestPropsValues.getUserId(), entry.getEntryId(),
WorkflowConstants.STATUS_DRAFT, getServiceContext(entry),
new HashMap<String, Serializable>());
Assert.assertFalse(isAssetEntryVisible(entry.getEntryId()));
Assert.assertEquals(0, searchBlogsEntriesCount(group.getGroupId()));
}
protected void checkSocialActivity(int activityType, int expectedCount)
throws Exception {
Thread.sleep(500 * TestPropsValues.JUNIT_DELAY_FACTOR);
List<SocialActivity> socialActivities =
SocialActivityLocalServiceUtil.getGroupActivities(
group.getGroupId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS);
int count = 0;
for (SocialActivity socialActivity : socialActivities) {
if ((activityType == ACTIVITY_KEY_ANY) ||
(activityType == socialActivity.getType())) {
count = count + 1;
}
}
Assert.assertEquals(expectedCount, count);
}
protected ServiceContext getServiceContext(BlogsEntry entry)
throws Exception {
ServiceContext serviceContext = new ServiceContext();
String[] trackbacks = StringUtil.split(entry.getTrackbacks());
serviceContext.setAttribute("trackbacks", trackbacks);
serviceContext.setCommand(Constants.UPDATE);
String portletId = PortletProviderUtil.getPortletId(
BlogsEntry.class.getName(), PortletProvider.Action.VIEW);
String layoutFullURL = PortalUtil.getLayoutFullURL(
entry.getGroupId(), portletId);
serviceContext.setLayoutFullURL(layoutFullURL);
serviceContext.setScopeGroupId(entry.getGroupId());
return serviceContext;
}
protected boolean isAssetEntryVisible(long blogsEntryId) throws Exception {
AssetEntry assetEntry = AssetEntryLocalServiceUtil.getEntry(
BlogsEntry.class.getName(), blogsEntryId);
return assetEntry.isVisible();
}
protected int searchBlogsEntriesCount(long groupId) throws Exception {
Indexer<BlogsEntry> indexer = IndexerRegistryUtil.getIndexer(
BlogsEntry.class);
SearchContext searchContext = SearchContextTestUtil.getSearchContext();
searchContext.setGroupIds(new long[] {groupId});
Hits results = indexer.search(searchContext);
return results.getLength();
}
protected static final int ACTIVITY_KEY_ANY = -1;
protected BlogsEntry entry;
@DeleteAfterTestRun
protected Group group;
@DeleteAfterTestRun
protected User user;
}