package crmdna.group;
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.EmailConfig;
import crmdna.common.api.APIException;
import crmdna.common.api.APIResponse.Status;
import crmdna.group.Group.EmailType;
import crmdna.group.Group.GroupProp;
import crmdna.user.User;
import crmdna.user.User.ClientLevelPrivilege;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static crmdna.common.OfyService.ofy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class GroupTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private final String invalidClient = "invalid";
private final String validUser = "valid@login.com";
private final String userWithPermission = "withpermission@login.com";
GroupProp chennai;
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
// can call getAll without any groups
List<GroupProp> centers = Group.getAll(client, false);
assertEquals(0, centers.size());
chennai = Group.create(client, "Chennai", User.SUPER_USER);
assertEquals(1, chennai.groupId);
User.create(client, validUser, chennai.groupId, User.SUPER_USER);
assertEquals(1, User.get(client, validUser).toProp(client).userId);
User.create(client, userWithPermission, chennai.groupId,
User.SUPER_USER);
assertEquals(2,
User.get(client, userWithPermission).toProp(client).userId);
User.addClientLevelPrivilege(client, userWithPermission,
ClientLevelPrivilege.UPDATE_GROUP, User.SUPER_USER);
User.addClientLevelPrivilege(client, userWithPermission,
ClientLevelPrivilege.UPDATE_USER, User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void createTest() {
GroupProp prop = Group.create(client, "Singapore", userWithPermission);
assertTrue(prop.groupId == 2); // one already created in the set up
// method
prop = Group.safeGet(client, prop.groupId).toProp();
assertEquals("singapore", prop.name);
assertEquals("Singapore", prop.displayName);
// cannot create duplicate
try {
Group.create("isha", "SINGAPORE", User.SUPER_USER);
assertTrue(false);
} catch (APIException e) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, e.statusCode);
}
// group ids should be in sequence
prop = Group.create(client, "Malaysia/KL", userWithPermission);
assertEquals(3, prop.groupId);
prop = Group.create(client, "Australia/Sydney", userWithPermission);
assertEquals(4, prop.groupId);
prop = Group.create(client, "Australia/Melbourne", userWithPermission);
assertEquals(5, prop.groupId);
prop = Group.safeGet(client, 3).toProp();
assertEquals("malaysia/kl", prop.name);
prop = Group.safeGet(client, 4).toProp();
assertEquals("Australia/Sydney", prop.displayName);
prop = Group.safeGet(client, 5).toProp();
assertEquals("Australia/Melbourne", prop.displayName);
assertEquals("australia/melbourne", prop.name);
// access control
try {
Group.create("isha", "Malaysia/Johor", validUser);
assertTrue(false);
} catch (APIException e) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, e.statusCode);
}
// client should be valid
try {
Group.create(invalidClient, "Singapore", User.SUPER_USER);
assertTrue(false);
} catch (APIException e) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, e.statusCode);
}
}
@Test
public void safeGetTest() {
GroupProp group = Group.create(client, "Singapore", userWithPermission);
assertTrue(group.groupId != 0);
group = Group.safeGet("isha", group.groupId).toProp();
assertEquals("singapore", group.name);
assertEquals("Singapore", group.displayName);
// exception for non existing group
try {
Group.safeGet("isha", group.groupId + 20939); // non existant
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test
public void safeGetByIdOrNameTest() {
GroupProp group = Group.create(client, "Singapore", userWithPermission);
assertTrue(group.groupId != 0);
group = Group.safeGetByIdOrName("isha", group.groupId + "").toProp();
assertEquals("get by id", "singapore", group.name);
assertEquals("get by id", "Singapore", group.displayName);
// exception for non existing group
try {
Group.safeGetByIdOrName("isha", group.groupId + 20939 + ""); // non
// existant
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
group = Group.safeGetByIdOrName("isha", "singapore").toProp();
assertEquals("get by name", "singapore", group.name);
assertEquals("get by name", "Singapore", group.displayName);
}
@Test
public void ensureValidGroupIdsTest() {
GroupProp group1 = Group.create(client, "group1", User.SUPER_USER);
GroupProp group2 = Group.create(client, "group2", User.SUPER_USER);
GroupProp group3 = Group.create(client, "group3", User.SUPER_USER);
List<Long> groupIds = new ArrayList<>();
groupIds.add(group1.groupId);
groupIds.add(group2.groupId);
groupIds.add(group3.groupId);
Group.ensureValidGroupIds(client, groupIds); // no exception
groupIds.add((long) 100);
try {
Group.ensureValidGroupIds(client, groupIds);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test
public void renameTest() {
GroupProp sgp = Group.create("isha", "Singapore", userWithPermission);
Group.create("isha", "Sydney", userWithPermission);
try {
Group.rename("isha", sgp.groupId, "sydney", userWithPermission);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
// can change case and rename
sgp = Group
.rename("isha", sgp.groupId, "singapore", userWithPermission);
sgp = Group.safeGet("isha", sgp.groupId).toProp();
assertEquals("singapore", sgp.name);
assertEquals("singapore", sgp.displayName);
sgp = Group.rename("isha", sgp.groupId, "Sgp", userWithPermission);
sgp = Group.safeGet("isha", sgp.groupId).toProp();
assertEquals("sgp", sgp.name);
assertEquals("Sgp", sgp.displayName);
try {
Group.rename("isha", sgp.groupId, "Sgp", validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
}
@Test
public void getAllTest() {
Group.create("isha", "Sydney", userWithPermission);
Group.create("isha", "Singapore", userWithPermission);
ObjectifyFilter.complete();
List<GroupProp> groups = Group.getAll("isha", false);
assertEquals(3, groups.size()); // chennai already created in set up
// method
// should be sorted
assertEquals("singapore", groups.get(1).name);
assertEquals("Singapore", groups.get(1).displayName);
assertEquals("sydney", groups.get(2).name);
assertEquals("Sydney", groups.get(2).displayName);
}
@Test
public void getAllGroupIdsTest() {
Set<Long> all = Group.getAllGroupIds("isha");
assertEquals(1, all.size());
assertTrue(all.contains(chennai.groupId));
GroupProp sydney = Group.create("isha", "Sydney", userWithPermission);
GroupProp sgp = Group.create("isha", "Singapore", userWithPermission);
ObjectifyFilter.complete();
all = Group.getAllGroupIds("isha");
assertEquals(3, all.size());
assertTrue(all.contains(chennai.groupId));
assertTrue(all.contains(sydney.groupId));
assertTrue(all.contains(sgp.groupId));
}
// public void deleteTest() {
// GroupProp sgp = Group.create(client, "Sgp", User.SUPER_USER);
// GroupProp kl = Group.create(client, "KL", User.SUPER_USER);
//
// // test permission
// try {
// Group.delete(client, sgp.groupId, validUser);
// assertTrue(false);
// } catch (APIException ex) {
// assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
// }
//
// UserProp userProp = User.create(client, "sgpuser@login.com",
// sgp.groupId, User.SUPER_USER);
// ContactProp contact = new ContactProp();
// contact.email = "email1@email.com";
// MemberProp memberProp = Member.create(client, sgp.groupId, contact,
// false,
// validUser);
// Member.addOrDeleteGroup(client, memberProp.memberId, kl.groupId, true,
// validUser);
//
// // There should not be any user for that center
// try {
// Group.delete(client, sgp.groupId, userWithPermission);
// assertTrue(false);
// } catch (APIException ex) {
// assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
// }
//
// User.updateGroup(client, userProp.email, kl.groupId, userWithPermission);
// assertEquals(0, User.getAllForGroup(client, sgp.groupId).size());
//
// // There should not be any member for that center
// try {
// Group.delete(client, sgp.groupId, userWithPermission);
// assertTrue(false);
// } catch (APIException ex) {
// assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
// }
//
// Member.addOrDeleteGroup(client, memberProp.memberId, sgp.groupId,
// false, validUser);
// assertEquals(0, Member.getAllForGroup(client, sgp.groupId, validUser)
// .size());
//
// assertEquals("force failure", true, false);
// }
@Test
public void setAndGetPaypalApiCredentialsTest() {
//privilage required to set api key
try {
Group.setPaypalApiCredentials(client, chennai.groupId, "api-login", "api-pwd",
"api-secret", false, false, validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
User.addGroupLevelPrivilege(client, chennai.groupId, validUser,
User.GroupLevelPrivilege.UPDATE_PAYMENT_CONFIG, User.SUPER_USER);
Group.setPaypalApiCredentials(client, chennai.groupId, "api-login", "api-pwd",
"api-secret", false, false, validUser);
//no exception
//privilege required to get api key
try {
Group.getPaypalApiCredentials(client, chennai.groupId, validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
User.addClientLevelPrivilege(client, validUser,
ClientLevelPrivilege.VIEW_API_KEY, User.SUPER_USER);
PaypalApiCredentialsProp p = Group.getPaypalApiCredentials(client,
chennai.groupId, validUser);
assertEquals("api-login", p.login);
assertEquals("api-pwd", p.pwd);
assertEquals("api-secret", p.secret);
assertEquals(false, p.sandbox);
assertEquals(false, p.disable);
}
@Test
public void setMandrillApiKeyTest() {
GroupProp sgp = Group.create(client, "Sgp", User.SUPER_USER);
// throws exception for invalid key
try {
Group.setMandrillApiKey(client, sgp.groupId, "invalid key",
User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
Group.setMandrillApiKey(client, sgp.groupId, "SGDxaNgCVEF6trBYKtugag",
User.SUPER_USER);
EmailConfig emailConfig = Group.getEmailConfig(client, sgp.groupId,
User.SUPER_USER);
assertEquals("SGDxaNgCVEF6trBYKtugag", emailConfig.mandrillApiKey);
}
@Test
public void addOrDeleteAllowedFromEmailTest() {
GroupProp sgp = Group.create(client, "Sgp", User.SUPER_USER);
Group.addOrDeleteAllowedEmailSender(client, sgp.groupId,
"Singapore@ishayoga.org", "Isha Singapore", true,
User.SUPER_USER);
Group.addOrDeleteAllowedEmailSender(client, sgp.groupId,
"Singapore@innerengineering.com", "Isha Singapore", true,
User.SUPER_USER);
EmailConfig emailConfig = Group.getEmailConfig(client, sgp.groupId,
User.SUPER_USER);
Map<String, String> emailVsName = emailConfig.allowedFromEmailVsName;
assertEquals(2, emailVsName.size());
assertEquals("Isha Singapore",
emailVsName.get("singapore@ishayoga.org"));
assertEquals("Isha Singapore",
emailVsName.get("singapore@innerengineering.com"));
// remove
Group.addOrDeleteAllowedEmailSender(client, sgp.groupId,
"SinGapore@ishayoga.org", null, false, User.SUPER_USER);
emailConfig = Group
.getEmailConfig(client, sgp.groupId, User.SUPER_USER);
emailVsName = emailConfig.allowedFromEmailVsName;
assertEquals(1, emailVsName.size());
}
@Test
public void getEmailConfigTest() {
Group.addOrDeleteAllowedEmailSender(client, chennai.groupId, "chennai@ishafoundation.org",
"Isha Chennai", true, User.SUPER_USER);
EmailConfig emailConfig = Group.getEmailConfig(client, chennai.groupId, validUser);
assertEquals(emailConfig.mandrillApiKey, EmailConfig.TEXT_API_KEY_MASKED);
assertEquals(1, emailConfig.allowedFromEmailVsName.size());
assertEquals("Isha Chennai", emailConfig.allowedFromEmailVsName.get("chennai@ishafoundation.org"));
}
@Test
public void setEmailTemplateTest() {
GroupProp sgp = Group.create(client, "Sgp", User.SUPER_USER);
Group.setEmailHtmlTemplate(client, sgp.groupId,
EmailType.REGISTRATION_CONFIRMATION, "registration template",
User.SUPER_USER);
String htmlTemplate = Group.getEmailTemplate(client, sgp.groupId,
EmailType.REGISTRATION_CONFIRMATION);
assertEquals("registration template", htmlTemplate);
Group.setEmailHtmlTemplate(client, sgp.groupId,
EmailType.REGISTRATION_REMINDER, "reminder template",
User.SUPER_USER);
htmlTemplate = Group.getEmailTemplate(client, sgp.groupId,
EmailType.REGISTRATION_REMINDER);
assertEquals("reminder template", htmlTemplate);
}
@Test
public void toPropTest() {
GroupEntity entity = new GroupEntity();
entity.groupId = 123l;
entity.displayName = "Singapore";
entity.name = entity.displayName.toLowerCase();
GroupProp prop = entity.toProp();
assertEquals(123, prop.groupId);
assertEquals("Singapore", prop.displayName);
assertEquals("singapore", prop.name);
}
@Test
public void entityCanBeCopiedToAnotherClient() {
String client1 = "client1";
String client2 = "client2";
Client.create(client1);
Client.create(client2);
GroupProp groupProp = Group.create(client1, "group1", User.SUPER_USER);
assertEquals(1, groupProp.groupId);
try {
groupProp = Group.safeGet(client2, 1).toProp();
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
GroupEntity groupEntity = Group.safeGet(client1, 1);
ofy(client2).save().entity(groupEntity).now();
groupProp = Group.safeGet(client2, 1).toProp();
assertEquals(1, groupProp.groupId);
assertEquals("group1", groupProp.displayName);
groupEntity = Group.safeGet(client1, 1);
//entity still exists in client1
}
@Test
public void safeGetSenderNameFromEmailTest() {
String client = "isha";
Group.addOrDeleteAllowedEmailSender(client, chennai.groupId, "chennai@ishayoga.org",
"Isha Chennai", true, User.SUPER_USER);
String name = Group.safeGetSenderNameFromEmail(client, chennai.groupId, "chennai@ishayoga.org");
assertEquals("Isha Chennai", name);
try {
Group.safeGetSenderNameFromEmail(client, chennai.groupId, "dummy@dummy.com");
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
}
}