/** * 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.knowledge.base.service.test; import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; import com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil; import com.liferay.knowledge.base.constants.KBArticleConstants; import com.liferay.knowledge.base.constants.KBFolderConstants; import com.liferay.knowledge.base.exception.KBArticleContentException; import com.liferay.knowledge.base.exception.KBArticleParentException; import com.liferay.knowledge.base.exception.KBArticleSourceURLException; import com.liferay.knowledge.base.exception.KBArticleStatusException; import com.liferay.knowledge.base.exception.KBArticleTitleException; import com.liferay.knowledge.base.exception.KBArticleUrlTitleException; import com.liferay.knowledge.base.model.KBArticle; import com.liferay.knowledge.base.model.KBFolder; import com.liferay.knowledge.base.service.KBArticleLocalServiceUtil; import com.liferay.knowledge.base.service.KBCommentLocalServiceUtil; import com.liferay.knowledge.base.service.KBFolderLocalServiceUtil; import com.liferay.knowledge.base.util.comparator.KBArticlePriorityComparator; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.ModelHintsUtil; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.service.ClassNameLocalServiceUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalServiceUtil; 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.ServiceContextTestUtil; import com.liferay.portal.kernel.test.util.TestPropsValues; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.ratings.kernel.service.RatingsEntryLocalServiceUtil; import com.liferay.ratings.kernel.service.RatingsStatsLocalServiceUtil; import com.liferay.subscription.service.SubscriptionLocalServiceUtil; import java.io.InputStream; 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 Adolfo Pérez * @author Roberto Díaz */ @RunWith(Arquillian.class) @Sync public class KBArticleLocalServiceTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new AggregateTestRule( new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE); @Before public void setUp() throws Exception { _group = GroupTestUtil.addGroup(); _kbArticleClassNameId = ClassNameLocalServiceUtil.getClassNameId( KBArticleConstants.getClassName()); _kbFolderClassNameId = ClassNameLocalServiceUtil.getClassNameId( KBFolderConstants.getClassName()); _user = TestPropsValues.getUser(); _serviceContext = ServiceContextTestUtil.getServiceContext( _group, _user.getUserId()); } @Test public void testAddApprovedKBArticleInsideApprovedKBArticle() throws Exception { _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test(expected = KBArticleStatusException.class) public void testAddApprovedKBArticleInsideDraftKBArticle() throws Exception { _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test public void testAddApprovedKBArticleInsideNonLatestApprovedKBArticle() throws Exception { _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT); parentKBArticle = KBArticleLocalServiceUtil.updateKBArticle( _user.getUserId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, null, _serviceContext); _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test public void testAddDraftKBArticleInsideApprovedKBArticle() throws Exception { _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test public void testAddDraftKBArticleInsideDraftKBArticle() throws Exception { _serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test public void testAddKBArticlesMarkdownWithNoWorkflow() throws Exception { updateWorkflowDefinitionForKBArticle(""); importMarkdownArticles(); } @Test public void testAddKBArticlesMarkdownWithSingleApproverWorkflow() throws Exception { updateWorkflowDefinitionForKBArticle("Single Approver@1"); importMarkdownArticles(); } @Test(expected = KBArticleContentException.class) public void testAddKBArticleWithBlankContent() throws Exception { String content = StringPool.BLANK; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), content, StringUtil.randomString(), StringUtil.randomString(), null, null, _serviceContext); } @Test public void testAddKBArticleWithBlankSourceURL() throws Exception { String sourceURL = StringPool.BLANK; KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), sourceURL, null, null, _serviceContext); Assert.assertTrue(Validator.isNull(kbArticle.getSourceURL())); } @Test(expected = KBArticleTitleException.class) public void testAddKBArticleWithBlankTitle() throws Exception { String title = StringPool.BLANK; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, title, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, _serviceContext); } @Test(expected = KBArticleUrlTitleException.class) public void testAddKBArticleWithBlankURLTitle() throws Exception { String urlTitle = StringPool.BLANK; KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), urlTitle, StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); Assert.assertTrue(Validator.isNotNull(kbArticle.getUrlTitle())); } @Test(expected = KBArticleUrlTitleException.class) public void testAddKBArticleWithDuplicateURLTitle() throws Exception { String urlTitle = StringUtil.randomString(); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), urlTitle, StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), urlTitle, StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test(expected = KBArticleParentException.class) public void testAddKBArticleWithInvalidParentClassNameId() throws Exception { long invalidParentClassNameId = 123456789L; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), invalidParentClassNameId, RandomTestUtil.nextLong(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test(expected = KBArticleSourceURLException.class) public void testAddKBArticleWithInvalidSourceURL() throws Exception { String sourceURL = "InvalidURL"; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), sourceURL, null, null, _serviceContext); } @Test(expected = KBArticleUrlTitleException.class) public void testAddKBArticleWithInvalidURLTitle() throws Exception { String invalidURLTitle = "#$%&/("; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), invalidURLTitle, StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test(expected = KBArticleUrlTitleException.class) public void testAddKBArticleWithLargeURLTitle() throws Exception { int urlTitleMaxSize = ModelHintsUtil.getMaxLength( KBArticle.class.getName(), "urlTitle"); String invalidURLTitle = StringUtil.randomString(urlTitleMaxSize); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), invalidURLTitle, StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test(expected = KBArticleContentException.class) public void testAddKBArticleWithNullContent() throws Exception { String content = null; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), content, StringUtil.randomString(), StringUtil.randomString(), null, null, _serviceContext); } @Test public void testAddKBArticleWithNullSourceURL() throws Exception { String sourceURL = null; KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), sourceURL, null, null, _serviceContext); Assert.assertTrue(Validator.isNull(kbArticle.getSourceURL())); } @Test(expected = KBArticleTitleException.class) public void testAddKBArticleWithNullTitle() throws Exception { String title = null; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, title, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, _serviceContext); } @Test public void testAddKBArticleWithNullURLTitle() throws Exception { String urlTitle = null; KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), urlTitle, StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); Assert.assertTrue(Validator.isNotNull(kbArticle.getUrlTitle())); } @Test public void testAddKBArticleWithValidParentKBArticle() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, kbArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test public void testAddKBArticleWithValidParentKBFolder() throws Exception { KBFolder kbFolder = KBFolderLocalServiceUtil.addKBFolder( _user.getUserId(), _group.getGroupId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), _serviceContext); KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, kbFolder.getPrimaryKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); } @Test public void testAddKBArticleWithValidSourceURL() throws Exception { String sourceURL = "http://www.liferay.com"; KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), sourceURL, null, null, _serviceContext); } @Test public void testDeleteGroupKBArticlesDeletesKBArticles() throws Exception { KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); Assert.assertEquals( 1, KBArticleLocalServiceUtil.getGroupKBArticlesCount( _group.getGroupId(), WorkflowConstants.STATUS_ANY)); KBArticleLocalServiceUtil.deleteGroupKBArticles(_group.getGroupId()); Assert.assertEquals( 0, KBArticleLocalServiceUtil.getGroupKBArticlesCount( _group.getGroupId(), WorkflowConstants.STATUS_ANY)); } @Test public void testDeleteGroupKBArticlesDeletesSubscriptions() throws Exception { KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); int subscriptionsCount = SubscriptionLocalServiceUtil.getUserSubscriptionsCount( _user.getUserId()); KBArticleLocalServiceUtil.subscribeGroupKBArticles( _user.getUserId(), _group.getGroupId()); Assert.assertEquals( subscriptionsCount + 1, SubscriptionLocalServiceUtil.getUserSubscriptionsCount( _user.getUserId())); KBArticleLocalServiceUtil.deleteGroupKBArticles(_group.getGroupId()); Assert.assertEquals( subscriptionsCount, SubscriptionLocalServiceUtil.getUserSubscriptionsCount( _user.getUserId())); } @Test public void testDeleteKBArticleDeletesAssetEntry() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); Assert.assertNotNull( AssetEntryLocalServiceUtil.fetchEntry( KBArticleConstants.getClassName(), kbArticle.getClassPK())); KBArticleLocalServiceUtil.deleteKBArticle(kbArticle); Assert.assertNull( AssetEntryLocalServiceUtil.fetchEntry( KBArticleConstants.getClassName(), kbArticle.getClassPK())); } @Test public void testDeleteKBArticleDeletesChildKBArticles() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle childKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), kbArticle.getClassNameId(), kbArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.deleteKBArticle(kbArticle); Assert.assertNull( KBArticleLocalServiceUtil.fetchKBArticle( childKBArticle.getKbArticleId())); } @Test public void testDeleteKBArticleDeletesKBComments() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBCommentLocalServiceUtil.addKBComment( _user.getUserId(), kbArticle.getClassNameId(), kbArticle.getClassPK(), StringUtil.randomString(), _serviceContext); KBArticleLocalServiceUtil.deleteKBArticle(kbArticle); Assert.assertEquals( 0, KBCommentLocalServiceUtil.getKBCommentsCount( KBArticleConstants.getClassName(), kbArticle.getClassPK())); } @Test public void testDeleteKBArticleDeletesRatings() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); RatingsEntryLocalServiceUtil.updateEntry( _user.getUserId(), KBArticleConstants.getClassName(), kbArticle.getClassPK(), 1.0, _serviceContext); KBArticleLocalServiceUtil.deleteKBArticle(kbArticle); Assert.assertNull( RatingsStatsLocalServiceUtil.fetchStats( KBArticleConstants.getClassName(), kbArticle.getClassPK())); } @Test public void testGetAllDescendantKBArticles() throws Exception { KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "Parent Article", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle childKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, parentKBArticle.getResourcePrimKey(), "Child Article", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle grandchildKBArticleA = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, childKBArticle.getResourcePrimKey(), "Grandchild Article A", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle greatGrandchildKBArticleA = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, grandchildKBArticleA.getResourcePrimKey(), "GreatGrandchild Article A", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle grandchildKBArticleB = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, childKBArticle.getResourcePrimKey(), "Grandchild Article B", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle greatGrandchildKBArticleB = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, grandchildKBArticleB.getResourcePrimKey(), "GreatGrandchild Article B", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); List<KBArticle> kbArticleAndAllDescendantKBArticles = KBArticleLocalServiceUtil.getAllDescendantKBArticles( parentKBArticle.getResourcePrimKey(), WorkflowConstants.STATUS_APPROVED, new KBArticlePriorityComparator(true)); Assert.assertEquals( kbArticleAndAllDescendantKBArticles.toString(), 5, kbArticleAndAllDescendantKBArticles.size()); KBArticle currentChildKBArticle = kbArticleAndAllDescendantKBArticles.get(0); KBArticle currentGrandchildKBArticleA = kbArticleAndAllDescendantKBArticles.get(1); KBArticle currentGreatGrandchildKBArticleA = kbArticleAndAllDescendantKBArticles.get(2); KBArticle currentGrandchildKBArticleB = kbArticleAndAllDescendantKBArticles.get(3); KBArticle currentGreatGrandchildKBArticleB = kbArticleAndAllDescendantKBArticles.get(4); Assert.assertEquals( childKBArticle.getResourcePrimKey(), currentChildKBArticle.getResourcePrimKey()); Assert.assertEquals( grandchildKBArticleA.getResourcePrimKey(), currentGrandchildKBArticleA.getResourcePrimKey()); Assert.assertEquals( greatGrandchildKBArticleA.getResourcePrimKey(), currentGreatGrandchildKBArticleA.getResourcePrimKey()); Assert.assertEquals( grandchildKBArticleB.getResourcePrimKey(), currentGrandchildKBArticleB.getResourcePrimKey()); Assert.assertEquals( greatGrandchildKBArticleB.getResourcePrimKey(), currentGreatGrandchildKBArticleB.getResourcePrimKey()); } @Test public void testGetKBArticleAndAllDescendantKBArticles() throws Exception { KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "Parent Article", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle childKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, parentKBArticle.getResourcePrimKey(), "Child Article", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle grandchildKBArticleA = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, childKBArticle.getResourcePrimKey(), "Grandchild Article A", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle greatGrandchildKBArticleA = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, grandchildKBArticleA.getResourcePrimKey(), "GreatGrandchild Article A", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle grandchildKBArticleB = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, childKBArticle.getResourcePrimKey(), "Grandchild Article B", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle greatGrandchildKBArticleB = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, grandchildKBArticleB.getResourcePrimKey(), "GreatGrandchild Article B", StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); List<KBArticle> kbArticleAndAllDescendantKBArticles = KBArticleLocalServiceUtil.getKBArticleAndAllDescendantKBArticles( parentKBArticle.getResourcePrimKey(), WorkflowConstants.STATUS_APPROVED, new KBArticlePriorityComparator(true)); Assert.assertEquals( kbArticleAndAllDescendantKBArticles.toString(), 6, kbArticleAndAllDescendantKBArticles.size()); KBArticle currentParentKBArticle = kbArticleAndAllDescendantKBArticles.get(0); KBArticle currentChildKBArticle = kbArticleAndAllDescendantKBArticles.get(1); KBArticle currentGrandchildKBArticleA = kbArticleAndAllDescendantKBArticles.get(2); KBArticle currentGreatGrandchildKBArticleA = kbArticleAndAllDescendantKBArticles.get(3); KBArticle currentGrandchildKBArticleB = kbArticleAndAllDescendantKBArticles.get(4); KBArticle currentGreatGrandchildKBArticleB = kbArticleAndAllDescendantKBArticles.get(5); Assert.assertEquals( parentKBArticle.getResourcePrimKey(), currentParentKBArticle.getResourcePrimKey()); Assert.assertEquals( childKBArticle.getResourcePrimKey(), currentChildKBArticle.getResourcePrimKey()); Assert.assertEquals( grandchildKBArticleA.getResourcePrimKey(), currentGrandchildKBArticleA.getResourcePrimKey()); Assert.assertEquals( greatGrandchildKBArticleA.getResourcePrimKey(), currentGreatGrandchildKBArticleA.getResourcePrimKey()); Assert.assertEquals( grandchildKBArticleB.getResourcePrimKey(), currentGrandchildKBArticleB.getResourcePrimKey()); Assert.assertEquals( greatGrandchildKBArticleB.getResourcePrimKey(), currentGreatGrandchildKBArticleB.getResourcePrimKey()); } @Test(expected = KBArticleParentException.class) public void testMoveKBArticleToInvalidParentKBArticle() throws Exception { KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle childKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle grandChildKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbArticleClassNameId, childKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.moveKBArticle( _user.getUserId(), parentKBArticle.getResourcePrimKey(), _kbArticleClassNameId, grandChildKBArticle.getResourcePrimKey(), grandChildKBArticle.getPriority()); } @Test public void testMoveKBArticleToParentKBArticleInHomeFolder() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.moveKBArticle( _user.getUserId(), kbArticle.getResourcePrimKey(), _kbArticleClassNameId, parentKBArticle.getResourcePrimKey(), parentKBArticle.getPriority()); kbArticle = KBArticleLocalServiceUtil.getLatestKBArticle( kbArticle.getResourcePrimKey(), WorkflowConstants.STATUS_ANY); Assert.assertEquals( _kbArticleClassNameId, kbArticle.getParentResourceClassNameId()); Assert.assertEquals( parentKBArticle.getResourcePrimKey(), kbArticle.getParentResourcePrimKey()); } @Test public void testMoveKBArticleToParentKBArticleInKBFolder() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBFolder kbFolder = KBFolderLocalServiceUtil.addKBFolder( _user.getUserId(), _group.getGroupId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), _serviceContext); KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, kbFolder.getKbFolderId(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticleLocalServiceUtil.moveKBArticle( _user.getUserId(), kbArticle.getResourcePrimKey(), _kbArticleClassNameId, parentKBArticle.getResourcePrimKey(), parentKBArticle.getPriority()); kbArticle = KBArticleLocalServiceUtil.getLatestKBArticle( kbArticle.getResourcePrimKey(), WorkflowConstants.STATUS_ANY); Assert.assertEquals( _kbArticleClassNameId, kbArticle.getParentResourceClassNameId()); Assert.assertEquals( parentKBArticle.getResourcePrimKey(), kbArticle.getParentResourcePrimKey()); Assert.assertEquals( kbFolder.getKbFolderId(), kbArticle.getKbFolderId()); } @Test public void testMoveKBArticleToParentKBFolderInHomeFolder() throws Exception { KBArticle kbArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBFolder parentKBFolder = KBFolderLocalServiceUtil.addKBFolder( _user.getUserId(), _group.getGroupId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), _serviceContext); KBArticleLocalServiceUtil.moveKBArticle( _user.getUserId(), kbArticle.getResourcePrimKey(), _kbFolderClassNameId, parentKBFolder.getKbFolderId(), kbArticle.getPriority()); kbArticle = KBArticleLocalServiceUtil.getLatestKBArticle( kbArticle.getResourcePrimKey(), WorkflowConstants.STATUS_ANY); Assert.assertEquals( _kbFolderClassNameId, kbArticle.getParentResourceClassNameId()); Assert.assertEquals( parentKBFolder.getKbFolderId(), kbArticle.getParentResourcePrimKey()); } @Test public void testPreviousAndNextKBArticles() throws Exception { KBArticle parentKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle childKBArticle1 = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle childKBArticle2 = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), parentKBArticle.getClassNameId(), parentKBArticle.getResourcePrimKey(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle topLevelKBArticle = KBArticleLocalServiceUtil.addKBArticle( _user.getUserId(), _kbFolderClassNameId, KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), StringUtil.randomString(), null, null, null, _serviceContext); KBArticle[] parentPreviousAndNextKBArticles = KBArticleLocalServiceUtil.getPreviousAndNextKBArticles( parentKBArticle.getKbArticleId()); Assert.assertNull(parentPreviousAndNextKBArticles[0]); Assert.assertEquals( childKBArticle1, parentPreviousAndNextKBArticles[2]); KBArticle[] child1PreviousAndNextKBArticles = KBArticleLocalServiceUtil.getPreviousAndNextKBArticles( childKBArticle1.getKbArticleId()); Assert.assertEquals( parentKBArticle, child1PreviousAndNextKBArticles[0]); Assert.assertEquals( childKBArticle2, child1PreviousAndNextKBArticles[2]); KBArticle[] child2PreviousAndNextKBArticles = KBArticleLocalServiceUtil.getPreviousAndNextKBArticles( childKBArticle2.getKbArticleId()); Assert.assertEquals( childKBArticle1, child2PreviousAndNextKBArticles[0]); Assert.assertEquals( topLevelKBArticle, child2PreviousAndNextKBArticles[2]); KBArticle[] topLevelPreviousAndNextKBArticles = KBArticleLocalServiceUtil.getPreviousAndNextKBArticles( topLevelKBArticle.getKbArticleId()); Assert.assertEquals( childKBArticle2, topLevelPreviousAndNextKBArticles[0]); Assert.assertNull(topLevelPreviousAndNextKBArticles[2]); } protected void importMarkdownArticles() throws PortalException { Class<?> clazz = getClass(); ClassLoader classLoader = clazz.getClassLoader(); String fileName = "markdown-articles.zip"; InputStream zipFileStream = classLoader.getResourceAsStream(fileName); KBArticleLocalServiceUtil.addKBArticlesMarkdown( _user.getUserId(), _group.getGroupId(), KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, fileName, true, zipFileStream, _serviceContext); } protected void updateWorkflowDefinitionForKBArticle( String workflowDefinition) throws PortalException { WorkflowDefinitionLinkLocalServiceUtil.updateWorkflowDefinitionLink( _user.getUserId(), _user.getCompanyId(), _group.getGroupId(), KBArticle.class.getName(), 0, 0, workflowDefinition); } @DeleteAfterTestRun private Group _group; private long _kbArticleClassNameId; private long _kbFolderClassNameId; private ServiceContext _serviceContext; private User _user; }