package crmdna.mail2;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.google.common.collect.Lists;
import com.googlecode.objectify.ObjectifyFilter;
import crmdna.client.Client;
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.list.List;
import crmdna.list.ListHelper;
import crmdna.list.ListProp;
import crmdna.member.Member;
import crmdna.member.MemberProp;
import crmdna.member.MemberQueryCondition;
import crmdna.user.User;
import crmdna.user.User.GroupLevelPrivilege;
import crmdna.user.UserProp;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class MailMapFactoryTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private GroupProp sgp, kl;
private ListProp sgpTeachers;
private UserProp userWithSendMailPermissionForSgp;
private UserProp validUser;
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);
userWithSendMailPermissionForSgp =
User.create(client, "userwithsendmail@dummy.com", sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, userWithSendMailPermissionForSgp.email,
GroupLevelPrivilege.SEND_EMAIL, User.SUPER_USER);
sgpTeachers = List.createRestricted(client, sgp.groupId, "Sgp Teachers", null, User.SUPER_USER);
ContactProp c = new ContactProp();
c.email = "sathya.t@ishafoundation.org";
c.asOfyyyymmdd = 20141026;
c.firstName = "Sathya";
sathya = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
c.firstName = "Sharmila";
c.mobilePhone = "+6593849384";
c.email = null;
sharmila = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
assertEquals("Sharmila", sharmila.contact.firstName);
c.email = "murugavel@gmail.com";
murugavel = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
assertEquals("murugavel@gmail.com", murugavel.contact.email);
// add sathya and sharmila to sgpTeachers
Member.addOrDeleteList(client, sathya.memberId, sgpTeachers.listId,
true, User.SUPER_USER);
Member.addOrDeleteList(client, sharmila.memberId, sgpTeachers.listId,
true, User.SUPER_USER);
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
Member.subscribeGroup(client, sharmila.memberId, sgp.groupId, User.SUPER_USER);
ObjectifyFilter.complete();
}
@Test
public void emailMapDoesNotIncludeMembersWOEmail() {
MemberQueryCondition mqc = new MemberQueryCondition(client, 10000);
mqc.listIds.add(sgpTeachers.listId);
MailMap mailMap = MailMapFactory.getFromMemberQueryCondition(mqc, sgp.groupId,
"Isha", "Isha", userWithSendMailPermissionForSgp.email);
/*MailMap mailMap =
ListHelper.getMailMap(client, sgpTeachers.listId, "Isha", "Isha",
userWithSendMailPermissionForSgp.email);*/
assertEquals(1, mailMap.size());
Set<String> emails = mailMap.getEmails();
assertEquals(1, emails.size());
assertTrue(emails.contains("sathya.t@ishafoundation.org"));
// sharmila is missing
assertEquals("Sathya", mailMap.get(MailMap.MergeVarID.FIRST_NAME,
"sathya.t@ishafoundation.org"));
assertEquals("Isha", mailMap.get(MailMap.MergeVarID.LAST_NAME,
"sathya.t@ishafoundation.org"));
}
@Test
public void emailMapDoesNotIncludeUnsubscribedMembers() {
Member.unsubscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
MemberQueryCondition mqc = new MemberQueryCondition(client, 10000);
mqc.listIds.add(sgpTeachers.listId);
MailMap mailMap = MailMapFactory.getFromMemberQueryCondition(mqc, sgp.groupId,
"Isha", "Isha", userWithSendMailPermissionForSgp.email);
//sathya is unsubscribed, sharmila does not have a valid email
assertTrue(mailMap.isEmpty());
}
@Test
public void defaultAppliedForMembersWOLastName() {
MemberQueryCondition mqc = new MemberQueryCondition(client, 10000);
mqc.listIds.add(sgpTeachers.listId);
MailMap mailMap = MailMapFactory.getFromMemberQueryCondition(mqc, sgp.groupId,
"Isha", "Isha", userWithSendMailPermissionForSgp.email);
/*MailMap mailMap =
ListHelper.getMailMap(client, sgpTeachers.listId, "Isha", "Isha",
userWithSendMailPermissionForSgp.email);*/
assertEquals(1, mailMap.size());
Set<String> emails = mailMap.getEmails();
assertEquals(1, emails.size());
assertTrue(emails.contains("sathya.t@ishafoundation.org"));
assertEquals("Sathya", mailMap.get(MailMap.MergeVarID.FIRST_NAME,
"sathya.t@ishafoundation.org"));
assertEquals("Isha", mailMap.get(MailMap.MergeVarID.LAST_NAME,
"sathya.t@ishafoundation.org"));
}
@Test
public void userWOPermissionCannotGetMailMap() {
MemberQueryCondition mqc = new MemberQueryCondition(client, 10000);
mqc.listIds.add(sgpTeachers.listId);
try {
MailMapFactory.getFromMemberQueryCondition(mqc, sgp.groupId,
"Isha", "Isha", validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
}
@Test
public void populateGroupNameTest() {
ListProp listProp1 = List.createPublic(client, sgp.groupId, "SGP List", User.SUPER_USER);
ListProp listProp2 = List.createPublic(client, kl.groupId, "KL List", User.SUPER_USER);
java.util.List<ListProp> listProps = new ArrayList<>();
listProps.add(listProp1);
listProps.add(listProp2);
ListHelper.populateGroupName(client, listProps);
assertEquals("Singapore", listProp1.groupName);
assertEquals("KL", listProp2.groupName);
}
@Test
public void getEmailMapFromListOfMapTest() {
//Both firstname and last name specified
Map<String, String> map = new HashMap<>();
map.put("firstname", "Sathya ");
map.put("lastname", "Thilakan ");
final String email = "sathya.t@ishafoundation.org";
map.put("email", email);
MailMap mailMap = MailMapFactory.getFromListOfMap(Lists.newArrayList(map), "Isha",
"Isha");
assertEquals("Sathya", mailMap.get(MailMap.MergeVarID.FIRST_NAME, email));
assertEquals("Thilakan", mailMap.get(MailMap.MergeVarID.LAST_NAME, email));
assertEquals(1, mailMap.size());
//full name specified as last name
map.put("firstname", "Sathya Thilakan");
map.put("lastname", null);
mailMap = MailMapFactory.getFromListOfMap(Lists.newArrayList(map), "Isha", "Isha");
assertEquals("Sathya", mailMap.get(MailMap.MergeVarID.FIRST_NAME, email));
assertEquals("Thilakan", mailMap.get(MailMap.MergeVarID.LAST_NAME, email));
assertEquals(1, mailMap.size());
//full name specified with initial
map.put("firstname", "T. Sathya");
map.put("lastname", null);
mailMap = MailMapFactory.getFromListOfMap(Lists.newArrayList(map), "Isha", "Isha");
assertEquals("T. Sathya", mailMap.get(MailMap.MergeVarID.FIRST_NAME, email));
assertEquals("Isha", mailMap.get(MailMap.MergeVarID.LAST_NAME, email));
assertEquals(1, mailMap.size());
//test space trimmed in email field
map.clear();
map.put("firstname", "Sathya");
map.put("lastname", null);
map.put("email", " sathya.t@ishafoundation.org ");
mailMap = MailMapFactory.getFromListOfMap(Lists.newArrayList(map), "Isha", "Isha");
assertTrue(mailMap.getEmails().contains("sathya.t@ishafoundation.org"));
}
}