package crmdna.useractivity; import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; import com.google.appengine.tools.development.testing.LocalServiceTestHelper; import com.googlecode.objectify.ObjectifyFilter; import crmdna.client.Client; import crmdna.common.api.APIException; import crmdna.common.api.APIResponse.Status; import crmdna.useractivity.UserActivityCore.UserActivityProp; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.Date; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class UserActivityTest { private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper( new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy()); private final String client = "isha"; private final String invalidClient = "invalid"; @Before public void setUp() { datastoreHelper.setUp(); ObjectifyFilter.complete(); Client.create(client); } @After public void tearDown() { ObjectifyFilter.complete(); datastoreHelper.tearDown(); } @Test public void getUserActivityTest() throws InterruptedException { // client has to be valid final long userId = 1; try { UserActivityCore.getUserActivity(invalidClient, userId, null, null); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode); } // zero records before recording any activity List<UserActivityProp> props = UserActivityCore.getUserActivity(client, userId, null, null); assertEquals(0, props.size()); Date start = new Date(); UserActivityCore.recordUserActivity(client, "GROUP", 3, "CREATE", null, userId + 2); // some // other // user id UserActivityCore.recordUserActivity(client, "MEMBER", 3, "VIEW", null, userId); int deltaMS = 100; Thread.sleep(deltaMS); Date startPlusDelta = new Date(); Thread.sleep(deltaMS); UserActivityCore.recordUserActivity(client, "MEMBER", 4, "CREATE", "email: email@login.com", userId); Thread.sleep(deltaMS); Date startPlus3Delta = new Date(); UserActivityCore.recordUserActivity(client, "MEMBER", 4, "UPDATE", "email: [email@login.com] ---> [email2@login.com]", userId); Thread.sleep(deltaMS); ObjectifyFilter.complete(); props = UserActivityCore.getUserActivity(client, userId, null, null); // do not specify start and end dates - should return all records // sorted in descending order of timestamp assertEquals(3, props.size()); assertEquals(userId, props.get(2).userId); assertEquals("VIEW", props.get(2).userAction); assertEquals(3, props.get(2).entityId); assertEquals("MEMBER", props.get(2).entityType); assertEquals(null, props.get(2).change); assertEquals(userId, props.get(1).userId); assertEquals("CREATE", props.get(1).userAction); assertEquals(4, props.get(1).entityId); assertEquals("MEMBER", props.get(1).entityType); assertEquals("email: email@login.com", props.get(1).change); assertEquals(userId, props.get(0).userId); assertEquals("UPDATE", props.get(0).userAction); assertEquals(4, props.get(0).entityId); assertEquals("MEMBER", props.get(0).entityType); assertEquals("email: [email@login.com] ---> [email2@login.com]", props.get(0).change); // specify start and end date props = UserActivityCore.getUserActivity(client, userId, start, startPlusDelta); assertEquals(1, props.size()); assertEquals(userId, props.get(0).userId); assertEquals("VIEW", props.get(0).userAction); assertEquals(3, props.get(0).entityId); assertEquals("MEMBER", props.get(0).entityType); assertEquals(null, props.get(0).change); // specify start but not end props = UserActivityCore.getUserActivity(client, userId, startPlus3Delta, null); assertEquals(1, props.size()); assertEquals(userId, props.get(0).userId); assertEquals("UPDATE", props.get(0).userAction); assertEquals(4, props.get(0).entityId); assertEquals("MEMBER", props.get(0).entityType); assertEquals("email: [email@login.com] ---> [email2@login.com]", props.get(0).change); // specify end but not start props = UserActivityCore.getUserActivity(client, userId, null, startPlusDelta); assertEquals(1, props.size()); assertEquals(userId, props.get(0).userId); assertEquals("VIEW", props.get(0).userAction); assertEquals(3, props.get(0).entityId); assertEquals("MEMBER", props.get(0).entityType); assertEquals(null, props.get(0).change); } @Test public void recordUserActivityTest() throws InterruptedException { final long userId = 1; // client has to be valid try { UserActivityCore.recordUserActivity(invalidClient, "MEMBER", 3, "VIEW", null, userId); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode); } Date start = new Date(); Thread.sleep(100); UserActivityCore.recordUserActivity(client, "MEMBER", 3, "VIEW", null, userId); Thread.sleep(100); Date end = new Date(); ObjectifyFilter.complete(); List<UserActivityProp> props = UserActivityCore.getUserActivity(client, userId, null, null); assertEquals(1, props.size()); // System.out.println("props.get(0: " + new Gson().toJson(props.get(0)) + // ", start: " + start + ", end: " + end); assertEquals("MEMBER", props.get(0).entityType); assertEquals(3, props.get(0).entityId); assertEquals(userId, props.get(0).userId); assertTrue(props.get(0).timestamp.getTime() > start.getTime()); assertTrue(props.get(0).timestamp.getTime() < end.getTime()); } @Test public void getEntityActivityTest() throws InterruptedException { final long userId = 1; // client has to be valid try { UserActivityCore.getEntityActivity(invalidClient, "MEMBER", 3, null, null); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode); } // no records if non existing entity List<UserActivityProp> userActivityProps = UserActivityCore.getEntityActivity(client, "MEMBER", 3, null, null); assertEquals(0, userActivityProps.size()); int deltaMS = 100; UserActivityCore.recordUserActivity(client, "MEMBER", 2, "VIEW", null, userId); Thread.sleep(deltaMS); Date startPlusDelta = new Date(); Thread.sleep(deltaMS); UserActivityCore.recordUserActivity(client, "MEMBER", 3, "UPDATE", "update 1", userId); Thread.sleep(deltaMS); Date startPlus3Delta = new Date(); UserActivityCore.recordUserActivity(client, "MEMBER", 3, "UPDATE", "update 2", userId); Thread.sleep(100); // do not specify start and end userActivityProps = UserActivityCore.getEntityActivity(client, "MEMBER", 3, null, null); assertEquals(2, userActivityProps.size()); assertEquals("MEMBER", userActivityProps.get(0).entityType); assertEquals(3, userActivityProps.get(0).entityId); assertEquals(userId, userActivityProps.get(0).userId); assertEquals("UPDATE", userActivityProps.get(0).userAction); assertEquals("update 2", userActivityProps.get(0).change); assertEquals("MEMBER", userActivityProps.get(1).entityType); assertEquals(3, userActivityProps.get(1).entityId); assertEquals(userId, userActivityProps.get(1).userId); assertEquals("UPDATE", userActivityProps.get(1).userAction); assertEquals("update 1", userActivityProps.get(1).change); // specify only start date userActivityProps = UserActivityCore.getEntityActivity(client, "MEMBER", 3, startPlus3Delta, null); assertEquals(1, userActivityProps.size()); assertEquals("MEMBER", userActivityProps.get(0).entityType); assertEquals(3, userActivityProps.get(0).entityId); assertEquals(userId, userActivityProps.get(0).userId); assertEquals("UPDATE", userActivityProps.get(0).userAction); assertEquals("update 2", userActivityProps.get(0).change); // specify only end date userActivityProps = UserActivityCore.getEntityActivity(client, "MEMBER", 3, null, startPlusDelta); assertEquals(0, userActivityProps.size()); } }