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.group.Group;
import crmdna.group.Group.GroupProp;
import crmdna.user.User;
import crmdna.user.UserProp;
import crmdna.useractivity.UserActivity.EntityType;
import crmdna.useractivity.UserActivity.UserAction;
import crmdna.useractivity.UserActivityCore.UserActivityProp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class UserActivityHelperTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private final String invalidClient = "invalid";
private final String invalidUser = "invalid@login.com";
private UserProp validUserProp;
private GroupProp sgp;
private GroupProp kl;
private GroupProp sydney;
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
sgp = Group.create(client, "Singapore", User.SUPER_USER);
assertEquals(1, sgp.groupId);
kl = Group.create(client, "Malaysia/KL", User.SUPER_USER);
assertEquals(2, kl.groupId);
sydney = Group.create(client, "Australia/Sydney", User.SUPER_USER);
assertEquals(3, sydney.groupId);
validUserProp = User.create(client, "valid@login.com", sgp.groupId,
User.SUPER_USER);
assertEquals(1,
User.get(client, validUserProp.email).toProp(client).userId);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void getUserActivityTest() {
// client has to be valid
try {
UserActivity.getUserActivity(invalidClient, validUserProp.userId,
null, null, validUserProp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// login user should be valid
try {
UserActivity.getUserActivity(client, validUserProp.userId, null,
null, invalidUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
// user for whom activity is queried should be valid
try {
UserActivity.getUserActivity(client, 100, // 100 should be an
// invalid user id
null, null, validUserProp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
UserActivity.recordUserActivity(client, EntityType.MEMBER, 3,
UserAction.VIEW, null, validUserProp.email);
UserActivity.recordUserActivity(client, EntityType.MEMBER, 4,
UserAction.CREATE, "email: email@login.com",
validUserProp.email);
UserActivity.recordUserActivity(client, EntityType.MEMBER, 4,
UserAction.UPDATE,
"email: [email@login.com] ---> [email2@login.com]",
validUserProp.email);
ObjectifyFilter.complete();
List<UserActivityProp> props = UserActivity.getUserActivity(client,
validUserProp.userId, null, null, validUserProp.email);
// sorted in descending order of timestamp
assertEquals(3, props.size());
assertEquals(validUserProp.userId, props.get(2).userId);
assertEquals(UserAction.VIEW, props.get(2).userAction);
assertEquals(3, props.get(2).entityId);
assertEquals(EntityType.MEMBER, props.get(2).entityType);
assertEquals(null, props.get(2).change);
assertEquals(validUserProp.userId, props.get(1).userId);
assertEquals(UserAction.CREATE, props.get(1).userAction);
assertEquals(4, props.get(1).entityId);
assertEquals(EntityType.MEMBER, props.get(1).entityType);
assertEquals("email: email@login.com", props.get(1).change);
assertEquals(validUserProp.userId, props.get(0).userId);
assertEquals(UserAction.UPDATE, props.get(0).userAction);
assertEquals(4, props.get(0).entityId);
assertEquals(EntityType.MEMBER, props.get(0).entityType);
assertEquals("email: [email@login.com] ---> [email2@login.com]",
props.get(1).change);
}
@Test
public void recordUserActivityTest() throws InterruptedException {
// client has to be valid
try {
UserActivity.recordUserActivity(invalidClient, EntityType.MEMBER,
3, UserAction.VIEW, null, validUserProp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// login should be valid
try {
UserActivity.recordUserActivity(client, EntityType.MEMBER, 3,
UserAction.VIEW, null, invalidUser);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// Date start = new Date();
Thread.sleep(10);
UserActivity.recordUserActivity(client, EntityType.MEMBER, 3,
UserAction.VIEW, null, validUserProp.email);
Thread.sleep(10);
// Date end = new Date();
ObjectifyFilter.complete();
// List<UserActivityProp> props = UserActivity.getUserActivity(client,
// validUserProp.userId, null, null, validUserProp.email);
// work in progress
assertTrue(false);
}
}