/**
* 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.portlet.social.test;
import com.liferay.portal.events.ServicePreAction;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.ServiceContextFactory;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.util.GroupTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import com.liferay.social.kernel.model.SocialActivity;
import com.liferay.social.kernel.model.SocialActivityFeedEntry;
import com.liferay.social.kernel.model.SocialActivityInterpreter;
import com.liferay.social.kernel.service.SocialActivityLocalServiceUtil;
import com.liferay.trash.kernel.util.TrashUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.portlet.PortletURL;
import javax.servlet.http.HttpServletRequest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
/**
* @author Zsolt Berentey
*/
public abstract class BaseSocialActivityInterpreterTestCase {
@Before
public void setUp() throws Exception {
group = GroupTestUtil.addGroup();
HttpServletRequest request = new MockHttpServletRequest();
request.setAttribute(
WebKeys.COMPANY_ID, TestPropsValues.getCompanyId());
request.setAttribute(
WebKeys.CURRENT_URL, "http://localhost:80/web/guest/home");
request.setAttribute(WebKeys.USER, TestPropsValues.getUser());
ServicePreAction servicePreAction = new ServicePreAction();
ThemeDisplay themeDisplay = servicePreAction.initThemeDisplay(
request, new MockHttpServletResponse());
request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
serviceContext = ServiceContextFactory.getInstance(request);
}
@Test
public void testActivityInterpreter() throws Exception {
addActivities();
long time = System.currentTimeMillis();
renameModels();
if (isSupportsTrash()) {
moveModelsToTrash();
checkLinks();
restoreModelsFromTrash();
}
checkInterpret(time);
}
protected abstract void addActivities() throws Exception;
protected void checkInterpret(long time) throws Exception {
List<SocialActivity> activities = getActivities();
Assert.assertFalse(activities.isEmpty());
Map<String, String> entryTitles = new HashMap<>();
SocialActivityInterpreter activityInterpreter =
getActivityInterpreter();
for (SocialActivity activity : activities) {
String title = activity.getExtraDataValue(
"title", serviceContext.getLocale());
if (isSupportsRename(activity.getClassName()) &&
Validator.isNotNull(title)) {
if (activity.getCreateDate() < time) {
entryTitles.put(activity.getClassName(), title);
}
else {
Assert.assertNotNull(
entryTitles.get(activity.getClassName()));
Assert.assertNotEquals(
entryTitles.get(activity.getClassName()), title);
}
}
if (hasClassName(activityInterpreter, activity.getClassName()) &&
hasActivityType(activity.getType())) {
SocialActivityFeedEntry activityFeedEntry =
activityInterpreter.interpret(activity, serviceContext);
Assert.assertNotNull(activityFeedEntry);
title = activityFeedEntry.getTitle();
Assert.assertFalse(
"Title contains parameters: " + title,
title.matches("\\{\\d\\}"));
}
}
}
protected void checkLinks() throws Exception {
List<SocialActivity> activities = getActivities();
Assert.assertFalse(activities.isEmpty());
SocialActivityInterpreter activityInterpreter =
getActivityInterpreter();
for (SocialActivity activity : activities) {
if (hasClassName(activityInterpreter, activity.getClassName()) &&
hasActivityType(activity.getType())) {
SocialActivityFeedEntry activityFeedEntry =
activityInterpreter.interpret(activity, serviceContext);
PortletURL portletURL = TrashUtil.getViewContentURL(
serviceContext.getRequest(), activity.getClassName(),
activity.getClassPK());
if (Validator.isNull(activityFeedEntry.getLink()) &&
(portletURL == null)) {
continue;
}
Assert.assertEquals(
portletURL.toString(), activityFeedEntry.getLink());
}
}
}
protected List<SocialActivity> getActivities() throws Exception {
List<SocialActivity> activities = new ArrayList<>(
SocialActivityLocalServiceUtil.getGroupActivities(
group.getGroupId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS));
Collections.reverse(activities);
return activities;
}
protected abstract SocialActivityInterpreter getActivityInterpreter();
protected SocialActivityInterpreter getActivityInterpreter(
String portletId, String className) {
try {
Registry registry = RegistryUtil.getRegistry();
Collection<SocialActivityInterpreter> socialActivityInterpreters =
registry.getServices(
SocialActivityInterpreter.class,
"(javax.portlet.name=" + portletId + ")");
for (SocialActivityInterpreter socialActivityInterpreter :
socialActivityInterpreters) {
if (ArrayUtil.contains(
socialActivityInterpreter.getClassNames(), className)) {
return socialActivityInterpreter;
}
}
throw new IllegalStateException(
"No activity interpreter found for class " + className);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
protected abstract int[] getActivityTypes();
protected boolean hasActivityType(int activityType) {
for (int curActivityType : getActivityTypes()) {
if (curActivityType == activityType) {
return true;
}
}
return false;
}
protected boolean hasClassName(
SocialActivityInterpreter activityInterpreter, String className) {
for (String curClassName : activityInterpreter.getClassNames()) {
if (curClassName.equals(className)) {
return true;
}
}
return false;
}
protected boolean isSupportsRename(String className) {
return true;
}
protected boolean isSupportsTrash() {
return true;
}
protected abstract void moveModelsToTrash() throws Exception;
protected abstract void renameModels() throws Exception;
protected abstract void restoreModelsFromTrash() throws Exception;
@DeleteAfterTestRun
protected Group group;
protected ServiceContext serviceContext;
}