package crmdna.list;
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.Utils;
import crmdna.common.api.APIException;
import crmdna.common.api.APIResponse.Status;
import crmdna.common.contact.ContactProp;
import crmdna.group.Group;
import crmdna.group.Group.GroupProp;
import crmdna.member.Member;
import crmdna.member.MemberLoader;
import crmdna.member.MemberProp;
import crmdna.member.MemberQueryCondition;
import crmdna.practice.Practice;
import crmdna.practice.Practice.PracticeProp;
import crmdna.user.User;
import crmdna.user.User.GroupLevelPrivilege;
import crmdna.user.UserProp;
import org.junit.Before;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.*;
public class ListTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private GroupProp sgp;
private GroupProp kl;
private UserProp userWithListPermissionForSgp;
private UserProp validUser;
private PracticeProp shambhavi;
private MemberProp sathya;
private MemberProp sharmila;
private MemberProp murugavel;
@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);
validUser = User.create(client, "validuser@dummy.com", sgp.groupId, User.SUPER_USER);
userWithListPermissionForSgp =
User.create(client, "userwithcreatelist@dummy.com", sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, userWithListPermissionForSgp.email,
GroupLevelPrivilege.UPDATE_LIST, User.SUPER_USER);
shambhavi = Practice.create(client, "Shambhavi", User.SUPER_USER);
ContactProp c = new ContactProp();
c.email = "sathya.t@ishafoundation.org";
c.asOfyyyymmdd = 20141026;
c.firstName = "Sathya";
c.lastName = "Thilakan";
sathya = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
c.email = "sharmila@gmail.com";
sharmila = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
assertEquals("sharmila@gmail.com", sharmila.contact.email);
c.email = "murugavel@gmail.com";
murugavel = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
assertEquals("murugavel@gmail.com", murugavel.contact.email);
}
@Test
public void userWithPermissionCanCreateList() {
ListProp listProp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
listProp = List.safeGet(client, listProp.listId).toProp();
assertEquals(1, listProp.listId);
assertEquals(sgp.groupId, listProp.groupId);
assertEquals("Shambhavi", listProp.displayName);
assertTrue(listProp.restricted);
assertTrue(listProp.practiceIds.contains(shambhavi.practiceId));
assertEquals(1, listProp.practiceIds.size());
assertTrue(listProp.enabled);
}
@Test(expected = APIException.class)
public void userWOPermissionCannotCreateList() {
List.createPublic(client, sgp.groupId, "Newsletter", validUser.email);
assertTrue(false);
}
@Test(expected = APIException.class)
public void cannotCreateListForInvalidClient() {
List.createRestricted("invalid", sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
assertTrue(false);
}
@Test(expected = APIException.class)
public void cannotCreateListForInvalidGroup() {
long invalidGroupId = 10093;
List.createPublic(client, invalidGroupId, "Newsletter", User.SUPER_USER);
assertTrue(false);
}
@Test
public void cannotCreateDuplicateWithinSameGroup() {
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
try {
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
try {
List.createRestricted(client, sgp.groupId, "shambhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
try {
List.createRestricted(client, sgp.groupId, "sham bhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
try {
List.createRestricted(client, sgp.groupId, "sham_bhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
}
@Test
public void canCreateDuplicateInADifferentGroup() {
ListProp listProp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
assertEquals(1, listProp.listId);
listProp =
List.createRestricted(client, kl.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
assertEquals(2, listProp.listId);
}
@Test
public void userWithPermissionCanRename() {
ListProp listProp =
List.createPublic(client, sgp.groupId, "Newsletter", userWithListPermissionForSgp.email);
listProp = List.safeGet(client, listProp.listId).toProp();
assertEquals("Newsletter", listProp.displayName);
List.rename(client, listProp.listId, "Isha Singapore Newsletter",
userWithListPermissionForSgp.email);
listProp = List.safeGet(client, listProp.listId).toProp();
assertEquals("Isha Singapore Newsletter", listProp.displayName);
}
@Test
public void cannotRenameToExistingName() {
ListProp listProp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
assertEquals(1, listProp.listId);
listProp =
List.createRestricted(client, sgp.groupId, "Volunteers",
Utils.getSet(shambhavi.practiceId), userWithListPermissionForSgp.email);
assertEquals(2, listProp.listId);
try {
List.rename(client, 2, "sham_bhavi", userWithListPermissionForSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
}
@Test
public void userWOPermissionCannotRename() {
ListProp listProp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
try {
List.rename(client, listProp.listId, "Shambhavi Mahamudra", validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
}
@Test
public void userWithPermissionCanDisable() {
ListProp listProp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
List.disable(client, listProp.listId, userWithListPermissionForSgp.email);
listProp = List.safeGet(client, listProp.listId).toProp();
assertEquals(false, listProp.enabled);
}
@Test
public void cannotAddMemberToDisabledList() {
ListProp newsletter =
List.createPublic(client, sgp.groupId, "Newsletter", userWithListPermissionForSgp.email);
newsletter = List.disable(client, newsletter.listId, userWithListPermissionForSgp.email);
assertEquals(false, newsletter.enabled);
ContactProp c = new ContactProp();
c.email = "sathya.t@ishafoundation.org";
c.asOfyyyymmdd = 20141026;
try {
Member.addOrDeleteList(client, sathya.memberId, newsletter.listId, true, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
}
}
@Test
public void memberCanSelfAddToAPublicList() {
ListProp newsletter =
List.createPublic(client, sgp.groupId, "Isha Singapore Newsletter",
userWithListPermissionForSgp.email);
Member.addOrDeleteList(client, sathya.memberId, newsletter.listId, true, User.SUPER_USER);
sathya =
MemberLoader.safeGet(client, sathya.memberId, userWithListPermissionForSgp.email).toProp();
assertTrue(sathya.listIds.contains(newsletter.listId));
}
@Test
public void memberCannotSelfAddToARestrictedList() {
ListProp shambhaviList =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
userWithListPermissionForSgp.email);
assertEquals(true, shambhaviList.restricted);
try {
Member.addOrDeleteList(client, sathya.memberId, shambhaviList.listId,
true, sathya.contact.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
}
@Test
public void memberCannotSubscribeSomeOneElse() {
try {
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, sharmila.contact.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
}
@Test
public void memberCannotUnsubscribeSomeOneElse() {
ListProp newsletter =
List.createPublic(client, sgp.groupId, "Isha Singapore Newsletter",
userWithListPermissionForSgp.email);
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
// let sharmila unsubscribe sathya - should throw an exception
try {
Member.unsubscribeGroup(client, sathya.memberId, sgp.groupId, sharmila.contact.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
}
@Test
public void userWithPermissionCanDeleteListWithNoMembers() {
ListProp shambhaviList =
List.createRestricted(client, sgp.groupId, "Isha Singapore Newsletter",
Utils.getSet(shambhavi.practiceId), userWithListPermissionForSgp.email);
shambhaviList = List.disable(client, shambhaviList.listId, userWithListPermissionForSgp.email);
assertEquals(false, shambhaviList.enabled);
List.delete(client, shambhaviList.listId, userWithListPermissionForSgp.email);
try {
List.safeGet(client, shambhaviList.listId);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test(expected = APIException.class)
public void userWOPermissionCannotDeleteListWithNoMembers() {
ListProp shambhaviList =
List.createRestricted(client, sgp.groupId, "Isha Singapore Newsletter",
Utils.getSet(shambhavi.practiceId), userWithListPermissionForSgp.email);
List.delete(client, shambhaviList.listId, validUser.email);
assertTrue(false);
}
@Test
public void cannotDeleteListWithSubscribedMembersEvenIfDisabled() {
ListProp newsletter =
List.createPublic(client, sgp.groupId, "Isha Singapore Newsletter",
userWithListPermissionForSgp.email);
Member.addOrDeleteList(client, sathya.memberId, newsletter.listId, true, User.SUPER_USER);
// disable the list
List.disable(client, newsletter.listId, User.SUPER_USER);
assertEquals(false, List.safeGet(client, newsletter.listId).toProp().enabled);
try {
List.delete(client, newsletter.listId, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
}
}
@Test(expected = APIException.class)
public void cannotDeleteEnabledList() {
ListProp newsletter =
List.createPublic(client, sgp.groupId, "Isha Singapore Newsletter",
userWithListPermissionForSgp.email);
List.delete(client, newsletter.listId, User.SUPER_USER);
assertTrue(false);
}
@Test
public void canQueryByListId() {
ListProp shambhaviList =
List.createRestricted(client, sgp.groupId, "Isha Singapore Newsletter",
Utils.getSet(shambhavi.practiceId), userWithListPermissionForSgp.email);
Member.addOrDeleteList(client, sathya.memberId, shambhaviList.listId, true, User.SUPER_USER);
Member.addOrDeleteList(client, sharmila.memberId, shambhaviList.listId, true, User.SUPER_USER);
MemberQueryCondition qc = new MemberQueryCondition(client, 1000);
qc.listIds = Utils.getSet(shambhaviList.listId);
java.util.List<MemberProp> memberProps = MemberLoader.queryProps(qc, validUser.email);
assertEquals(2, memberProps.size());
Set<Long> memberIds = new HashSet<>();
for (MemberProp memberProp : memberProps) {
memberIds.add(memberProp.memberId);
}
assertTrue(memberIds.contains(sathya.memberId));
assertTrue(memberIds.contains(sharmila.memberId));
}
@Test
public void memberTaggedWithPracticesFromListAfterAdd() {
ListProp shambhaviList =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
Member.addOrDeleteList(client, sathya.memberId, shambhaviList.listId, true, User.SUPER_USER);
sathya = MemberLoader.safeGet(client, sathya.memberId, sathya.contact.email).toProp();
assertTrue(sathya.practiceIds.contains(shambhavi.practiceId));
}
@Test
public void memberUntaggedWithPracticesFromListAfterDelete() {
ListProp shambhaviList =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
Member.addOrDeleteList(client, sathya.memberId, shambhaviList.listId, true,
userWithListPermissionForSgp.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, sathya.contact.email).toProp();
assertTrue(sathya.practiceIds.contains(shambhavi.practiceId));
Member.addOrDeleteList(client, sathya.memberId, shambhaviList.listId, false,
userWithListPermissionForSgp.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, sathya.contact.email).toProp();
assertTrue(!sathya.practiceIds.contains(shambhavi.practiceId));
}
@Test
public void canQueryByGroup() {
ListProp shambhaviSgp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
// just create another one for kl
List.createRestricted(client, kl.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
ListProp newsletterSgp = List.createPublic(client, sgp.groupId, "Newsletter", User.SUPER_USER);
java.util.List<ListProp> listProps = List.querySortedProps(client, sgp.groupId);
assertEquals(2, listProps.size());
assertEquals(newsletterSgp.listId, listProps.get(0).listId);
assertEquals(shambhaviSgp.listId, listProps.get(1).listId);
}
@Test
public void canSafeGetByGroupIdAndName() {
ListProp shambhaviSgp =
List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId),
User.SUPER_USER);
ListEntity listEntity = List.safeGetByGroupIdAndName(client, sgp.groupId, "SHAMbhaVi");
assertEquals(shambhaviSgp.listId, listEntity.listId);
}
@Test(expected = APIException.class)
public void canSafeGetByGroupIdAndNameThrowsIfGroupInvalid() {
long invalidGroupId = 10230;
List.safeGetByGroupIdAndName(client, invalidGroupId, "SHAMbhaVi");
}
@Test(expected = APIException.class)
public void canSafeGetByGroupIdAndNameThrowsIfListDoesNotExist() {
List.safeGetByGroupIdAndName(client, sgp.groupId, "SHAMbhaVi");
}
@Test
public void callGetAllLists() {
ListProp shambhaviSgp =
List.createRestricted(client, sgp.groupId, "Shambhavi SGP",
Utils.getSet(shambhavi.practiceId), User.SUPER_USER);
ListProp shambhaviKl =
List.createRestricted(client, kl.groupId, "Shambhavi KL",
Utils.getSet(shambhavi.practiceId), User.SUPER_USER);
ListProp newsletterSgp = List.createPublic(client, sgp.groupId, "Newsletter", User.SUPER_USER);
java.util.List<ListProp> listProps = List.querySortedProps(client, null);
assertEquals(3, listProps.size());
assertEquals(newsletterSgp.listId, listProps.get(0).listId);
assertEquals(shambhaviKl.listId, listProps.get(1).listId);
assertEquals(shambhaviSgp.listId, listProps.get(2).listId);
}
@Test
public void subscribeUnsubcribeGroupReturnValueTest() {
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(! sathya.subscribedGroupIds.contains(sgp.groupId));
//sathya not originally subscribed to sgp
boolean result = Member.subscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
//returns true if changed
assertTrue(result);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
assertFalse(sathya.unsubscribedGroupIds.contains(sgp.groupId));
result = Member.subscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
assertFalse(result);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
assertFalse(sathya.unsubscribedGroupIds.contains(sgp.groupId));
result = Member.unsubscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
assertTrue(result);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertFalse(sathya.subscribedGroupIds.contains(sgp.groupId));
assertTrue(sathya.unsubscribedGroupIds.contains(sgp.groupId));
}
@Test
public void selfCanSubscibeAndUnsubscribe() {
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, sathya.contact.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
assertFalse(sathya.unsubscribedGroupIds.contains(sgp.groupId));
Member.unsubscribeGroup(client, sathya.memberId, sgp.groupId, sathya.contact.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertFalse(sathya.subscribedGroupIds.contains(sgp.groupId));
assertTrue(sathya.unsubscribedGroupIds.contains(sgp.groupId));
//self can undo unsubscription
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, sathya.contact.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
assertFalse(sathya.unsubscribedGroupIds.contains(sgp.groupId));
//assert sathya is not a user
try {
User.ensureValidUser(client, sathya.contact.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
}
@Test
public void userCanSubscibeAndUnsubscribe() {
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, validUser.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
assertFalse(sathya.unsubscribedGroupIds.contains(sgp.groupId));
Member.unsubscribeGroup(client, sathya.memberId, sgp.groupId, validUser.email);
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertFalse(sathya.subscribedGroupIds.contains(sgp.groupId));
assertTrue(sathya.unsubscribedGroupIds.contains(sgp.groupId));
}
@Test
public void userNeedsPrivilageToUndoUnsubscription() {
Member.unsubscribeGroup(client, sathya.memberId, sgp.groupId, validUser.email);
try {
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
//now add privilege
User.addClientLevelPrivilege(client, validUser.email,
User.ClientLevelPrivilege.SUBSCRIBE_GROUP, User.SUPER_USER);
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, validUser.email);
//no exception
sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp();
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
assertFalse(sathya.unsubscribedGroupIds.contains(sgp.groupId));
}
}