/**
* 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.exportimport.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppLocalServiceUtil;
import com.liferay.exportimport.kernel.lar.ExportImportHelperUtil;
import com.liferay.exportimport.kernel.lar.MissingReference;
import com.liferay.exportimport.kernel.lar.MissingReferences;
import com.liferay.exportimport.kernel.lar.PortletDataContext;
import com.liferay.exportimport.kernel.lar.PortletDataContextFactoryUtil;
import com.liferay.exportimport.kernel.lar.PortletDataHandler;
import com.liferay.exportimport.test.util.TestUserIdStrategy;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.repository.capabilities.ThumbnailCapability;
import com.liferay.portal.kernel.repository.model.FileEntry;
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.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.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.zip.ZipReader;
import com.liferay.portal.kernel.zip.ZipReaderFactoryUtil;
import com.liferay.portal.kernel.zip.ZipWriter;
import com.liferay.portal.kernel.zip.ZipWriterFactoryUtil;
import com.liferay.portal.test.randomizerbumpers.TikaSafeRandomizerBumper;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.portal.util.test.LayoutTestUtil;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
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
* @author Peter Borkuti
*/
@RunWith(Arquillian.class)
public class ExportImportHelperUtilTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new LiferayIntegrationTestRule();
@Before
public void setUp() throws Exception {
_liveGroup = GroupTestUtil.addGroup();
_stagingGroup = GroupTestUtil.addGroup();
}
@Test
public void testDataSiteLevelPortletsRank() throws Exception {
List<Portlet> portlets =
ExportImportHelperUtil.getDataSiteLevelPortlets(
TestPropsValues.getCompanyId());
Integer previousRank = null;
for (Portlet portlet : portlets) {
PortletDataHandler portletDataHandler =
portlet.getPortletDataHandlerInstance();
int actualRank = portletDataHandler.getRank();
if (previousRank != null) {
Assert.assertTrue(
"Portlets should be in ascending order by rank",
previousRank <= actualRank);
}
previousRank = actualRank;
}
}
@Test
public void testGetSelectedLayoutsJSONSelectAllLayouts() throws Exception {
Layout layout = LayoutTestUtil.addLayout(_stagingGroup);
Layout childLayout = LayoutTestUtil.addLayout(
_stagingGroup, layout.getPlid());
long[] selectedLayoutIds =
new long[] {layout.getLayoutId(), childLayout.getLayoutId()};
String selectedLayoutsJSON =
ExportImportHelperUtil.getSelectedLayoutsJSON(
_stagingGroup.getGroupId(), false,
StringUtil.merge(selectedLayoutIds));
JSONArray selectedLayoutsJSONArray = JSONFactoryUtil.createJSONArray(
selectedLayoutsJSON);
Assert.assertEquals(1, selectedLayoutsJSONArray.length());
JSONObject layoutJSONObject = selectedLayoutsJSONArray.getJSONObject(0);
Assert.assertTrue(layoutJSONObject.getBoolean("includeChildren"));
Assert.assertEquals(layout.getPlid(), layoutJSONObject.getLong("plid"));
}
@Test
public void testGetSelectedLayoutsJSONSelectChildLayout() throws Exception {
Layout layout = LayoutTestUtil.addLayout(_stagingGroup);
Layout childLayout = LayoutTestUtil.addLayout(
_stagingGroup, layout.getPlid());
long[] selectedLayoutIds = new long[] {childLayout.getLayoutId()};
String selectedLayoutsJSON =
ExportImportHelperUtil.getSelectedLayoutsJSON(
_stagingGroup.getGroupId(), false,
StringUtil.merge(selectedLayoutIds));
JSONArray selectedLayoutsJSONArray = JSONFactoryUtil.createJSONArray(
selectedLayoutsJSON);
Assert.assertEquals(1, selectedLayoutsJSONArray.length());
JSONObject layoutJSONObject = selectedLayoutsJSONArray.getJSONObject(0);
Assert.assertTrue(layoutJSONObject.getBoolean("includeChildren"));
Assert.assertEquals(
childLayout.getPlid(), layoutJSONObject.getLong("plid"));
}
@Test
public void testGetSelectedLayoutsJSONSelectNoLayouts() throws Exception {
Layout layout = LayoutTestUtil.addLayout(_stagingGroup);
LayoutTestUtil.addLayout(_stagingGroup, layout.getPlid());
String selectedLayoutsJSON =
ExportImportHelperUtil.getSelectedLayoutsJSON(
_stagingGroup.getGroupId(), false,
StringUtil.merge(new long[0]));
JSONArray selectedLayoutsJSONArray = JSONFactoryUtil.createJSONArray(
selectedLayoutsJSON);
Assert.assertEquals(0, selectedLayoutsJSONArray.length());
}
@Test
public void testGetSelectedLayoutsJSONSelectParentLayout()
throws Exception {
Layout layout = LayoutTestUtil.addLayout(_stagingGroup);
LayoutTestUtil.addLayout(
_stagingGroup.getGroupId(), "Child Layout", layout.getPlid());
long[] selectedLayoutIds = new long[] {layout.getLayoutId()};
String selectedLayoutsJSON =
ExportImportHelperUtil.getSelectedLayoutsJSON(
_stagingGroup.getGroupId(), false,
StringUtil.merge(selectedLayoutIds));
JSONArray selectedLayoutsJSONArray = JSONFactoryUtil.createJSONArray(
selectedLayoutsJSON);
Assert.assertEquals(1, selectedLayoutsJSONArray.length());
JSONObject layoutJSONObject = selectedLayoutsJSONArray.getJSONObject(0);
Assert.assertFalse(layoutJSONObject.getBoolean("includeChildren"));
Assert.assertEquals(layout.getPlid(), layoutJSONObject.getLong("plid"));
}
@Test
public void testValidateMissingReferences() throws Exception {
String xml = replaceParameters(
getContent("missing_references.txt"), getFileEntry());
ZipWriter zipWriter = ZipWriterFactoryUtil.getZipWriter();
zipWriter.addEntry("/manifest.xml", xml);
ZipReader zipReader = ZipReaderFactoryUtil.getZipReader(
zipWriter.getFile());
PortletDataContext portletDataContextImport =
PortletDataContextFactoryUtil.createImportPortletDataContext(
_liveGroup.getCompanyId(), _liveGroup.getGroupId(),
new HashMap<String, String[]>(), new TestUserIdStrategy(),
zipReader);
MissingReferences missingReferences =
ExportImportHelperUtil.validateMissingReferences(
portletDataContextImport);
Map<String, MissingReference> dependencyMissingReferences =
missingReferences.getDependencyMissingReferences();
Map<String, MissingReference> weakMissingReferences =
missingReferences.getWeakMissingReferences();
Assert.assertEquals(
dependencyMissingReferences.toString(), 2,
dependencyMissingReferences.size());
Assert.assertEquals(
weakMissingReferences.toString(), 1, weakMissingReferences.size());
FileUtil.delete(zipWriter.getFile());
zipReader.close();
}
protected String getContent(String fileName) throws Exception {
Class<?> clazz = getClass();
InputStream inputStream = clazz.getResourceAsStream(
"dependencies/" + fileName);
Scanner scanner = new Scanner(inputStream);
scanner.useDelimiter("\\Z");
return scanner.next();
}
protected FileEntry getFileEntry() throws PortalException {
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(
_stagingGroup.getGroupId(), TestPropsValues.getUserId());
FileEntry fileEntry = DLAppLocalServiceUtil.addFileEntry(
TestPropsValues.getUserId(), _stagingGroup.getGroupId(),
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
RandomTestUtil.randomString() + ".txt", ContentTypes.TEXT_PLAIN,
RandomTestUtil.randomBytes(TikaSafeRandomizerBumper.INSTANCE),
serviceContext);
ThumbnailCapability thumbnailCapability =
fileEntry.getRepositoryCapability(ThumbnailCapability.class);
fileEntry = thumbnailCapability.setLargeImageId(
fileEntry, fileEntry.getFileEntryId());
return fileEntry;
}
protected String replaceParameters(String content, FileEntry fileEntry) {
content = StringUtil.replace(
content,
new String[] {"[$GROUP_ID$]", "[$LIVE_GROUP_ID$]", "[$UUID$]"},
new String[] {
String.valueOf(fileEntry.getGroupId()),
String.valueOf(fileEntry.getGroupId()), fileEntry.getUuid()
});
return content;
}
@DeleteAfterTestRun
private Group _liveGroup;
@DeleteAfterTestRun
private Group _stagingGroup;
}