/* vim: set ts=2 et sw=2 cindent fo=qroca: */ package com.globant.katari.shindig.application; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.apache.shindig.auth.SecurityToken; import org.apache.shindig.common.testing.FakeGadgetToken; import org.apache.shindig.protocol.ProtocolException; import org.apache.shindig.protocol.RestfulCollection; import org.apache.shindig.protocol.model.SortOrder; import org.apache.shindig.social.core.model.ActivityImpl; import org.apache.shindig.social.opensocial.model.Activity; import org.apache.shindig.social.opensocial.spi.CollectionOptions; import org.apache.shindig.social.opensocial.spi.GroupId; import org.apache.shindig.social.opensocial.spi.UserId; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Restrictions; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.globant.katari.shindig.domain.Application; import com.globant.katari.shindig.domain.KatariActivity; import com.globant.katari.shindig.domain.SampleUser; import com.globant.katari.shindig.testsupport.SpringTestUtils; public class KatariActivityServiceTest { private KatariActivityService service; private String gadgetXmlUrl = "file:///" + new File( "src/test/resources/FullSampleGadget.xml").getAbsolutePath(); private String otheGadgetXmlUrl = "file:///" + new File( "src/test/resources/OtherSampleGadget.xml").getAbsolutePath(); private String newsFeedGadgetXmlUrl = "file:///" + new File( "src/test/resources/NewsFeedSampleGadget.xml").getAbsolutePath(); // This is the same applicationId but in string format. private String appId; private String userId1; private String userId2; private Session session; @Before public void setUp() { service = (KatariActivityService) SpringTestUtils.getBeanFactory().getBean( "shindig.activityService"); session = ((SessionFactory) SpringTestUtils.getBeanFactory() .getBean("katari.sessionFactory")).openSession(); session.createQuery("delete from KatariActivity").executeUpdate(); // Creates a sample application. session.createQuery("delete from Application").executeUpdate(); Application app = new Application(gadgetXmlUrl); session.saveOrUpdate(app); appId = gadgetXmlUrl; session.saveOrUpdate(new Application(otheGadgetXmlUrl)); session.saveOrUpdate(new Application(newsFeedGadgetXmlUrl)); session.createQuery("delete from CoreUser").executeUpdate(); SampleUser user = new SampleUser("test1"); session.saveOrUpdate(user); userId1 = session.createQuery("select id from CoreUser").uniqueResult() .toString(); user = new SampleUser("test2"); session.saveOrUpdate(user); userId2 = session.createQuery( "select id from CoreUser where name = 'test2'").uniqueResult() .toString(); } @After public void tearDown() { session.createQuery("delete from KatariActivity").executeUpdate(); session.close(); } @Test public void testGetActivities_singleActivity() throws Exception { createSampleActivity(userId1, "title", appId); Set<UserId> userIds = new HashSet<UserId>(); userIds.add(new UserId(UserId.Type.userId, userId1)); GroupId groupId = new GroupId(GroupId.Type.self, null); CollectionOptions options = new CollectionOptions(); options.setMax(10); SecurityToken token = new FakeGadgetToken(); List<Activity> activities = service.getActivities( userIds, groupId, appId, null, options, token).get().getEntry(); assertThat(activities.size(), is(1)); assertThat(activities.get(0).getAppId(), is(appId)); assertThat(activities.get(0).getTitle(), is("title")); assertThat(activities.get(0).getUserId(), is(userId1)); } @Test public void testGetActivities_paged() throws Exception { // Create 20 activities for the same user for (int i = 1; i <= 20; i ++) { createSampleActivity(userId1, "title-" + i, appId); } Set<UserId> userIds = new HashSet<UserId>(); userIds.add(new UserId(UserId.Type.userId, userId1)); GroupId groupId = new GroupId(GroupId.Type.self, null); CollectionOptions options = new CollectionOptions(); options.setMax(10); SecurityToken token = new FakeGadgetToken(); // finds the first 10 activities. options.setFirst(0); List<Activity> activities = service.getActivities( userIds, groupId, appId, null, options, token).get().getEntry(); assertThat(activities.size(), is(10)); assertThat(activities.get(0).getAppId(), is(appId)); assertThat(activities.get(0).getTitle(), is("title-1")); assertThat(activities.get(0).getUserId(), is(userId1)); assertThat(activities.get(9).getTitle(), is("title-10")); // finds the last 10 activities. options.setFirst(10); activities = service.getActivities( userIds, groupId, appId, null, options, token) .get().getEntry(); assertThat(activities.size(), is(10)); assertThat(activities.get(0).getAppId(), is(appId)); assertThat(activities.get(0).getTitle(), is("title-11")); assertThat(activities.get(0).getUserId(), is(userId1)); assertThat(activities.get(9).getTitle(), is("title-20")); } @Test public void testGetActivities_sorted() throws Exception { createSampleActivity(userId1, "title-1", appId); createSampleActivity(userId1, "title-2", appId); Set<UserId> userIds = new HashSet<UserId>(); userIds.add(new UserId(UserId.Type.userId, userId1)); GroupId groupId = new GroupId(GroupId.Type.self, null); CollectionOptions options = new CollectionOptions(); // Looks like the default, by looking at shindig sources. options.setMax(20); SecurityToken token = new FakeGadgetToken(); List<Activity> activities; options.setSortBy("title"); // Default sort order, should be asc. activities = service.getActivities( userIds, groupId, appId, null, options, token).get().getEntry(); assertThat(activities.size(), is(2)); assertThat(activities.get(0).getTitle(), is("title-1")); assertThat(activities.get(1).getTitle(), is("title-2")); options.setSortOrder(SortOrder.ascending); activities = service.getActivities( userIds, groupId, appId, null, options, token).get().getEntry(); assertThat(activities.size(), is(2)); assertThat(activities.get(0).getTitle(), is("title-1")); assertThat(activities.get(1).getTitle(), is("title-2")); options.setSortOrder(SortOrder.descending); activities = service.getActivities( userIds, groupId, appId, null, options, token).get().getEntry(); assertThat(activities.size(), is(2)); assertThat(activities.get(0).getTitle(), is("title-2")); assertThat(activities.get(1).getTitle(), is("title-1")); } @Test public void testGetActivities_withActivityId() throws Exception { createSampleActivity(userId1, "title-1", appId); createSampleActivity(userId1, "title-2", appId); createSampleActivity(userId1, "title-3", appId); List<?> idList; idList = session.createQuery("select id from KatariActivity").list(); // These are here to make sure that we do not match the wrong user or // app-id. createSampleActivity(userId1, "title-3", appId); createSampleActivity(userId2, "title-3", appId); UserId userId = new UserId(UserId.Type.userId, userId1); GroupId groupId = new GroupId(GroupId.Type.self, null); CollectionOptions options = new CollectionOptions(); // Looks like the default, by looking at shindig sources. options.setMax(20); SecurityToken token = new FakeGadgetToken(); Set<String> activityIds = new HashSet<String>(); for (Object o: idList) { activityIds.add(o.toString()); } List<Activity> activities = service.getActivities(userId, groupId, appId, null, options, activityIds, token).get().getEntry(); assertThat(activities.size(), is(3)); assertThat(activities.get(0).getTitle(), is("title-1")); assertThat(activities.get(1).getTitle(), is("title-2")); assertThat(activities.get(2).getTitle(), is("title-3")); } @Test public void testGetActivity() throws Exception { createSampleActivity(userId1, "title", appId); String id = session.createQuery("select id from KatariActivity") .uniqueResult().toString(); UserId userId = (new UserId(UserId.Type.userId, userId1)); GroupId groupId = new GroupId(GroupId.Type.self, null); // Looks like the default, by looking at shindig sources. SecurityToken token = new FakeGadgetToken(); Activity activity = service.getActivity(userId, groupId, appId, null, id, token).get(); assertThat(activity.getAppId(), is(appId)); assertThat(activity.getTitle(), is("title")); assertThat(activity.getUserId(), is(userId1)); } @Test public void testCreateActivity() { createSampleActivity(userId1, "title", appId); KatariActivity activity = (KatariActivity) session.createQuery( "from KatariActivity where title = 'title'").uniqueResult(); assertThat(activity.getAppId(), is(appId)); assertThat(activity.getTitle(), is("title")); assertThat(activity.getUserId(), is(userId1)); } @Test public void testDeleteActivities() { } @Test public void testGetActivities_news_feed() throws Exception { service.setNewsFeedApplicationId(newsFeedGadgetXmlUrl); createSampleActivity(userId1, "title-1", appId); createSampleActivity(userId1, "title-2", otheGadgetXmlUrl); createSampleActivity(userId1, "title-3", appId); createSampleActivity(userId1, "title-4", otheGadgetXmlUrl); Set<UserId> userIds = new HashSet<UserId>(); userIds.add(new UserId(UserId.Type.userId, userId1)); GroupId groupId = new GroupId(GroupId.Type.self, null); // Looks like the default, by looking at shindig sources. SecurityToken token = new FakeGadgetToken(); CollectionOptions options = new CollectionOptions(); options.setMax(20); RestfulCollection<Activity> activitiesCollection; activitiesCollection = service.getActivities(userIds, groupId, newsFeedGadgetXmlUrl, null, options, token).get(); List<Activity> activities = activitiesCollection.getEntry(); assertThat(4, is(activities.size())); for (int i = 0; i < 4; i ++) { assertThat(activities.get(i).getTitle(), equalTo("title-" + (i + 1))); } } @Test public void testGetActivities_katariActivyFilter() throws Exception { service.setNewsFeedApplicationId(newsFeedGadgetXmlUrl); service.setKatariActivityFilter(new KatariActivyFilterTestImpl()); createSampleActivity(userId1, "title-1", appId); createSampleActivity(userId1, "title-2", otheGadgetXmlUrl); createSampleActivity(userId1, "title-3", appId); createSampleActivity(userId1, "title-4", otheGadgetXmlUrl); Set<UserId> userIds = new HashSet<UserId>(); userIds.add(new UserId(UserId.Type.userId, userId1)); GroupId groupId = new GroupId(GroupId.Type.self, null); // Looks like the default, by looking at shindig sources. SecurityToken token = new FakeGadgetToken(); CollectionOptions options = new CollectionOptions(); options.setMax(20); RestfulCollection<Activity> activitiesCollection; activitiesCollection = service.getActivities(userIds, groupId, newsFeedGadgetXmlUrl, null, options, token).get(); List<Activity> activities = activitiesCollection.getEntry(); assertThat(0, is(activities.size())); } /** Creates a sample activity for the provided user id. * * @param userId the userId of the sample activity. It cannot be null. * * @param title the activity title. It cannot be null. */ private void createSampleActivity(final String userId, final String title, final String appId) { Activity activity = new ActivityImpl(); activity.setTitle(title); service.createActivity(new UserId(UserId.Type.userId, userId), new GroupId(GroupId.Type.self, "@self"), appId, null, activity, null); } class KatariActivyFilterTestImpl implements KatariActivityFilter { public void resolveSocialGraph(final Criteria criteria, final List<Long> userIds, final GroupId groupId) { Long user = userIds.get(0); if (user.toString().equals(userId1)) { switch (groupId.getType()) { case self: criteria.createCriteria("user").add(Restrictions.ne("id", userIds.get(0))); break; default: throw new ProtocolException(HttpServletResponse.SC_BAD_REQUEST, "Group parameter not supported"); } } } } }