package crmdna.mail2;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.google.common.collect.Sets;
import com.googlecode.objectify.ObjectifyFilter;
import com.microtripit.mandrillapp.lutung.model.MandrillApiError;
import crmdna.client.Client;
import crmdna.common.DateUtils;
import crmdna.common.EmailConfig;
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.list.*;
import crmdna.member.Member;
import crmdna.member.MemberLoader;
import crmdna.member.MemberProp;
import crmdna.member.MemberQueryCondition;
import crmdna.program.Program;
import crmdna.programtype.ProgramType;
import crmdna.teacher.Teacher;
import crmdna.user.User;
import crmdna.user.User.GroupLevelPrivilege;
import crmdna.user.UserProp;
import crmdna.venue.Venue;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.*;
import java.util.List;
import static crmdna.common.AssertUtils.ensureEqual;
import static org.junit.Assert.*;
public class MailTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private GroupProp sgp;
private UserProp userWithPermssion;
private UserProp userWOPermssion;
public static void suppressEmailInTestEnv() {
System.setProperty(Mail.SYSTEM_PROPERTY_SUPPRESS_EMAIL, "TRUE");
}
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
sgp = Group.create(client, "Singapore", User.SUPER_USER);
assertEquals(1, sgp.groupId);
EmailConfig emailConfig = Group.addOrDeleteAllowedEmailSender(client, sgp.groupId, "SinGapore@IshayoGa.org",
"Isha Singapore", true, User.SUPER_USER);
assertEquals(1, emailConfig.allowedFromEmailVsName.size());
assertEquals("Isha Singapore", emailConfig.allowedFromEmailVsName.get("singapore@ishayoga.org"));
userWithPermssion = User.create(client, "userwithpermission@invalid.com", sgp.groupId, User.SUPER_USER);
User.addGroupLevelPrivilege(client, sgp.groupId, userWithPermssion.email, GroupLevelPrivilege.SEND_EMAIL,
User.SUPER_USER);
userWOPermssion = User.create(client, "userwithoutpermission@invalid.com", sgp.groupId, User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
System.clearProperty(Mail.SYSTEM_PROPERTY_SUPPRESS_EMAIL);
}
@Test
public void sendEmailToNewMember() throws MandrillApiError, IOException {
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
String from = "singapore@ishayoga.org";
suppressEmailInTestEnv();
List<SentMailEntity> sentMailEntities = Mail.sendBespoke(client, sgp.groupId, mailMap,
"update member profile", "member profile", from, Utils.getSet("singapore", "memberprofile"),
User.SUPER_USER);
ensureEqual(1, sentMailEntities.size());
ObjectifyFilter.complete();
SentMailEntity sentMailEntity = Mail.safeGet(client, sentMailEntities.get(0).sentMailId);
assertEquals(from, sentMailEntity.from);
assertEquals("sathya.t@ishafoundation.org", sentMailEntity.email);
MailContentEntity mailContentEntity = MailContent.safeGet(client, sentMailEntity.mailContentId);
assertEquals("update member profile", mailContentEntity.subject);
assertEquals("member profile", mailContentEntity.body);
MemberProp memberProp = MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp();
assertEquals("Sathya", memberProp.contact.firstName);
assertEquals("Thilakan", memberProp.contact.lastName);
assertEquals(1, memberProp.groupIds.size());
assertTrue(memberProp.groupIds.contains(sgp.groupId));
Set<String> tags = TagSet.safeGet(client, sentMailEntity.tagSetId).tags;
assertEquals(2, tags.size());
assertTrue(tags.contains("singapore"));
assertTrue(tags.contains("memberprofile"));
}
@Test
public void cannotSendEmailFromInvalidFrom() throws MandrillApiError, IOException {
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
String from = "sathyanarayanant@gmail.com";
suppressEmailInTestEnv();
try {
Mail.sendBespoke(client, sgp.groupId, mailMap, "update member profile", "member profile", from,
Utils.getSet("singapore", "memberprofile"), User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
}
@Test
public void mailIdShowsNS() throws MandrillApiError, IOException {
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
suppressEmailInTestEnv();
String from = "singapore@ishayoga.org";
long currentMS = new Date().getTime();
SentMailEntity sentMailEntity = Mail.sendBespoke(client, sgp.groupId, mailMap, "update member profile",
"member profile", from, Utils.getSet("singapore", "memberprofile"), User.SUPER_USER).get(0);
final int MILLION = 1000000;
assertTrue(sentMailEntity.sentMailId >= currentMS * MILLION);
assertTrue(sentMailEntity.sentMailId < (currentMS + 20) * MILLION);
ObjectifyFilter.complete();
}
@Test
public void sendEmailToExistingMember() throws MandrillApiError, IOException {
ContactProp contact = new ContactProp();
contact.asOfyyyymmdd = 20140823;
contact.email = "sathya.t@ishafoundation.org";
contact.firstName = "Sathyanarayanan";
MemberProp sathya = Member.create(client, sgp.groupId, contact, false, User.SUPER_USER);
assertEquals(1, sathya.memberId);
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
String from = "singapore@ishayoga.org";
suppressEmailInTestEnv();
List<SentMailEntity> sentMailEntities = Mail.sendBespoke(client, sgp.groupId, mailMap,
"update member profile", "member profile", from, Utils.getSet("singapore", "memberprofile"),
User.SUPER_USER);
ensureEqual(1, sentMailEntities.size());
SentMailEntity sentMailEntity = Mail.safeGet(client, sentMailEntities.get(0).sentMailId);
assertEquals(from, sentMailEntity.from);
assertEquals("sathya.t@ishafoundation.org", sentMailEntity.email);
MailContentEntity mailContentEntity = MailContent.safeGet(client, sentMailEntity.mailContentId);
assertEquals("update member profile", mailContentEntity.subject);
assertEquals("member profile", mailContentEntity.body);
MemberProp memberProp = MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp();
assertEquals(sathya.memberId, memberProp.memberId);
// first name and last name should not get updated
assertEquals("Sathyanarayanan", memberProp.contact.firstName);
assertEquals(null, memberProp.contact.lastName);
assertEquals(1, memberProp.groupIds.size());
assertTrue(memberProp.groupIds.contains(sgp.groupId));
Set<String> tags = TagSet.safeGet(client, sentMailEntity.tagSetId).tags;
assertEquals(2, tags.size());
assertTrue(tags.contains("singapore"));
assertTrue(tags.contains("memberprofile"));
}
@Test
public void isEmailSuppressedTest() {
assertTrue(!Mail.isEmailSuppressed());
System.setProperty(Mail.SYSTEM_PROPERTY_SUPPRESS_EMAIL, "TRUE");
assertTrue(Mail.isEmailSuppressed());
System.clearProperty(Mail.SYSTEM_PROPERTY_SUPPRESS_EMAIL);
assertTrue(!Mail.isEmailSuppressed());
System.setProperty(Mail.SYSTEM_PROPERTY_SUPPRESS_EMAIL, "trUe");
assertTrue(Mail.isEmailSuppressed());
System.setProperty(Mail.SYSTEM_PROPERTY_SUPPRESS_EMAIL, "1");
assertTrue(Mail.isEmailSuppressed());
}
@Test
public void stagsTagIsCaseInsensitive() throws MandrillApiError, IOException {
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
suppressEmailInTestEnv();
String from = "singapore@isHayoga.org";
Mail.sendBespoke(client, sgp.groupId, mailMap, "update member profile", "member profile", from,
Utils.getSet("singapore", "memberprofile"), User.SUPER_USER).get(0);
ObjectifyFilter.complete();
MailStatsProp mailStatsProp = Mail.getStatsByTag(client, Utils.getSet("sinGapore"));
assertEquals(1, mailStatsProp.numRecipientsSendAttempted);
}
@Test
public void multipleStatsTags() throws MandrillApiError, IOException {
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
suppressEmailInTestEnv();
String from = "singapore@ishayoga.org";
Mail.sendBespoke(client, sgp.groupId, mailMap, "update member profile", "member profile", from,
Utils.getSet("singapore", "memberprofile"), User.SUPER_USER).get(0);
Mail.sendBespoke(client, sgp.groupId, mailMap, "registration", "thanks for registration", from,
Utils.getSet("singapore", "registration"), User.SUPER_USER).get(0);
MailMap mailMap2 = new MailMap();
mailMap2.add("thulasidhar@gmail.com", "Thulasi", "Thilakan");
Mail.sendBespoke(client, sgp.groupId, mailMap, "update member profile", "member profile", from,
Utils.getSet("singapore", "memberprofile"), User.SUPER_USER).get(0);
ObjectifyFilter.complete();
MailStatsProp mailStatsProp = Mail.getStatsByTag(client, Utils.getSet("sinGapore"));
assertEquals(3, mailStatsProp.numRecipientsSendAttempted);
mailStatsProp = Mail.getStatsByTag(client, Utils.getSet("sinGapore", "Memberprofile"));
assertEquals(2, mailStatsProp.numRecipientsSendAttempted);
mailStatsProp = Mail.getStatsByTag(client, Utils.getSet("sinGapore", "registration"));
assertEquals(1, mailStatsProp.numRecipientsSendAttempted);
mailStatsProp = Mail.getStatsByTag(client, Utils.getSet("memberProFile"));
assertEquals(2, mailStatsProp.numRecipientsSendAttempted);
}
@Test
public void nonExistantTags() {
MailStatsProp mailStatsProp = Mail.getStatsByTag(client, Utils.getSet("sinGapore", "kl"));
assertEquals(0, mailStatsProp.numRecipientsSendAttempted);
}
@Test
public void mailContentIdSavedCorrectly() throws MandrillApiError, IOException {
long mailContentId = MailContent.create(client, "test 1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
assertEquals("test subject", MailContent.safeGet(client, mailContentId).subject);
assertEquals("test body", MailContent.safeGet(client, mailContentId).body);
assertEquals("test 1", MailContent.safeGet(client, mailContentId).displayName);
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
mailMap.add("thulasidhar@gmail.com", "Thulasidhar", "Kosalram");
String from = "singapore@ishayoga.org";
long currentNs = new Date().getTime() * 1000000;
suppressEmailInTestEnv();
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = from;
msi.suppressIfAlreadySent = true;
msi.tags = Utils.getSet("singapore", "memberprofile");
Mail.send(client, msi, mailMap, userWithPermssion.email);
ObjectifyFilter.complete();
SentMailQueryCondition qc = new SentMailQueryCondition();
qc.mailContentId = mailContentId;
List<SentMailEntity> sentMailEntities = Mail.queryEntitiesSortedByTimeDesc(client, qc, User.SUPER_USER);
assertEquals(2, sentMailEntities.size());
SentMailEntity sathyaSentMail;
SentMailEntity thulasiSentMail;
if (sentMailEntities.get(0).email.equals("sathya.t@ishafoundation.org")) {
sathyaSentMail = sentMailEntities.get(0);
thulasiSentMail = sentMailEntities.get(1);
} else {
sathyaSentMail = sentMailEntities.get(1);
thulasiSentMail = sentMailEntities.get(0);
}
SentMailEntity sentMailEntity = sathyaSentMail;
assertTrue(sentMailEntity.sentMailId >= currentNs);
assertEquals(mailContentId, sentMailEntity.mailContentId);
assertTrue(TagSet.safeGet(client, sentMailEntity.tagSetId).tags.contains("singapore"));
assertTrue(TagSet.safeGet(client, sentMailEntity.tagSetId).tags.contains("memberprofile"));
assertEquals("Sathya",
MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp().contact.firstName);
assertEquals("Thilakan",
MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp().contact.lastName);
assertEquals("sathya.t@ishafoundation.org",
MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp().contact.email);
sentMailEntity = thulasiSentMail;
assertTrue(sentMailEntity.sentMailId >= currentNs);
assertEquals(mailContentId, sentMailEntity.mailContentId);
assertTrue(TagSet.safeGet(client, sentMailEntity.tagSetId).tags.contains("singapore"));
assertTrue(TagSet.safeGet(client, sentMailEntity.tagSetId).tags.contains("memberprofile"));
assertEquals("Thulasidhar",
MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp().contact.firstName);
assertEquals("Kosalram",
MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER).toProp().contact.lastName);
assertEquals("thulasidhar@gmail.com", MemberLoader.safeGet(client, sentMailEntity.memberId, User.SUPER_USER)
.toProp().contact.email);
}
@Test
public void repeatEmailNotSentWhenSuppressed() throws MandrillApiError, IOException {
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
assertEquals("test subject", MailContent.safeGet(client, mailContentId).subject);
assertEquals("test body", MailContent.safeGet(client, mailContentId).body);
assertEquals("test1", MailContent.safeGet(client, mailContentId).displayName);
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
String from = "singapore@ishayoga.org";
suppressEmailInTestEnv();
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = from;
msi.suppressIfAlreadySent = true;
msi.tags = Sets.newHashSet("singapore", "memberprofile");
List<SentMailEntity> entities = Mail.send(client, msi, mailMap, userWithPermssion.email);
assertEquals(1, entities.size());
ObjectifyFilter.complete();
entities = Mail.send(client, msi, mailMap, userWithPermssion.email);
assertEquals(0, entities.size());
}
@Test
public void repeatEmailSentWhenNotSuppressed() throws MandrillApiError, IOException {
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
assertEquals("test subject", MailContent.safeGet(client, mailContentId).subject);
assertEquals("test body", MailContent.safeGet(client, mailContentId).body);
assertEquals("test1", MailContent.safeGet(client, mailContentId).displayName);
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
String from = "singapore@ishayoga.org";
suppressEmailInTestEnv();
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = from;
msi.suppressIfAlreadySent = false;
msi.tags = Sets.newHashSet("singapore", "memberprofile");
List<SentMailEntity> entities = Mail.send(client, msi, mailMap, userWithPermssion.email);
assertEquals(1, entities.size());
ObjectifyFilter.complete();
entities = Mail.send(client, msi, mailMap, userWithPermssion.email);
assertEquals(1, entities.size());
}
@Test
public void sendEmailWithoutAnyTags() throws MandrillApiError, IOException {
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
assertEquals("test subject", MailContent.safeGet(client, mailContentId).subject);
assertEquals("test body", MailContent.safeGet(client, mailContentId).body);
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
String from = "singapore@ishayoga.org";
suppressEmailInTestEnv();
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = from;
msi.suppressIfAlreadySent = false;
List<SentMailEntity> entities = Mail.send(client, msi, mailMap, userWithPermssion.email);
assertEquals(1, entities.size());
assertEquals("sathya.t@ishafoundation.org", entities.get(0).email);
assertEquals(null, entities.get(0).tagSetId);
ObjectifyFilter.complete();
SentMailQueryCondition qc = new SentMailQueryCondition();
qc.email = "sathya.t@ishafoundation.org";
entities = Mail.queryEntitiesSortedByTimeDesc(client, qc, User.SUPER_USER);
assertEquals(1, entities.size());
assertEquals("sathya.t@ishafoundation.org", entities.get(0).email);
assertTrue(entities.get(0).memberId != null);
assertEquals(null, entities.get(0).tagSetId);
}
@Test
public void queryByEmail() throws MandrillApiError, IOException, InterruptedException {
long mailContentId1 = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
suppressEmailInTestEnv();
String from = "singapore@ishayoga.org";
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId1;
msi.senderEmail = from;
msi.suppressIfAlreadySent = false;
long ts1 = new Date().getTime();
// send five times
long sentMailId1 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId2 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId3 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId4 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId5 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long ts2 = new Date().getTime();
assertTrue(ts2 > ts1);
long mailContentId2 = MailContent.create(client, "test2", sgp.groupId, "test subject 2", "test body 2",
User.SUPER_USER).mailContentId;
msi.mailContentId = mailContentId2;
// send mailContentId2 five times
long sentMailId6 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId7 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId8 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId9 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
long sentMailId10 = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0).sentMailId;
Thread.sleep(50);
ObjectifyFilter.complete();
SentMailQueryCondition qc = new SentMailQueryCondition();
qc.email = "sathya.t@ishafoundation.org";
List<SentMailEntity> entities = Mail.queryEntitiesSortedByTimeDesc(client, qc, User.SUPER_USER);
assertEquals(10, entities.size());
// should be sorted in descending
assertEquals(sentMailId10, entities.get(0).sentMailId);
assertEquals(sentMailId9, entities.get(1).sentMailId);
assertEquals(sentMailId8, entities.get(2).sentMailId);
assertEquals(sentMailId7, entities.get(3).sentMailId);
assertEquals(sentMailId6, entities.get(4).sentMailId);
assertEquals(sentMailId5, entities.get(5).sentMailId);
assertEquals(sentMailId4, entities.get(6).sentMailId);
assertEquals(sentMailId3, entities.get(7).sentMailId);
assertEquals(sentMailId2, entities.get(8).sentMailId);
assertEquals(sentMailId1, entities.get(9).sentMailId);
// include only 3
qc.numResults = 3;
entities = Mail.queryEntitiesSortedByTimeDesc(client, qc, User.SUPER_USER);
assertEquals(3, entities.size());
assertEquals(sentMailId10, entities.get(0).sentMailId);
assertEquals(sentMailId9, entities.get(1).sentMailId);
assertEquals(sentMailId8, entities.get(2).sentMailId);
// include 6 between ts1 and ts2
// there are only 5 mails sent between this time
qc.startMS = ts1;
qc.endMS = ts2;
qc.numResults = 6;
entities = Mail.queryEntitiesSortedByTimeDesc(client, qc, User.SUPER_USER);
assertEquals(5, entities.size());
assertEquals(sentMailId5, entities.get(0).sentMailId);
assertEquals(sentMailId4, entities.get(1).sentMailId);
assertEquals(sentMailId3, entities.get(2).sentMailId);
assertEquals(sentMailId2, entities.get(3).sentMailId);
assertEquals(sentMailId1, entities.get(4).sentMailId);
}
@Test
public void getStatsByMailContent() throws MandrillApiError, IOException, InterruptedException {
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject",
"test body <a href=\"http:\\www.google.com\">link</a>", User.SUPER_USER).mailContentId;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
suppressEmailInTestEnv();
String from = "singapore@ishayoga.org";
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = from;
msi.suppressIfAlreadySent = false;
// send five times
SentMailEntity sentMailEntity = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0);
assertEquals(mailContentId, sentMailEntity.mailContentId);
sentMailEntity = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0);
assertEquals(mailContentId, sentMailEntity.mailContentId);
sentMailEntity = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0);
assertEquals(mailContentId, sentMailEntity.mailContentId);
sentMailEntity = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0);
assertEquals(mailContentId, sentMailEntity.mailContentId);
sentMailEntity = Mail.send(client, msi, mailMap, userWithPermssion.email).get(0);
assertEquals(mailContentId, sentMailEntity.mailContentId);
ObjectifyFilter.complete();
MailStatsProp mailStatsProp = Mail.getStatsByMailContent(client, mailContentId, userWithPermssion.email);
assertEquals(5, mailStatsProp.numRecipientsSendAttempted);
assertEquals(1, mailStatsProp.urlVsNumRecipientsThatClicked.size());
assertEquals(0, mailStatsProp.urlVsNumRecipientsThatClicked.get("http:\\www.google.com").intValue());
}
@Test(expected = APIException.class)
public void permissionRequiredToSendEmail() throws MandrillApiError, IOException {
MailTest.suppressEmailInTestEnv();
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = "singapore@ishayoga.org";
msi.suppressIfAlreadySent = true;
Mail.send(client, msi, mailMap, userWOPermssion.email);
assertTrue(false);
}
@Test
public void memberCreatedWhenFlagSet() throws MandrillApiError, IOException {
MailTest.suppressEmailInTestEnv();
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
MailSendInput msi = new MailSendInput();
msi.createMember = true;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = "singapore@ishayoga.org";
msi.suppressIfAlreadySent = true;
List<SentMailEntity> sentMailEntities = Mail.send(client, msi, mailMap, User.SUPER_USER);
ObjectifyFilter.complete();
assertEquals(1, sentMailEntities.size());
assertNotNull(sentMailEntities.get(0).memberId);
assertEquals("sathya.t@ishafoundation.org", sentMailEntities.get(0).email);
MemberQueryCondition mqc = new MemberQueryCondition(client, 10000);
int count = MemberLoader.getCount(mqc, User.SUPER_USER);
assertEquals(1, count);
}
@Test
public void memberNotCreatedWhenFlagNotSet() throws MandrillApiError, IOException {
MailTest.suppressEmailInTestEnv();
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
MailSendInput msi = new MailSendInput();
msi.createMember = false;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = "singapore@ishayoga.org";
msi.suppressIfAlreadySent = true;
List<SentMailEntity> sentMailEntities = Mail.send(client, msi, mailMap, User.SUPER_USER);
ObjectifyFilter.complete();
assertEquals(1, sentMailEntities.size());
assertNull(sentMailEntities.get(0).memberId);
assertEquals("sathya.t@ishafoundation.org", sentMailEntities.get(0).email);
MemberQueryCondition mqc = new MemberQueryCondition(client, 10000);
int count = MemberLoader.getCount(mqc, User.SUPER_USER);
assertEquals(0, count);
}
@Test
public void canSendEmailToEnabledList() throws MandrillApiError, IOException {
suppressEmailInTestEnv();
ListProp newsletter = crmdna.list.List.createPublic(client, sgp.groupId, "Newsletter", User.SUPER_USER);
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
mailMap.add("thulasidhar@gmail.com", "Thulasi", "Kosalram");
Member.bulkSubscribeList(client, newsletter.listId, mailMap, User.SUPER_USER);
ObjectifyFilter.complete();
MailContentProp mailContentProp = MailContent.create(client, "Aug 14 Newsletter", sgp.groupId,
"Aug 14 Newsletter", "Hello everyone,...", User.SUPER_USER);
List<SentMailEntity> sentMailEntities = Mail.sendToList(client, newsletter.listId,
mailContentProp.mailContentId, "singapore@ishayoga.org", null, User.SUPER_USER, "Isha", "Isha");
ObjectifyFilter.complete();
assertEquals(2, sentMailEntities.size());
// sort in ascending order of email
Collections.sort(sentMailEntities, new Comparator<SentMailEntity>() {
@Override
public int compare(SentMailEntity arg0, SentMailEntity arg1) {
// TODO Auto-generated method stub
return arg0.email.compareTo(arg1.email);
}
});
assertEquals("sathya.t@ishafoundation.org", sentMailEntities.get(0).email);
assertEquals("thulasidhar@gmail.com", sentMailEntities.get(1).email);
}
@Test
public void cannotSendEmailToDisabledList() throws MandrillApiError, IOException {
suppressEmailInTestEnv();
ListProp newsletter = crmdna.list.List.createPublic(client, sgp.groupId, "Newsletter", User.SUPER_USER);
crmdna.list.List.disable(client, newsletter.listId, User.SUPER_USER);
MailContentProp mailContentProp = MailContent.create(client, "Aug 14 Newsletter", sgp.groupId,
"Aug 14 Newsletter", "Hello everyone,...", User.SUPER_USER);
try {
Mail.sendToList(client, newsletter.listId, mailContentProp.mailContentId, "singapore@ishayoga.org", null,
User.SUPER_USER, "Isha", "Isha");
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
}
}
@Test
public void mailNotSentToUnsubscribedEmails() throws IOException, MandrillApiError {
suppressEmailInTestEnv();
MailContentProp newsletter = MailContent.create(client, "Aug 14 Newsletter", sgp.groupId,
"Aug 14 Newsletter", "Hello everyone,...", User.SUPER_USER);
//create two members m1 and m2
//m1 is subscribed to singapore
//m2 is unsubscribed to singapore
ContactProp c1 = new ContactProp();
c1.firstName = "Member1";
c1.email = "m1@invalid.com";
c1.asOfyyyymmdd = DateUtils.toYYYYMMDD(new Date());
MemberProp m1 = Member.create(client, sgp.groupId, c1, false, User.SUPER_USER);
ContactProp c2 = new ContactProp();
c2.firstName = "Member2";
c2.email = "m2@invalid.com";
c2.asOfyyyymmdd = DateUtils.toYYYYMMDD(new Date());
MemberProp m2 = Member.create(client, sgp.groupId, c2, false, User.SUPER_USER);
Member.subscribeGroup(client, m1.memberId, sgp.groupId, User.SUPER_USER);
Member.subscribeGroup(client, m2.memberId, sgp.groupId, User.SUPER_USER);
Member.unsubscribeGroup(client, m2.memberId, sgp.groupId, User.SUPER_USER);
m1 = MemberLoader.safeGet(client, m1.memberId, User.SUPER_USER).toProp();
assertTrue(m1.subscribedGroupIds.contains(sgp.groupId));
m2 = MemberLoader.safeGet(client, m2.memberId, User.SUPER_USER).toProp();
assertTrue(m2.unsubscribedGroupIds.contains(sgp.groupId));
MailMap mailMap = new MailMap();
mailMap.add("m1@invalid.com", "First1", "Last1");
mailMap.add("m2@invalid.com", "First2", "Last2");
MailSendInput msi = new MailSendInput();
msi.createMember = false;
msi.groupId = sgp.groupId;
msi.isTransactionEmail = false;
msi.mailContentId = newsletter.mailContentId;
msi.senderEmail = "singapore@ishayoga.org";
msi.suppressIfAlreadySent = true;
List<SentMailEntity> sentEmailEntities = Mail.send(client, msi, mailMap, User.SUPER_USER);
assertEquals(1, sentEmailEntities.size());
assertEquals("m1@invalid.com", sentEmailEntities.get(0).email);
}
@Test
public void cannotSendMarketingEmailAtClientLevel() throws IOException, MandrillApiError {
suppressEmailInTestEnv();
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
MailSendInput msi = new MailSendInput();
msi.createMember = false;
msi.isTransactionEmail = false;
msi.mailContentId = mailContentId;
msi.senderEmail = "singapore@ishayoga.org";
msi.suppressIfAlreadySent = true;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
mailMap.add("thulasidhar@gmail.com", "Thulasi", "Kosalram");
try {
Mail.send(client, msi, mailMap, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
}
@Test
public void cannotSendTransactionEmailsInBulk() throws IOException, MandrillApiError {
suppressEmailInTestEnv();
long mailContentId = MailContent.create(client, "test1", sgp.groupId, "test subject", "test body",
User.SUPER_USER).mailContentId;
MailSendInput msi = new MailSendInput();
msi.createMember = false;
msi.isTransactionEmail = true;
msi.mailContentId = mailContentId;
msi.senderEmail = "singapore@ishayoga.org";
msi.suppressIfAlreadySent = true;
MailMap mailMap = new MailMap();
mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan");
mailMap.add("thulasidhar@gmail.com", "Thulasi", "Kosalram");
try {
Mail.send(client, msi, mailMap, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
//try group level transaction email
msi.groupId = sgp.groupId;
try {
Mail.send(client, msi, mailMap, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
}
@Test
public void sendToParticipantsIfPresentInListTest() throws IOException, MandrillApiError {
suppressEmailInTestEnv();
long mailContentId = MailContent.create(client, "Welcome to isha", sgp.groupId, "welcome", "welcome",
User.SUPER_USER).mailContentId;
long programId = createIshaUpaYogaProgram();
long listId = crmdna.list.List.createRestricted(client, sgp.groupId, "Isha Upa Yoga",
null, User.SUPER_USER).listId;
ContactProp c = new ContactProp();
c.email = "sathya.t@ishafoundation.org";
c.asOfyyyymmdd = 20150911;
MemberProp sathya = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
Member.subscribeGroup(client, sathya.memberId, sgp.groupId, User.SUPER_USER);
sathya = Member.addOrDeleteProgram(client, sathya.memberId, programId, true, User.SUPER_USER);
assertTrue(sathya.programIds.contains(programId));
assertTrue(sathya.subscribedGroupIds.contains(sgp.groupId));
List<SentMailEntity> sentMailEntities = Mail.sendToParticipantsIfPresentInList(client, programId,
listId, mailContentId,
"singapore@ishayoga.org", "Isha", "Isha", userWithPermssion.email);
//no mail should be sent as the participants are not added to list
assertEquals(0, sentMailEntities.size());
//now add participants to list
Member.addOrDeleteList(client, sathya.memberId, listId, true, User.SUPER_USER);
//mail should go out now
sentMailEntities = Mail.sendToParticipantsIfPresentInList(client, programId,
listId, mailContentId,
"singapore@ishayoga.org", "Isha", "Isha", userWithPermssion.email);
assertEquals(1, sentMailEntities.size());
assertEquals(sathya.memberId, sentMailEntities.get(0).mailContentId);
//send one more time, it should be suppressed
sentMailEntities = Mail.sendToParticipantsIfPresentInList(client, programId,
listId, mailContentId,
"singapore@ishayoga.org", "Isha", "Isha", userWithPermssion.email);
assertEquals(0, sentMailEntities.size());
}
private long createIshaUpaYogaProgram() {
long venueId = Venue.create(client, "Venue1", "Full address",
sgp.groupId, User.SUPER_USER).venueId;
long teacherId = Teacher.create(client, "firstname", "lastname",
"email@dummy.com", sgp.groupId, User.SUPER_USER).teacherId;
long programTypeId = ProgramType.create(client, "Isha Upa Yoga", null, User.SUPER_USER).programTypeId;
long programId = Program.create(client, sgp.groupId, programTypeId, venueId, teacherId, 20150911, 20150911,
1, null, 0, Utils.Currency.SGD, User.SUPER_USER).programId;
return programId;
}
}