package crmdna.user;
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.App;
import crmdna.user.User.ClientLevelPrivilege;
import crmdna.user.User.GroupLevelPrivilege;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class UserTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
// local implementation / test harness implementation becomes HRD
// only if setApplyAllHighRepJobPolicy is set. If the implementation is not
// HRD then
// cross group transactions would fail (as master slave does not support it)
String client = "isha";
GroupProp sgp;
GroupProp kl;
UserProp userWithPermission;
UserProp userWOPermission;
@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, "KL", User.SUPER_USER);
assertEquals(2, kl.groupId);
userWithPermission = User.create(client, "userwithpermission@dummy.com", sgp.groupId, User.SUPER_USER);
assertEquals(1, userWithPermission.userId);
User.addClientLevelPrivilege(client, userWithPermission.email, ClientLevelPrivilege.UPDATE_USER,
User.SUPER_USER);
userWOPermission = User.create(client, "userwopermission@dummy.com", sgp.groupId, User.SUPER_USER);
assertEquals(2, userWOPermission.userId);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test(expected = APIException.class)
public void cannotCreateUserForInvalidClient() {
User.create("invalidClient", "dummy@dummy.com", sgp.groupId, User.SUPER_USER);
assertTrue(false);
}
@Test(expected = APIException.class)
public void cannotCreateUserForInvalidGroup() {
long invalidGroupId = sgp.groupId + 100;
User.create(client, "dummy@dummy.com", invalidGroupId, User.SUPER_USER);
assertTrue(false);
}
@Test(expected = APIException.class)
public void cannotCreateUserForInvalidEmail() {
String invalidEmail = "invalid";
User.create(client, invalidEmail, sgp.groupId, User.SUPER_USER);
assertTrue(false);
}
@Test
public void userWithPermissionCanCreateUser() {
User.create(client, "dummy@dummy.com", sgp.groupId, userWithPermission.email);
// no exception
}
@Test
public void userIdsAreInSequence() {
UserProp userProp1 = User.create(client, "dummy1@dummy.com", sgp.groupId, userWithPermission.email);
UserProp userProp2 = User.create(client, "dummy2@dummy.com", sgp.groupId, userWithPermission.email);
UserProp userProp3 = User.create(client, "dummy3@dummy.com", sgp.groupId, userWithPermission.email);
UserProp userProp4 = User.create(client, "dummy4@dummy.com", sgp.groupId, userWithPermission.email);
assertEquals(userProp1.userId + 1, userProp2.userId);
assertEquals(userProp2.userId + 1, userProp3.userId);
assertEquals(userProp3.userId + 1, userProp4.userId);
}
@Test(expected = APIException.class)
public void userWOPermissionCannotCreateUser() {
User.create(client, "dummy1@dummy.com", sgp.groupId, userWOPermission.email);
}
@Test(expected = APIException.class)
public void cannotCreateUserForAlreadyExistingEmail() {
String email = "dummy@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.create(client, email, sgp.groupId, User.SUPER_USER);
}
@Test(expected = APIException.class)
public void safeGetThrowsIfUserMissing() {
User.safeGet(client, "nonexisting@dummy.com");
assertTrue(false);
}
@Test
public void safeGetTest() {
String user = "sathya.t@ishafoundation.org";
String client = "isha";
// client cannot be invalid
try {
User.safeGet("invalidClient", user);
assertTrue(false);
} catch (APIException ex) {
assertEquals("client should be valid", Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
try {
User.safeGet(client, user);
assertTrue(false);
} catch (APIException ex) {
assertEquals("user email should exist", Status.ERROR_INVALID_USER, ex.statusCode);
}
long groupId = Group.create(client, "sgp", User.SUPER_USER).groupId;
UserCore.create(client, user, groupId);
assertEquals("can get by email", user, User.safeGet(client, user).toProp(client).email);
}
@Test
public void userWithPermssionCanUpdateEmail() {
String existingEmail = "existing@dummy.com";
User.create(client, existingEmail, sgp.groupId, User.SUPER_USER);
String newEmail = "new@dummy.com";
User.updateEmail(client, existingEmail, newEmail, userWithPermission.email);
UserProp userProp = User.safeGet(client, newEmail).toProp(client);
assertEquals(newEmail, userProp.email);
try {
User.safeGet(client, existingEmail);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
}
@Test(expected = APIException.class)
public void userWOPermssionCannotUpdateEmail() {
String existingEmail = "existing@dummy.com";
User.create(client, existingEmail, sgp.groupId, User.SUPER_USER);
String newEmail = "new@dummy.com";
User.updateEmail(client, existingEmail, newEmail, userWOPermission.email);
assertTrue(false);
}
@Test
public void userWithPermssionCanUpdateGroup() {
String email = "existing@dummy.com";
UserProp userProp = User.create(client, email, sgp.groupId, User.SUPER_USER);
assertEquals(sgp.groupId, userProp.groupId);
userProp = User.updateGroup(client, email, kl.groupId, userWithPermission.email);
assertEquals(kl.groupId, userProp.groupId);
}
@Test(expected = APIException.class)
public void userWOPermssionCannotUpdateGroup() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.updateGroup(client, email, kl.groupId, userWOPermission.email);
assertTrue(false);
}
@Test(expected = APIException.class)
public void ensureClientLevelPrivilegeThrowsIfNoPrivilege() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.ensureClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT);
assertTrue(false);
}
@Test
public void ensureClientLevelPrivilegeDoesNotThrowIfUserHasPrivilege() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT, User.SUPER_USER);
User.ensureClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT);
}
@Test(expected = APIException.class)
public void ensureGroupLevelPrivilegeThrowsIfNoPrivilege() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.ensureGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL);
assertTrue(false);
}
@Test
public void ensureGroupLevelPrivilegeDoesNotThrowIfUserHasPrivilege() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL, User.SUPER_USER);
User.ensureGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL);
}
@Test
public void canClonePrivilages() {
String email1 = "existing@dummy.com";
User.create(client, email1, sgp.groupId, User.SUPER_USER);
User.addClientLevelPrivilege(client, email1, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, email1, GroupLevelPrivilege.SEND_EMAIL, User.SUPER_USER);
User.addGroupLevelPrivilege(client, kl.groupId, email1, GroupLevelPrivilege.SEND_EMAIL, User.SUPER_USER);
String email2 = "existing2@dummy.com";
User.create(client, email2, kl.groupId, User.SUPER_USER);
User.addClientLevelPrivilege(client, email2, ClientLevelPrivilege.UPDATE_CLIENT_CONTACT_EMAIL, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, email2, GroupLevelPrivilege.UPDATE_LIST, User.SUPER_USER);
User.clonePrivileges(client, email1, email2, User.SUPER_USER);
UserProp userProp = User.safeGet(client, email2).toProp(client);
assertEquals(email2, userProp.email);
assertEquals(kl.groupId, userProp.groupId);
assertTrue(userProp.clientLevelPrivileges.contains(ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT.toString()));
assertEquals(1, userProp.clientLevelPrivileges.size());
assertEquals(2, userProp.groupLevelPrivileges.size());
assertTrue(userProp.groupLevelPrivileges.containsKey("Singapore"));
assertEquals(1, userProp.groupLevelPrivileges.get("Singapore").size());
assertTrue(userProp.groupLevelPrivileges.get("Singapore").contains(GroupLevelPrivilege.SEND_EMAIL.toString()));
assertTrue(userProp.groupLevelPrivileges.containsKey("KL"));
assertEquals(1, userProp.groupLevelPrivileges.get("KL").size());
assertTrue(userProp.groupLevelPrivileges.get("KL").contains(GroupLevelPrivilege.SEND_EMAIL.toString()));
}
@Test(expected = APIException.class)
public void userWOPermissionCannotClonePrivilages() {
String email1 = "existing@dummy.com";
User.create(client, email1, sgp.groupId, User.SUPER_USER);
String email2 = "existing2@dummy.com";
User.create(client, email2, kl.groupId, User.SUPER_USER);
User.clonePrivileges(client, email1, email2, userWOPermission.email);
}
@Test(expected = APIException.class)
public void ensureValidUserThrowsIfUserInvalid() {
User.ensureValidUser(client, "somedummy@dummy.com");
assertTrue(false);
}
@Test
public void ensureValidUserDoesNotThrowIfUserValid() {
User.ensureValidUser(client, userWOPermission.email);
// no exception
}
@Test
public void canAddClientLevelPrivilage() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT, User.SUPER_USER);
UserProp userProp = User.safeGet(client, email).toProp(client);
assertEquals(email, userProp.email);
assertTrue(userProp.clientLevelPrivileges.contains(ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT.toString()));
}
@Test
public void canRemoveClientLevelPrivilage() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT, User.SUPER_USER);
UserProp userProp = User.safeGet(client, email).toProp(client);
assertEquals(email, userProp.email);
assertTrue(userProp.clientLevelPrivileges.contains(ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT.toString()));
userProp = User.deleteClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT,
userWithPermission.email);
assertEquals(email, userProp.email);
assertEquals(0, userProp.clientLevelPrivileges.size());
}
@Test
public void canAddGroupLevelPrivilage() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL,
userWithPermission.email);
UserProp userProp = User.safeGet(client, email).toProp(client);
assertEquals(email, userProp.email);
assertTrue(userProp.groupLevelPrivileges.containsKey("Singapore"));
Set<String> privileges = userProp.groupLevelPrivileges.get("Singapore");
assertEquals(1, privileges.size());
assertTrue(privileges.contains(GroupLevelPrivilege.SEND_EMAIL.toString()));
}
@Test
public void canRemoveGroupLevelPrivilage() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL,
userWithPermission.email);
UserProp userProp = User.safeGet(client, email).toProp(client);
assertEquals(email, userProp.email);
assertTrue(userProp.groupLevelPrivileges.containsKey("Singapore"));
Set<String> privileges = userProp.groupLevelPrivileges.get("Singapore");
assertEquals(1, privileges.size());
assertTrue(privileges.contains(GroupLevelPrivilege.SEND_EMAIL.toString()));
User.deleteGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL,
userWithPermission.email);
userProp = User.safeGet(client, email).toProp(client);
assertTrue(userProp.groupLevelPrivileges.isEmpty());
}
@Test
public void canAddMultipleClientAndGroupLevelPrivilages() {
String email = "existing@dummy.com";
User.create(client, email, sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, email, GroupLevelPrivilege.SEND_EMAIL,
userWithPermission.email);
User.addGroupLevelPrivilege(client, kl.groupId, email, GroupLevelPrivilege.SEND_EMAIL, userWithPermission.email);
User.addClientLevelPrivilege(client, email, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT, User.SUPER_USER);
UserProp userProp = User.safeGet(client, email).toProp(client);
assertTrue(userProp.groupLevelPrivileges.containsKey("Singapore"));
assertTrue(userProp.groupLevelPrivileges.containsKey("KL"));
assertTrue(userProp.groupLevelPrivileges.get("Singapore").contains(GroupLevelPrivilege.SEND_EMAIL.toString()));
assertTrue(userProp.groupLevelPrivileges.get("KL").contains(GroupLevelPrivilege.SEND_EMAIL.toString()));
assertTrue(userProp.clientLevelPrivileges.contains(ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT.toString()));
}
@Test
public void ensureClientLevelPrivilegeAllowsSuperUser() {
User.ensureClientLevelPrivilege(client, User.SUPER_USER, ClientLevelPrivilege.ENABLE_DISABLE_ACCOUNT);
User.ensureClientLevelPrivilege(client, User.SUPER_USER, ClientLevelPrivilege.UPDATE_GROUP);
User.ensureClientLevelPrivilege(client, User.SUPER_USER, ClientLevelPrivilege.UPDATE_USER);
// no exception
}
@Test
public void ensureGroupLevelPrivilegeAllowsSuperUser() {
User.ensureGroupLevelPrivilege(client, sgp.groupId, User.SUPER_USER, GroupLevelPrivilege.SEND_EMAIL);
User.ensureGroupLevelPrivilege(client, sgp.groupId, User.SUPER_USER, GroupLevelPrivilege.UPDATE_LIST);
// no exception
}
@Test
public void userWithPermissionCanAddApp() {
String email = User.create(client, "newuser@dummy.com", sgp.groupId, User.SUPER_USER).email;
User.addApp(client, email, App.CHECK_IN, userWithPermission.email);
UserProp userProp = User.safeGet(client, email).toProp(client);
assertEquals(1, userProp.apps.size());
assertTrue(userProp.apps.contains(App.CHECK_IN.toString()));
}
@Test
public void userWOPermissionCannotAddApp() {
String email = User.create(client, "newuser@dummy.com", sgp.groupId, User.SUPER_USER).email;
try {
User.addApp(client, email, App.CHECK_IN, userWOPermission.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
UserProp userProp = User.safeGet(client, email).toProp(client);
assertTrue(userProp.apps.isEmpty());
}
@Test
public void userWithPermissionCanRemoveApp() {
String email = User.create(client, "newuser@dummy.com", sgp.groupId, User.SUPER_USER).email;
UserProp userProp = User.addApp(client, email, App.CHECK_IN, userWithPermission.email);
assertEquals(1, userProp.apps.size());
User.removeApp(client, email, App.CHECK_IN, userWithPermission.email);
userProp = User.safeGet(client, email).toProp(client);
assertTrue(userProp.apps.isEmpty());
}
@Test
public void userWOPermissionCannotRemoveApp() {
String email = User.create(client, "newuser@dummy.com", sgp.groupId, User.SUPER_USER).email;
UserProp userProp = User.addApp(client, email, App.CHECK_IN, userWithPermission.email);
assertEquals(1, userProp.apps.size());
try {
User.removeApp(client, email, App.CHECK_IN, userWOPermission.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
userProp = User.safeGet(client, email).toProp(client);
assertEquals(1, userProp.apps.size());
}
@Test
public void appsGetCloned() {
String sourceEmail = User.create(client, "source@dummy.com", sgp.groupId, User.SUPER_USER).email;
User.addApp(client, sourceEmail, App.CHECK_IN, userWithPermission.email);
User.addApp(client, sourceEmail, App.INVENTORY, userWithPermission.email);
String targetEmail = User.create(client, "target@dummy.com", sgp.groupId, User.SUPER_USER).email;
User.clonePrivileges(client, sourceEmail, targetEmail, User.SUPER_USER);
UserProp targetUserProp = User.safeGet(client, targetEmail).toProp(client);
assertEquals(2, targetUserProp.apps.size());
assertEquals(App.CHECK_IN.toString(), targetUserProp.apps.first());
assertEquals(App.INVENTORY.toString(), targetUserProp.apps.last());
}
}