/* * Copyright (C) 2003-2011 eXo Platform SAS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.exoplatform.social.core.storage.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.exoplatform.container.xml.InitParams; import org.exoplatform.social.core.BaseActivityProcessorPlugin; import org.exoplatform.social.core.activity.model.ExoSocialActivity; import org.exoplatform.social.core.activity.model.ExoSocialActivityImpl; import org.exoplatform.social.core.application.RelationshipPublisher.TitleId; import org.exoplatform.social.core.identity.model.Identity; import org.exoplatform.social.core.identity.provider.SpaceIdentityProvider; import org.exoplatform.social.core.space.impl.DefaultSpaceApplicationHandler; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.storage.ActivityStorageException; import org.exoplatform.social.core.storage.api.IdentityStorage; import org.exoplatform.social.core.storage.api.RelationshipStorage; import org.exoplatform.social.core.test.AbstractCoreTest; /** * @author <a href="mailto:alain.defrance@exoplatform.com">Alain Defrance</a> * @version $Revision$ */ public class ActivityStorageImplTestCase extends AbstractCoreTest { private IdentityStorage identityStorage; private ActivityStorageImpl activityStorage; private RelationshipStorage relationshipStorage; private List<ExoSocialActivity> tearDownActivityList; private Identity rootIdentity; private Identity johnIdentity; private Identity maryIdentity; private Identity demoIdentity; @Override protected void setUp() throws Exception { super.setUp(); identityStorage = (IdentityStorage) getContainer().getComponentInstanceOfType(IdentityStorage.class); activityStorage = (ActivityStorageImpl) getContainer().getComponentInstanceOfType(ActivityStorageImpl.class); relationshipStorage = (RelationshipStorage) getContainer().getComponentInstanceOfType(RelationshipStorage.class); assertNotNull(identityStorage); assertNotNull(activityStorage); assertNotNull(relationshipStorage); rootIdentity = new Identity("organization", "root"); johnIdentity = new Identity("organization", "john"); maryIdentity = new Identity("organization", "mary"); demoIdentity = new Identity("organization", "demo"); identityStorage.saveIdentity(rootIdentity); identityStorage.saveIdentity(johnIdentity); identityStorage.saveIdentity(maryIdentity); identityStorage.saveIdentity(demoIdentity); assertNotNull(rootIdentity.getId()); assertNotNull(johnIdentity.getId()); assertNotNull(maryIdentity.getId()); assertNotNull(demoIdentity.getId()); tearDownActivityList = new ArrayList<ExoSocialActivity>(); } @Override protected void tearDown() throws Exception { for (ExoSocialActivity activity : tearDownActivityList) { activityStorage.deleteActivity(activity.getId()); } identityStorage.deleteIdentity(rootIdentity); identityStorage.deleteIdentity(johnIdentity); identityStorage.deleteIdentity(maryIdentity); identityStorage.deleteIdentity(demoIdentity); super.tearDown(); } public void testSaveActivity() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title "); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); assertEquals(activity.getId(), got.getId()); assertEquals(activity.getTitle(), got.getTitle()); } public void testUpdateActivity() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("&"); activity.setBody("test&"); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); got.setBody(null); got.setTitle(null); activityStorage.updateActivity(got); ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId()); assertEquals(activity.getId(), got.getId()); assertEquals(activity.getTitle(), got.getTitle()); } public void testUpdateActivityForLike() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("&"); activity.setBody("test&"); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); got.setBody(null); got.setTitle(null); got.setLikeIdentityIds(new String[] {maryIdentity.getId()}); activityStorage.updateActivity(got); ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId()); assertEquals(got.getId(), updatedActivity.getId()); assertEquals(got.getTitle(), updatedActivity.getTitle()); assertEquals(got.getBody(), updatedActivity.getBody()); } /** * Wrong due to not set: * got.setBody(null); * got.setTitle(null); * before invokes: activityStorage.updateActivity(got); * @throws Exception */ public void testUpdateActivityForWrong() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("&"); activity.setBody("test&"); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); got.setLikeIdentityIds(new String[] {maryIdentity.getId()}); activityStorage.updateActivity(got); ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId()); assertEquals(got.getId(), updatedActivity.getId()); assertNotSame(got.getTitle(), updatedActivity.getTitle()); assertNotSame(got.getBody(), updatedActivity.getBody()); } public void testUpdateActivityForUnLike() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title "); activity.setLikeIdentityIds(new String[] {maryIdentity.getId()}); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); got.setBody(null); got.setTitle(null); got.setLikeIdentityIds(new String[] {}); activityStorage.updateActivity(got); ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId()); assertEquals(got.getId(), updatedActivity.getId()); assertEquals(got.getTitle(), updatedActivity.getTitle()); assertEquals(got.getBody(), updatedActivity.getBody()); } /** * Wrong due to not set: * got.setBody(null); * got.setTitle(null); * before invokes: activityStorage.updateActivity(got); * @throws Exception */ public void testUpdateActivityForUnLikeWrong() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("&"); activity.setBody("test&"); activity.setLikeIdentityIds(new String[] {maryIdentity.getId()}); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); got.setLikeIdentityIds(new String[] {}); activityStorage.updateActivity(got); ExoSocialActivity updatedActivity = activityStorage.getActivity(activity.getId()); assertEquals(got.getId(), updatedActivity.getId()); assertNotSame(got.getTitle(), updatedActivity.getTitle()); assertNotSame(got.getBody(), updatedActivity.getBody()); } public void testSaveComment() throws Exception { // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("activity "); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); assertEquals(activity.getId(), got.getId()); assertEquals(activity.getTitle(), got.getTitle()); // ExoSocialActivity comment = new ExoSocialActivityImpl(); comment.setTitle("comment"); comment.setUserId(rootIdentity.getId()); activityStorage.saveComment(activity, comment); assertNotNull(comment.getId()); // ExoSocialActivity gotComment = activityStorage.getActivity(comment.getId()); assertEquals(comment.getId(), gotComment.getId()); assertEquals(comment.getTitle(), gotComment.getTitle()); // ExoSocialActivity gotParentActivity = activityStorage.getParentActivity(comment); assertEquals(activity.getId(), gotParentActivity.getId()); assertEquals(activity.getTitle(), gotParentActivity.getTitle()); assertEquals(1, activity.getReplyToId().length); assertEquals(comment.getId(), activity.getReplyToId()[0]); } public void testActivityCount() throws Exception { // fill 10 activities for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title " + i); activityStorage._createActivity(rootIdentity, activity); } // assertEquals(10, activityStorage.getNumberOfUserActivities(rootIdentity)); // remove 5 activities Iterator<ExoSocialActivity> it = activityStorage.getUserActivities(rootIdentity).iterator(); for (int i = 0; i < 5; ++i) { activityStorage.deleteActivity(it.next().getId()); } // assertEquals(5, activityStorage.getNumberOfUserActivities(rootIdentity)); } /** * Test {@link org.exoplatform.social.core.storage.impl.ActivityStorageImpl#getActivity(String)} */ public void testUserPostActivityToSpace() throws ActivityStorageException { // Create new Space and its Identity Space space = getSpaceInstance(); SpaceIdentityProvider spaceIdentityProvider = (SpaceIdentityProvider) getContainer().getComponentInstanceOfType(SpaceIdentityProvider.class); Identity spaceIdentity = spaceIdentityProvider.createIdentity(space); identityStorage.saveIdentity(spaceIdentity); // john posted activity on created Space ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("Space's Activity"); activity.setUserId(johnIdentity.getId()); activityStorage.saveActivity(spaceIdentity, activity); // Get posted Activity and check ExoSocialActivity gotActivity = activityStorage.getActivity(activity.getId()); assertEquals("userId must be " + johnIdentity.getId(), johnIdentity.getId(), gotActivity.getUserId()); identityStorage.deleteIdentity(spaceIdentity); } public void testActivityOrder() throws Exception { // fill 10 activities for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title " + i); activityStorage._createActivity(rootIdentity, activity); } int i = 9; for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) { assertEquals("title " + i, activity.getTitle()); --i; } } public void testActivityOrderByPostedTime() throws Exception { // fill 10 activities Calendar cal = Calendar.getInstance(); long today = cal.getTime().getTime(); cal.add(Calendar.DAY_OF_MONTH, -1); long yesterday = cal.getTime().getTime(); //i > 5 PostedTime = currentDate + i; //else yesterdayDate = currentDate + i; for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title " + i); activity.setPostedTime(i> 5 ? today + i : yesterday + i); activityStorage._createActivity(rootIdentity, activity); } int i = 9; for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) { assertEquals("title " + i, activity.getTitle()); if (i>5) { assertEquals(today + i, activity.getPostedTime().longValue()); } else { assertEquals(yesterday + i, activity.getPostedTime().longValue()); } --i; } } public void testActivityOrder2() throws Exception { // fill 10 activities for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title " + i); activityStorage._createActivity(rootIdentity, activity); } // remove 5 activities Iterator<ExoSocialActivity> it = activityStorage.getUserActivities(rootIdentity).iterator(); for (int i = 0; i < 5; ++i) { activityStorage.deleteActivity(it.next().getId()); } // fill 10 others for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title " + i); activityStorage._createActivity(rootIdentity, activity); } List<ExoSocialActivity> activityies = activityStorage.getUserActivities(rootIdentity); int i = 0; int[] values = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4, 3, 2, 1, 0}; for (ExoSocialActivity activity : activityies) { assertEquals("title " + values[i], activity.getTitle()); ++i; } } public void testCommentOrder() throws Exception { // fill 10 activities for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("title " + i); activityStorage._createActivity(rootIdentity, activity); // fill 10 comments for each activity for(int j = 0; j < 10; ++j) { ExoSocialActivity comment = new ExoSocialActivityImpl(); comment.setTitle("title " + i + j); comment.setUserId(rootIdentity.getId()); activityStorage.saveComment(activity, comment); } } int i = 9; for (ExoSocialActivity activity : activityStorage.getUserActivities(rootIdentity)) { int j = 0; for (String commentId : activity.getReplyToId()) { if (!"".equals(commentId)) { assertEquals("title " + i + j, activityStorage.getActivity(commentId).getTitle()); ++j; } } --i; } } public void testDeleteComment() throws Exception { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("activity title"); activityStorage.saveActivity(rootIdentity, activity); activity = activityStorage.getActivity(activity.getId()); for (int i = 0; i < 10; ++i) { ExoSocialActivity comment = new ExoSocialActivityImpl(); comment.setTitle("comment title " + i); comment.setUserId(rootIdentity.getId()); activityStorage.saveComment(activity, comment); } assertEquals(10, activityStorage.getActivity(activity.getId()).getReplyToId().length); int i = 0; activity = activityStorage.getActivity(activity.getId()); for (String commentId : activity.getReplyToId()) { if (!"".equals(commentId) && i < 5) { activityStorage.deleteActivity(commentId); ++i; } } assertEquals(5, activityStorage.getActivity(activity.getId()).getReplyToId().length); } public void testLike() throws Exception { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("activity title"); activityStorage.saveActivity(rootIdentity, activity); activity.setLikeIdentityIds(new String[] {rootIdentity.getId(), johnIdentity.getId(), demoIdentity.getId()}); activityStorage.saveActivity(rootIdentity, activity); List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity); assertEquals(1, activities.size()); assertEquals(3, activities.get(0).getLikeIdentityIds().length); List<String> ids = Arrays.asList(activities.get(0).getLikeIdentityIds()); assertTrue(ids.contains(rootIdentity.getId())); assertTrue(ids.contains(johnIdentity.getId())); assertTrue(ids.contains(demoIdentity.getId())); assertTrue(!ids.contains(maryIdentity.getId())); } public void testContactActivities() throws Exception { // assertEquals(0, activityStorage.getActivitiesOfIdentities(Arrays.asList(rootIdentity, johnIdentity), 0, 100).size()); for (int i = 0; i < 10; ++i) { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("root activity " + i); activityStorage.saveActivity(rootIdentity, activity); ExoSocialActivity activity2 = new ExoSocialActivityImpl(); activity2.setTitle("john activity " + i); activityStorage.saveActivity(johnIdentity, activity2); ExoSocialActivity activity3 = new ExoSocialActivityImpl(); activity3.setTitle("mary activity " + i); activityStorage.saveActivity(maryIdentity, activity3); } // List<ExoSocialActivity> activities = activityStorage.getActivitiesOfIdentities(Arrays.asList(rootIdentity, johnIdentity), 0, 100); assertEquals(20, activities.size()); int i = 9; Iterator<ExoSocialActivity> it = activities.iterator(); while (it.hasNext()) { ExoSocialActivity activity = it.next(); assertEquals("john activity " + i, activity.getTitle()); activity = it.next(); assertEquals("root activity " + i, activity.getTitle()); --i; } } public void testTimeStamp() throws Exception { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("activity title"); activityStorage.saveActivity(rootIdentity, activity); ExoSocialActivity comment = new ExoSocialActivityImpl(); comment.setUserId(rootIdentity.getId()); comment.setTitle("comment title"); activityStorage.saveComment(activity, comment); List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity); assertEquals(1, activities.size()); assertFalse(activities.get(0).getPostedTime() == 0); assertEquals(1, activities.get(0).getReplyToId().length); ExoSocialActivity gotComment = activityStorage.getActivity(activities.get(0).getReplyToId()[0]); assertFalse(gotComment.getPostedTime() == 0); } public void testRelationshipActivity() throws Exception { ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("I am now connected with @receiverRemoteId"); activity.setType("exosocial:relationship"); //Shindig's Activity's fields activity.setAppId("appId"); activity.setBody("body"); activity.setBodyId("bodyId"); activity.setTitleId(TitleId.CONNECTION_REQUESTED.toString()); activity.setExternalId("externalId"); //activity.setId("id"); activity.setUrl("http://www.exoplatform.org"); activity.setUserId(demoIdentity.getId()); Map<String,String> params = new HashMap<String,String>(); params.put("SENDER", "senderRemoteId"); params.put("RECEIVER", "receiverRemoteId"); params.put("RELATIONSHIP_UUID", "relationship_id"); activity.setTemplateParams(params); activityStorage.saveActivity(rootIdentity, activity); List<ExoSocialActivity> activities = activityStorage.getUserActivities(rootIdentity); assertNotNull(activities); assertEquals(1, activities.size()); for(ExoSocialActivity element : activities) { //title assertNotNull(element.getTitle()); //type assertNotNull(element.getType()); //appId assertNotNull(element.getAppId()); //body assertNotNull(element.getBody()); //bodyId assertNotNull(element.getBodyId()); //titleId assertEquals(TitleId.CONNECTION_REQUESTED.toString(), element.getTitleId()); //externalId assertNotNull(element.getExternalId()); //id //assertNotNull(element.getId()); //url assertEquals("http://www.exoplatform.org", element.getUrl()); //id assertNotNull(element.getUserId()); //templateParams assertNotNull(element.getTemplateParams()); } } public void testActivityProcessing() throws Exception { // BaseActivityProcessorPlugin processor = new DummyProcessor(null); activityStorage.getActivityProcessors().add(processor); // ExoSocialActivity activity = new ExoSocialActivityImpl(); activity.setTitle("activity"); activityStorage._createActivity(rootIdentity, activity); assertNotNull(activity.getId()); // ExoSocialActivity got = activityStorage.getActivity(activity.getId()); assertEquals(activity.getId(), got.getId()); assertEquals("edited", got.getTitle()); // ExoSocialActivity comment = new ExoSocialActivityImpl(); comment.setTitle("comment"); comment.setUserId(rootIdentity.getId()); activityStorage.saveComment(activity, comment); assertNotNull(comment.getId()); // ExoSocialActivity gotComment = activityStorage.getActivity(comment.getId()); assertEquals(comment.getId(), gotComment.getId()); assertEquals("edited", gotComment.getTitle()); // ExoSocialActivity gotParentActivity = activityStorage.getParentActivity(comment); assertEquals(activity.getId(), gotParentActivity.getId()); assertEquals("edited", gotParentActivity.getTitle()); assertEquals(1, activity.getReplyToId().length); assertEquals(comment.getId(), activity.getReplyToId()[0]); // activityStorage.getActivityProcessors().remove(processor); } /** * Gets an instance of Space. * * @return an instance of space */ private Space getSpaceInstance() { Space space = new Space(); space.setDisplayName("my space"); space.setRegistration(Space.OPEN); space.setDescription("add new space"); space.setType(DefaultSpaceApplicationHandler.NAME); space.setVisibility(Space.PUBLIC); space.setPriority(Space.INTERMEDIATE_PRIORITY); space.setGroupId("/space/space"); String[] managers = new String[] {"john", "demo"}; space.setManagers(managers); return space; } class DummyProcessor extends BaseActivityProcessorPlugin { DummyProcessor(final InitParams params) { super(params); } @Override public void processActivity(final ExoSocialActivity activity) { activity.setTitle("edited"); } } // TODO : test many days }