/** * 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.journal.exportimport.data.handler.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.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.model.DDMTemplate; import com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil; import com.liferay.dynamic.data.mapping.service.DDMTemplateLocalServiceUtil; import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestUtil; import com.liferay.dynamic.data.mapping.test.util.DDMTemplateTestUtil; import com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys; import com.liferay.exportimport.kernel.lar.UserIdStrategy; import com.liferay.journal.constants.JournalPortletKeys; import com.liferay.journal.exportimport.data.handler.JournalPortletDataHandler; import com.liferay.journal.model.JournalArticle; import com.liferay.journal.model.JournalArticleConstants; import com.liferay.journal.model.JournalArticleResource; import com.liferay.journal.model.JournalFolderConstants; import com.liferay.journal.service.JournalArticleLocalServiceUtil; import com.liferay.journal.test.util.JournalTestUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.StagedModel; import com.liferay.portal.kernel.service.CompanyLocalServiceUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.Sync; import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule; 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.Constants; import com.liferay.portal.kernel.util.DateUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.lar.test.BasePortletExportImportTestCase; import com.liferay.portal.service.test.ServiceTestUtil; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; 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 Juan Fernández */ @RunWith(Arquillian.class) @Sync public class JournalExportImportTest extends BasePortletExportImportTestCase { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new AggregateTestRule( new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE); @Override public String getNamespace() { return JournalPortletDataHandler.NAMESPACE; } @Override public String getPortletId() { return JournalPortletKeys.JOURNAL; } @Before @Override public void setUp() throws Exception { super.setUp(); ServiceTestUtil.setUser(TestPropsValues.getUser()); } @Test public void testExportImportCompanyScopeStructuredJournalArticle() throws Exception { exportImportJournalArticle(true); } @Test public void testExportImportJournalArticleWithoutVersionHistory() throws Exception { JournalArticle article = (JournalArticle)addStagedModel( group.getGroupId()); article = (JournalArticle)addVersion(article); int articlesCount = JournalArticleLocalServiceUtil.getArticlesCount( group.getGroupId(), article.getArticleId()); Assert.assertEquals(2, articlesCount); Map<String, String[]> exportParameterMap = new HashMap<>(); addParameter(exportParameterMap, "version-history", false); exportImportPortlet( JournalPortletKeys.JOURNAL, exportParameterMap, new HashMap<String, String[]>()); JournalArticle importedArticle = (JournalArticle)getStagedModel( article.getUuid(), importedGroup.getGroupId()); Assert.assertNotNull(importedArticle); articlesCount = JournalArticleLocalServiceUtil.getArticlesCount( importedGroup.getGroupId(), importedArticle.getArticleId()); Assert.assertEquals(1, articlesCount); } @Test public void testExportImportStructuredJournalArticle() throws Exception { exportImportJournalArticle(false); } @Override protected StagedModel addStagedModel(long groupId) throws Exception { return JournalTestUtil.addArticle( groupId, RandomTestUtil.randomString(), RandomTestUtil.randomString()); } @Override protected StagedModel addStagedModel(long groupId, Date createdDate) throws Exception { String title = RandomTestUtil.randomString(); ServiceContext serviceContext = ServiceContextTestUtil.getServiceContext(groupId); serviceContext.setCommand(Constants.ADD); serviceContext.setCreateDate(createdDate); serviceContext.setLayoutFullURL("http://localhost"); serviceContext.setModifiedDate(createdDate); return JournalTestUtil.addArticle( groupId, JournalFolderConstants.DEFAULT_PARENT_FOLDER_ID, JournalArticleConstants.CLASSNAME_ID_DEFAULT, title, title, RandomTestUtil.randomString(), LocaleUtil.getSiteDefault(), false, false, serviceContext); } @Override protected StagedModel addVersion(StagedModel stagedModel) throws Exception { JournalArticle article = (JournalArticle)stagedModel; return JournalTestUtil.updateArticle( article, RandomTestUtil.randomString()); } @Override protected void deleteFirstVersion(StagedModel stagedModel) throws Exception { JournalArticle article = (JournalArticle)stagedModel; List<JournalArticle> articles = JournalArticleLocalServiceUtil.getArticles( article.getGroupId(), article.getArticleId()); JournalArticle firstArticle = null; for (JournalArticle journalArticle : articles) { if ((firstArticle == null) || (journalArticle.getVersion() < firstArticle.getVersion())) { firstArticle = journalArticle; } } deleteStagedModel(firstArticle); } @Override protected void deleteLatestVersion(StagedModel stagedModel) throws Exception { JournalArticle article = (JournalArticle)stagedModel; JournalArticle latestArticle = JournalArticleLocalServiceUtil.getLatestArticle( article.getGroupId(), article.getArticleId()); deleteStagedModel(latestArticle); } @Override protected void deleteStagedModel(StagedModel stagedModel) throws Exception { JournalArticleLocalServiceUtil.deleteArticle( (JournalArticle)stagedModel); } protected void exportImportJournalArticle(boolean companyScopeDependencies) throws Exception { JournalArticle article = null; DDMStructure ddmStructure = null; DDMTemplate ddmTemplate = null; long groupId = group.getGroupId(); Company company = CompanyLocalServiceUtil.fetchCompany( group.getCompanyId()); Group companyGroup = company.getGroup(); if (companyScopeDependencies) { groupId = companyGroup.getGroupId(); } ddmStructure = DDMStructureTestUtil.addStructure( groupId, JournalArticle.class.getName()); ddmTemplate = DDMTemplateTestUtil.addTemplate( groupId, ddmStructure.getStructureId(), PortalUtil.getClassNameId(JournalArticle.class)); String content = DDMStructureTestUtil.getSampleStructuredContent(); article = JournalTestUtil.addArticleWithXMLContent( group.getGroupId(), content, ddmStructure.getStructureKey(), ddmTemplate.getTemplateKey()); exportImportPortlet(JournalPortletKeys.JOURNAL); int articlesCount = JournalArticleLocalServiceUtil.getArticlesCount( importedGroup.getGroupId()); Assert.assertEquals(1, articlesCount); JournalArticle groupArticle = JournalArticleLocalServiceUtil.fetchJournalArticleByUuidAndGroupId( article.getUuid(), importedGroup.getGroupId()); Assert.assertNotNull(groupArticle); groupId = importedGroup.getGroupId(); if (companyScopeDependencies) { DDMStructure importedDDMStructure = DDMStructureLocalServiceUtil.fetchDDMStructureByUuidAndGroupId( ddmStructure.getUuid(), groupId); Assert.assertNull(importedDDMStructure); DDMTemplate importedDDMTemplate = DDMTemplateLocalServiceUtil.fetchDDMTemplateByUuidAndGroupId( ddmTemplate.getUuid(), groupId); Assert.assertNull(importedDDMTemplate); groupId = companyGroup.getGroupId(); } DDMStructure dependentDDMStructure = DDMStructureLocalServiceUtil.fetchDDMStructureByUuidAndGroupId( ddmStructure.getUuid(), groupId); Assert.assertNotNull(dependentDDMStructure); DDMTemplate dependentDDMTemplate = DDMTemplateLocalServiceUtil.fetchDDMTemplateByUuidAndGroupId( ddmTemplate.getUuid(), groupId); Assert.assertNotNull(dependentDDMTemplate); Assert.assertEquals( article.getDDMStructureKey(), dependentDDMStructure.getStructureKey()); Assert.assertEquals( article.getDDMTemplateKey(), dependentDDMTemplate.getTemplateKey()); Assert.assertEquals( dependentDDMTemplate.getClassPK(), dependentDDMStructure.getStructureId()); } @Override protected AssetEntry getAssetEntry(StagedModel stagedModel) throws PortalException { JournalArticle article = (JournalArticle)stagedModel; return AssetEntryLocalServiceUtil.getEntry( article.getGroupId(), article.getArticleResourceUuid()); } protected Map<String, String[]> getBaseParameterMap(long groupId, long plid) throws Exception { Map<String, String[]> parameterMap = new HashMap<>(); parameterMap.put( PortletDataHandlerKeys.PERMISSIONS, new String[] {Boolean.TRUE.toString()}); parameterMap.put( PortletDataHandlerKeys.PORTLET_DATA_CONTROL_DEFAULT, new String[] {Boolean.FALSE.toString()}); addParameter(parameterMap, "doAsGroupId", String.valueOf(groupId)); addParameter(parameterMap, "feeds", true); addParameter(parameterMap, "groupId", String.valueOf(groupId)); addParameter( parameterMap, "permissionsAssignedToRoles", Boolean.TRUE.toString()); addParameter(parameterMap, "plid", String.valueOf(plid)); addParameter( parameterMap, "portletResource", JournalPortletKeys.JOURNAL); addParameter(parameterMap, "referenced-content", true); addParameter(parameterMap, "structures", true); addParameter(parameterMap, "version-history", true); addParameter(parameterMap, "web-content", true); return parameterMap; } @Override protected Map<String, String[]> getExportParameterMap() throws Exception { Map<String, String[]> parameterMap = super.getExportParameterMap(); MapUtil.merge( parameterMap, getBaseParameterMap(group.getGroupId(), layout.getPlid())); parameterMap.put( PortletDataHandlerKeys.PORTLET_DATA + StringPool.UNDERLINE + JournalPortletKeys.JOURNAL, new String[] {Boolean.TRUE.toString()}); return parameterMap; } @Override protected Map<String, String[]> getImportParameterMap() throws Exception { Map<String, String[]> parameterMap = super.getImportParameterMap(); MapUtil.merge( parameterMap, getBaseParameterMap( importedGroup.getGroupId(), importedLayout.getPlid())); parameterMap.put( PortletDataHandlerKeys.DATA_STRATEGY, new String[] {PortletDataHandlerKeys.DATA_STRATEGY_MIRROR}); parameterMap.put( PortletDataHandlerKeys.DELETE_PORTLET_DATA, new String[] {Boolean.FALSE.toString()}); parameterMap.put( PortletDataHandlerKeys.USER_ID_STRATEGY, new String[] {UserIdStrategy.CURRENT_USER_ID}); return parameterMap; } @Override protected StagedModel getStagedModel(String uuid, long groupId) { return JournalArticleLocalServiceUtil.fetchJournalArticleByUuidAndGroupId( uuid, groupId); } @Override protected boolean isVersioningEnabled() { return true; } @Override protected void testExportImportDisplayStyle(long groupId, String scopeType) throws Exception { } @Override protected void validateImportedStagedModel( StagedModel stagedModel, StagedModel importedStagedModel) throws Exception { super.validateImportedStagedModel(stagedModel, importedStagedModel); JournalArticle article = (JournalArticle)stagedModel; JournalArticle importedArticle = (JournalArticle)importedStagedModel; Assert.assertEquals( (Double)article.getVersion(), (Double)importedArticle.getVersion()); Assert.assertEquals(article.getTitle(), importedArticle.getTitle()); Assert.assertEquals( article.getUrlTitle(), importedArticle.getUrlTitle()); Assert.assertEquals( article.getDescription(), importedArticle.getDescription()); Assert.assertEquals(article.getContent(), importedArticle.getContent()); Assert.assertTrue( String.valueOf(article.getDisplayDate()) + StringPool.SPACE + importedArticle.getDisplayDate(), DateUtil.equals( article.getDisplayDate(), importedArticle.getDisplayDate())); Assert.assertTrue( String.valueOf(article.getExpirationDate()) + StringPool.SPACE + importedArticle.getExpirationDate(), DateUtil.equals( article.getExpirationDate(), importedArticle.getExpirationDate())); Assert.assertTrue( String.valueOf(article.getReviewDate()) + StringPool.SPACE + importedArticle.getReviewDate(), DateUtil.equals( article.getReviewDate(), importedArticle.getReviewDate())); Assert.assertEquals( article.getSmallImage(), importedArticle.getSmallImage()); Assert.assertEquals( article.getSmallImageURL(), importedArticle.getSmallImageURL()); Assert.assertEquals(article.getStatus(), importedArticle.getStatus()); Assert.assertTrue( String.valueOf(article.getStatusDate()) + StringPool.SPACE + importedArticle.getStatusDate(), DateUtil.equals( article.getStatusDate(), importedArticle.getStatusDate())); JournalArticleResource articleResource = article.getArticleResource(); JournalArticleResource importedArticleArticleResource = importedArticle.getArticleResource(); Assert.assertEquals( articleResource.getUuid(), importedArticleArticleResource.getUuid()); } @Override protected void validateVersions() throws Exception { List<JournalArticle> articles = JournalArticleLocalServiceUtil.getArticles(group.getGroupId()); for (JournalArticle article : articles) { JournalArticle importedArticle = (JournalArticle)getStagedModel( article.getUuid(), importedGroup.getGroupId()); Assert.assertNotNull(importedArticle); validateImportedStagedModel(article, importedArticle); } } }