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.DateUtils; 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.mail2.MailMap; import crmdna.member.*; 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.Date; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; public class BulkSubscriptionTest { 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; private ListProp shambhaviSgpList; @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; 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); shambhaviSgpList = List.createRestricted(client, sgp.groupId, "Shambhavi", Utils.getSet(shambhavi.practiceId), User.SUPER_USER); assertEquals(1, shambhaviSgpList.listId); } @Test public void permissionRequiredToBulkSubscribe() { MailMap mailMap = new MailMap(); mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan"); try { Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, validUser.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode); } } @Test public void newMemberCreatedForNonExistingEmail() { MailMap mailMap = new MailMap(); mailMap.add("Syamala@gMail.com", "Syamala", "Thilakan"); MemberQueryCondition mqc = new MemberQueryCondition(client, 10000); mqc.email = "syamala@gmail.com"; int count = MemberLoader.getCount(mqc, validUser.email); assertEquals(0, count); Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, userWithListPermissionForSgp.email); ObjectifyFilter.complete(); mqc = new MemberQueryCondition(client, 10000); mqc.listIds.add(shambhaviSgpList.listId); java.util.List<MemberProp> memberProps = MemberLoader.querySortedProps(mqc, validUser.email); assertEquals(1, memberProps.size()); MemberProp memberProp = memberProps.get(0); assertEquals("syamala@gmail.com", memberProp.contact.email); assertEquals("Syamala", memberProp.contact.firstName); assertEquals("Thilakan", memberProp.contact.lastName); assertTrue(memberProp.groupIds.contains(shambhaviSgpList.groupId)); assertEquals(1, memberProp.groupIds.size()); assertEquals(DateUtils.toYYYYMMDD(new Date()), memberProp.contact.asOfyyyymmdd); assertTrue(memberProp.practiceIds.contains(shambhavi.practiceId)); } @Test public void nameNotUpdatedForExistingMember() { assertEquals("sathya.t@ishafoundation.org", sathya.contact.email); assertNull(sathya.contact.firstName); assertNull(sathya.contact.lastName); MailMap mailMap = new MailMap(); mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan"); Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, User.SUPER_USER); ObjectifyFilter.complete(); MemberQueryCondition mqc = new MemberQueryCondition(client, 10000); mqc.listIds.add(shambhaviSgpList.listId); java.util.List<MemberProp> memberProps = MemberLoader.querySortedProps(mqc, User.SUPER_USER); assertEquals(1, memberProps.size()); assertEquals(sathya.memberId, memberProps.get(0).memberId); sathya = memberProps.get(0); assertEquals("sathya.t@ishafoundation.org", sathya.contact.email); assertNull(sathya.contact.firstName); assertNull(sathya.contact.lastName); assertTrue(sathya.listIds.contains(shambhaviSgpList.listId)); assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId)); assertTrue(sathya.practiceIds.contains(shambhavi.practiceId)); } @Test public void fullTestBulkSubscription() { // test a slightly complex case by adding 6 emails of which 3 are // existing members (sathya, sharmila, murugavel), // 1 already subscribed to list (sathya) // 1 already unsubscribed to group (murugavel) Member.addOrDeleteList(client, sathya.memberId, shambhaviSgpList.listId, true, User.SUPER_USER); Member.subscribeGroup(client, murugavel.memberId, sgp.groupId, User.SUPER_USER); Member.unsubscribeGroup(client, murugavel.memberId, sgp.groupId, User.SUPER_USER); sathya = MemberLoader.safeGet(client, sathya.memberId, User.SUPER_USER).toProp(); assertTrue(sathya.listIds.contains(shambhaviSgpList.listId)); assertTrue(sathya.practiceIds.contains(shambhavi.practiceId)); murugavel = MemberLoader.safeGet(client, murugavel.memberId, User.SUPER_USER).toProp(); assertTrue(murugavel.unsubscribedGroupIds.contains(sgp.groupId)); MailMap mailMap = new MailMap(); mailMap.add(sathya.contact.email, "Sathya", "Thilakan"); mailMap.add(sharmila.contact.email, "Sharmila", "Napa"); mailMap.add(murugavel.contact.email, "Murugavel", "Gnanasekaran"); mailMap.add("sowmya.ram@gmail.com", "Sowmya", "Ramakrishnan"); mailMap.add("rthilakan@gmail.com", "Thilakan", "Ramamurthy"); mailMap.add("syamala@gmail.com", "Syamala", "Thilakan"); assertEquals(6, mailMap.size()); BulkSubscriptionResultProp result = Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, userWithListPermissionForSgp.email); ObjectifyFilter.complete(); int numTotal = result.existingMemberEmails.size() + result.newMemberEmails.size(); assertEquals(6, numTotal); assertEquals(3, result.existingMemberEmails.size()); assertTrue(result.existingMemberEmails.contains(sathya.contact.email)); assertTrue(result.existingMemberEmails.contains(sharmila.contact.email)); assertTrue(result.existingMemberEmails.contains(murugavel.contact.email)); assertEquals(3, result.newMemberEmails.size()); assertTrue(result.newMemberEmails.contains("sowmya.ram@gmail.com")); assertTrue(result.newMemberEmails.contains("rthilakan@gmail.com")); assertTrue(result.newMemberEmails.contains("syamala@gmail.com")); assertEquals(5, result.addedToListEmails.size()); //except sathya all others should be added to list. sathya is already present in list assertTrue(! result.addedToListEmails.contains(sathya.contact.email)); assertEquals(1, result.alreadyUnsubscribedToGroupEmails.size()); assertTrue(result.alreadyUnsubscribedToGroupEmails.contains(murugavel.contact.email)); MemberQueryCondition mqc = new MemberQueryCondition(client, 1000); mqc.subscribedGroupIds.add(sgp.groupId); java.util.List<MemberProp> memberProps = MemberLoader.queryProps(mqc, validUser.email); assertEquals(5, memberProps.size()); Map<String, MemberProp> emailVsMemberProp = new HashMap<>(); for (MemberProp memberProp : memberProps) { emailVsMemberProp.put(memberProp.contact.email, memberProp); assertTrue(memberProp.listIds.contains(shambhaviSgpList.listId)); assertTrue(memberProp.practiceIds.contains(shambhavi.practiceId)); } assertEquals(5, emailVsMemberProp.size()); assertTrue(emailVsMemberProp.containsKey(sathya.contact.email)); assertTrue(emailVsMemberProp.containsKey(sharmila.contact.email)); assertTrue(emailVsMemberProp.containsKey("sowmya.ram@gmail.com")); assertTrue(emailVsMemberProp.containsKey("rthilakan@gmail.com")); assertTrue(emailVsMemberProp.containsKey("syamala@gmail.com")); mqc = new MemberQueryCondition(client, 1000); mqc.unsubscribedGroupIds.add(sgp.groupId); memberProps = MemberLoader.queryProps(mqc, validUser.email); assertEquals(1, memberProps.size()); } @Test public void worksWithDuplicateEmails() { // 4 existing members m1, m2, m3, m4. m1, m2 and m3 have the same email. // add emails m1 list // m1 ContactProp c = new ContactProp(); c.firstName = "first_m1"; c.lastName = "last_m1"; c.email = "m1@dummytest.com"; c.asOfyyyymmdd = 20150117; Member.create(client, sgp.groupId, c, true, User.SUPER_USER); // m2 c.firstName = "first_m2"; c.lastName = "last_m2"; Member.create(client, sgp.groupId, c, true, User.SUPER_USER); // m3 c.firstName = "first_m3"; c.lastName = "last_m3"; Member.create(client, sgp.groupId, c, true, User.SUPER_USER); // m4 c.firstName = "first_m4"; c.lastName = "last_m4"; c.email = "m4@dummytest.com"; Member.create(client, sgp.groupId, c, true, User.SUPER_USER); MailMap mailMap = new MailMap(); mailMap.add("m1@dummytest.com", "first_m1", "last_m1"); BulkSubscriptionResultProp result = Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, User.SUPER_USER); assertEquals(1, result.existingMemberEmails.size()); assertTrue(result.existingMemberEmails.contains("m1@dummytest.com")); assertTrue(result.newMemberEmails.isEmpty()); assertEquals(1, result.addedToListEmails.size()); assertTrue(result.addedToListEmails.contains("m1@dummytest.com")); assertEquals(1, result.addedToGroupSubscriptionEmails.size()); assertTrue(result.addedToGroupSubscriptionEmails.contains("m1@dummytest.com")); assertTrue(result.alreadySubscribedToGroupEmails.isEmpty()); assertTrue(result.alreadyUnsubscribedToGroupEmails.isEmpty()); } @Test public void cannotBulkSubscribeToDisabledList() { List.disable(client, shambhaviSgpList.listId, User.SUPER_USER); MailMap mailMap = new MailMap(); mailMap.add("Syamala@gMail.com", "Syamala", "Thilakan"); try { Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, User.SUPER_USER); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode); } } @Test public void unsubscribedEmailsNotAddedBack() { // m1 ContactProp c = new ContactProp(); c.firstName = "first_m1"; c.lastName = "last_m1"; c.email = "m1@dummytest.com"; c.asOfyyyymmdd = 20150117; MemberProp m1 = Member.create(client, sgp.groupId, c, true, User.SUPER_USER); //subscribe first and then unsubscribe Member.subscribeGroup(client, m1.memberId, sgp.groupId, User.SUPER_USER); Member.unsubscribeGroup(client, m1.memberId, sgp.groupId, User.SUPER_USER); m1 = MemberLoader.safeGet(client, m1.memberId, User.SUPER_USER).toProp(); assertTrue(m1.unsubscribedGroupIds.contains(sgp.groupId)); MailMap mailMap = new MailMap(); mailMap.add("m1@dummytest.com", "first_m1", "last_m1"); BulkSubscriptionResultProp result = Member.bulkSubscribeList(client, shambhaviSgpList.listId, mailMap, User.SUPER_USER); assertEquals(1, result.alreadyUnsubscribedToGroupEmails.size()); assertTrue(result.alreadyUnsubscribedToGroupEmails.contains("m1@dummytest.com")); m1 = MemberLoader.safeGet(client, m1.memberId, User.SUPER_USER).toProp(); assertTrue(m1.listIds.contains(shambhaviSgpList.listId)); assertTrue(m1.unsubscribedGroupIds.contains(sgp.groupId)); } }