/* * Copyright (c) 2009-2011 Lockheed Martin Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.eurekastreams.server.persistence.mappers.cache; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.List; import javax.persistence.PersistenceException; import org.eurekastreams.server.persistence.mappers.DomainMapper; import org.eurekastreams.server.persistence.mappers.MapperTest; import org.eurekastreams.server.persistence.mappers.cache.testhelpers.SimpleMemoryCache; import org.eurekastreams.server.persistence.mappers.db.GetFollowedGroupIdsForPersonByIdDbMapper; import org.eurekastreams.server.persistence.mappers.db.GetFollowerPersonIdsForGroupByIdDbMapper; import org.eurekastreams.server.persistence.strategies.DomainGroupQueryStrategy; import org.jmock.Expectations; import org.jmock.integration.junit4.JUnit4Mockery; import org.jmock.lib.legacy.ClassImposteriser; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Class responsible for testing the AddCachedGroupFollower class. */ public class AddCachedGroupFollowerTest extends MapperTest { /** * Cache fed into the loader. */ private Cache cache; /** * Local instance of GetFollowedGroupids for test. */ private GetFollowedGroupIdsForPersonByIdDbMapper followedGroupIdsMapper; /** * Local instance of GetGroupFollowerIds for test. */ private GetFollowerPersonIdsForGroupByIdDbMapper followerIdsMapper; /** * System under test. */ private AddCachedGroupFollower sut; /** * Cache loader for person. */ private DomainGroupCacheLoader domainGroupCacheLoader; /** * Test person id from data set. */ private static final Long TEST_PERSON_ID_1 = new Long(98L); /** * Test person id from data set. */ private static final Long TEST_PERSON_ID_2 = new Long(99L); /** * Test person id from data set. */ private static final Long TEST_PERSON_ID_3 = new Long(142L); /** * Test person id from data set. */ private static final Long TEST_PERSON_ID_4 = new Long(42L); /** * Test person id from data set. */ private static final Long TEST_GROUP_ID_1 = new Long(1L); /** * Setup method to prepare the test suite. */ @Before public void setup() { cache = new SimpleMemoryCache(); domainGroupCacheLoader = new DomainGroupCacheLoader(new DomainGroupQueryStrategy()); domainGroupCacheLoader.setCache(cache); domainGroupCacheLoader.setEntityManager(getEntityManager()); domainGroupCacheLoader.initialize(); followedGroupIdsMapper = new GetFollowedGroupIdsForPersonByIdDbMapper(); followedGroupIdsMapper.setEntityManager(getEntityManager()); followerIdsMapper = new GetFollowerPersonIdsForGroupByIdDbMapper(); followerIdsMapper.setEntityManager(getEntityManager()); sut = new AddCachedGroupFollower(followedGroupIdsMapper, followerIdsMapper); sut.setCache(cache); sut.setEntityManager(getEntityManager()); } /** * Tear-down method. */ @After public void tearDown() { getEntityManager().clear(); } /** * Test adding group followers. */ @Test public void testExecute() { // Retrieve the list of users following group1. List<Long> groupFollowerIds = cache.getList(CacheKeys.FOLLOWERS_BY_GROUP + TEST_GROUP_ID_1); assertEquals(3, groupFollowerIds.size()); // Assert that smithers, mrburns, and fordp are all following group 1. assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_1)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_2)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_4)); // Retrieve the list of groups that fordp2 is following. This should be none. List<Long> groupIdsFollowing = cache.getList(CacheKeys.GROUPS_FOLLOWED_BY_PERSON + TEST_PERSON_ID_3); assertNull(groupIdsFollowing); // Add fordp2 as a follower to group 1. sut.execute(TEST_PERSON_ID_3, TEST_GROUP_ID_1); // Test that fordp2 was added to the followers of the group. List<Long> updatedGroupFollowerIds = cache.getList(CacheKeys.FOLLOWERS_BY_GROUP + TEST_GROUP_ID_1); assertEquals(4, updatedGroupFollowerIds.size()); // Assert that smithers, mrburns, fordp, and fordp2 are all following group 1. assertTrue(updatedGroupFollowerIds.contains(TEST_PERSON_ID_1)); assertTrue(updatedGroupFollowerIds.contains(TEST_PERSON_ID_2)); assertTrue(updatedGroupFollowerIds.contains(TEST_PERSON_ID_3)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_4)); List<Long> updatedGroupIdsFollowing = cache.getList(CacheKeys.GROUPS_FOLLOWED_BY_PERSON + TEST_PERSON_ID_3); assertEquals(1, updatedGroupIdsFollowing.size()); // Assert that fordp2 is now following group1. assertTrue(updatedGroupIdsFollowing.contains(TEST_GROUP_ID_1)); } /** * Test adding group followers. */ @Test public void testExecuteAddFollowerWhoIsAlreadyAdded() { // Retrieve the list of users following group1. List<Long> groupFollowerIds = cache.getList(CacheKeys.FOLLOWERS_BY_GROUP + TEST_GROUP_ID_1); assertEquals(3, groupFollowerIds.size()); // Assert that smithers, mrburns, and fordp are all following group 1. assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_1)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_2)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_4)); List<Long> groupIdsFollowing = cache.getList(CacheKeys.GROUPS_FOLLOWED_BY_PERSON + TEST_PERSON_ID_1); assertEquals(1, groupIdsFollowing.size()); // Assert that smithers is following group1. assertTrue(groupIdsFollowing.contains(TEST_GROUP_ID_1)); // Add smithers as a follower to group 1. sut.execute(TEST_PERSON_ID_1, TEST_GROUP_ID_1); // Test that the followers of the group are unchanged. List<Long> updatedGroupFollowerIds = cache.getList(CacheKeys.FOLLOWERS_BY_GROUP + TEST_GROUP_ID_1); assertEquals(3, updatedGroupFollowerIds.size()); // Assert that smithers, mrburns, and fordp are all following group 1. assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_1)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_2)); assertTrue(groupFollowerIds.contains(TEST_PERSON_ID_4)); List<Long> updatedGroupIdsFollowing = cache.getList(CacheKeys.GROUPS_FOLLOWED_BY_PERSON + TEST_PERSON_ID_1); assertEquals(1, updatedGroupIdsFollowing.size()); // Assert that smithers is still following group1. assertTrue(updatedGroupIdsFollowing.contains(TEST_GROUP_ID_1)); } /** * Test adding group followers. */ @Test public void testExecuteException() { /** Used for mocking objects. */ JUnit4Mockery mockContext = new JUnit4Mockery() { { setImposteriser(ClassImposteriser.INSTANCE); } }; final DomainMapper followerMapper = mockContext.mock(DomainMapper.class, "followerMapper"); final DomainMapper followedMapper = mockContext.mock(DomainMapper.class, "followedMapper"); sut = new AddCachedGroupFollower(followedMapper, followerMapper); mockContext.checking(new Expectations() { { allowing(followerMapper).execute(TEST_GROUP_ID_1); will(throwException(new PersistenceException())); allowing(followedMapper).execute(TEST_GROUP_ID_1); will(throwException(new PersistenceException())); } }); assertFalse(sut.execute(TEST_PERSON_ID_1, TEST_GROUP_ID_1)); mockContext.assertIsSatisfied(); } }