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 com.microtripit.mandrillapp.lutung.model.MandrillApiError; 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.ListHelper; import crmdna.list.ListProp; import crmdna.member.Member; import crmdna.member.MemberProp; import crmdna.user.User; import crmdna.user.User.ClientLevelPrivilege; import crmdna.user.User.GroupLevelPrivilege; import crmdna.user.UserProp; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.*; import static org.junit.Assert.*; public class MailContentTest { private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper( new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy()); private final String client = "isha"; private GroupProp sgp; private GroupProp kl; private UserProp userWithUpdatePrivilage; private UserProp validUser; private UserProp validUser2; @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); Group.addOrDeleteAllowedEmailSender(client, sgp.groupId, "singapore@ishayoga.org", "Isha Singapore", true, User.SUPER_USER); userWithUpdatePrivilage = User.create(client, "userwithpermission@invalid.com", sgp.groupId, User.SUPER_USER); User.addGroupLevelPrivilege(client, sgp.groupId, userWithUpdatePrivilage.email, GroupLevelPrivilege.UPDATE_MAIL_CONTENT, User.SUPER_USER); validUser = User.create(client, "validuser@invalid.com", sgp.groupId, User.SUPER_USER); validUser2 = User.create(client, "validuser2@invalid.com", sgp.groupId, User.SUPER_USER); } @After public void tearDown() { ObjectifyFilter.complete(); datastoreHelper.tearDown(); } @Test public void queryByOwner() throws InterruptedException { MailContentProp sepSathsang = MailContent.create(client, "title1", sgp.groupId, "sathsang on 6 sep", "we invite you...", validUser.email); Thread.sleep(200); MailContentProp octSathsang = MailContent.create(client, "title2", sgp.groupId, "sathsang on 4 oct", "we invite you...", validUser.email); List<MailContentEntity> entities = MailContent.query(client, validUser.email, null, null, User.SUPER_USER); assertEquals(2, entities.size()); assertEquals(octSathsang.mailContentId, entities.get(0).mailContentId); assertEquals("sathsang on 4 oct", entities.get(0).subject); assertEquals("we invite you...", entities.get(0).body); assertEquals("title2", entities.get(0).displayName); assertEquals(sepSathsang.mailContentId, entities.get(1).mailContentId); assertEquals("sathsang on 6 sep", entities.get(1).subject); assertEquals("we invite you...", entities.get(1).body); assertEquals("title1", entities.get(1).displayName); } @Test public void queryByTS() throws InterruptedException { long ts1 = new Date().getTime(); MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 6 sep", "we invite you...", userWithUpdatePrivilage.email); Thread.sleep(200); long ts2 = new Date().getTime(); MailContentProp octSathsang = MailContent.create(client, "oct sathsang", sgp.groupId, "sathsang on 4 oct", "we invite you...", validUser.email); Thread.sleep(200); long ts3 = new Date().getTime(); // only sep sathsang List<MailContentEntity> entities = MailContent.query(client, null, ts1, ts2, validUser.email); assertEquals(1, entities.size()); assertEquals(sepSathsang.mailContentId, entities.get(0).mailContentId); assertEquals("sathsang on 6 sep", entities.get(0).subject); assertEquals("we invite you...", entities.get(0).body); // ts2 and later. only oct sathsang entities = MailContent.query(client, null, ts2, null, userWithUpdatePrivilage.email); assertEquals(1, entities.size()); assertEquals(octSathsang.mailContentId, entities.get(0).mailContentId); assertEquals("sathsang on 4 oct", entities.get(0).subject); assertEquals("we invite you...", entities.get(0).body); // between ts1 and ts3. both sathsangs entities = MailContent.query(client, null, ts1, ts3, userWithUpdatePrivilage.email); assertEquals(2, entities.size()); } @Test public void canCreateMailContentForGroup() { MailContentProp sepSathsang = MailContent.create(client, "Sep Sathsang", sgp.groupId, "sathsang on 6 sep", "we invite you...", validUser.email); sepSathsang = MailContent.safeGet(client, sepSathsang.mailContentId) .toProp(); assertEquals(1, sepSathsang.mailContentId); assertEquals("Sep Sathsang", sepSathsang.displayName); assertEquals("sepsathsang", sepSathsang.name); assertEquals("sathsang on 6 sep", sepSathsang.subject); assertEquals("we invite you...", sepSathsang.body); assertEquals(sgp.groupId, sepSathsang.groupId); } @Test public void canUpdateMailContentForGroup() { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 6 sep", "we invite you...", validUser.email); MailContent.update(client, sepSathsang.mailContentId, null, "sathsang on 6 sep 6pm", null, false, validUser.email); sepSathsang = MailContent.safeGet(client, sepSathsang.mailContentId) .toProp(); assertEquals("sep sathsang", sepSathsang.displayName); assertEquals("sathsang on 6 sep 6pm", sepSathsang.subject); assertEquals("we invite you...", sepSathsang.body); } @Test public void userWithPermissionCanCreateMailContentForClient() { User.addClientLevelPrivilege(client, userWithUpdatePrivilage.email, ClientLevelPrivilege.UPDATE_MAIL_CONTENT, User.SUPER_USER); MailContentProp mailContentProp = MailContent.create(client, "Verification email", 0, "Please verify your account", "Please enter code...", userWithUpdatePrivilage.email); MailContent.safeGet(client, mailContentProp.mailContentId); } @Test public void userWOPermissionCannotCreateMailContentForClient() { try { MailContent.create(client, "Verification email", 0, "Please verify your account", "Please enter code...", validUser.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode); } } @Test public void mailContentCannotBeUpdatedAfterSendingEmail() throws IOException, MandrillApiError { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); MailMap mailMap = new MailMap(); mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan"); MailTest.suppressEmailInTestEnv(); MailSendInput msi = new MailSendInput(); msi.createMember = true; msi.groupId = sgp.groupId; msi.isTransactionEmail = false; msi.mailContentId = sepSathsang.mailContentId; msi.senderEmail = "singapore@IshaYogA.org"; msi.suppressIfAlreadySent = false; List<SentMailEntity> entities = Mail.send(client, msi, mailMap, User.SUPER_USER); assertEquals(1, entities.size()); ObjectifyFilter.complete(); try { MailContent.update(client, sepSathsang.mailContentId, null, "sathsang on 6 sep", "we invite you...", false, validUser.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_OPERATION_NOT_ALLOWED, ex.statusCode); } } @Test public void mailContentCanBeUpdatedAfterSendingEmailIfFlagIsTrue() throws IOException, MandrillApiError { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); MailMap mailMap = new MailMap(); mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan"); MailTest.suppressEmailInTestEnv(); MailSendInput msi = new MailSendInput(); msi.createMember = true; msi.groupId = sgp.groupId; msi.isTransactionEmail = false; msi.mailContentId = sepSathsang.mailContentId; msi.senderEmail = "singapore@IshaYogA.org"; msi.suppressIfAlreadySent = false; List<SentMailEntity> entities = Mail.send(client, msi, mailMap, User.SUPER_USER); assertEquals(1, entities.size()); ObjectifyFilter.complete(); MailContent.update(client, sepSathsang.mailContentId, null, "sathsang on 6 sep", "we cordially invite you...", true, validUser.email); // no exception sepSathsang = MailContent.safeGet(client, sepSathsang.mailContentId) .toProp(); assertEquals("sathsang on 6 sep", sepSathsang.subject); assertEquals("we cordially invite you...", sepSathsang.body); } @Test public void mailContentCannotBeDeletedAfterSendingEmail() throws MandrillApiError, IOException { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); MailMap mailMap = new MailMap(); mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan"); MailTest.suppressEmailInTestEnv(); MailSendInput msi = new MailSendInput(); msi.createMember = true; msi.groupId = sgp.groupId; msi.isTransactionEmail = false; msi.mailContentId = sepSathsang.mailContentId; msi.senderEmail = "singapore@IshaYogA.org"; msi.suppressIfAlreadySent = false; List<SentMailEntity> entities = Mail.send(client, msi, mailMap, User.SUPER_USER); assertEquals(1, entities.size()); ObjectifyFilter.complete(); try { MailContent.delete(client, sepSathsang.mailContentId, validUser.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_OPERATION_NOT_ALLOWED, ex.statusCode); } } @Test public void mailContentCanBeDeletedByPrivilagedUser() { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); MailContent.delete(client, sepSathsang.mailContentId, userWithUpdatePrivilage.email); ObjectifyFilter.complete(); // MailContent should be deleted try { MailContent.safeGet(client, sepSathsang.mailContentId); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode); } } @Test public void mailContentCanBeDeletedByOwner() { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); MailContent.delete(client, sepSathsang.mailContentId, validUser.email); ObjectifyFilter.complete(); // MailContent should be deleted try { MailContent.safeGet(client, sepSathsang.mailContentId); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode); } } @Test(expected = APIException.class) public void displayNameUniqueForGroup() { MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", userWithUpdatePrivilage.email); MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we cordially invite you...", userWithUpdatePrivilage.email); } @Test public void displayNameCanRepeatInADifferentGroup() { MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", userWithUpdatePrivilage.email); MailContent.create(client, "sep sathsang", kl.groupId, "sathsang on 5 sep", "we cordially invite you...", userWithUpdatePrivilage.email); // no exception } @Test(expected = APIException.class) public void displayNameCannotBeUpdatedToExisting() { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", userWithUpdatePrivilage.email); MailContent.create(client, "oct sathsang", sgp.groupId, "sathsang on 5 sep", "we cordially invite you...", userWithUpdatePrivilage.email); MailContent.update(client, sepSathsang.mailContentId, "oct sathsang", null, null, false, userWithUpdatePrivilage.email); } @Test public void displayNameSetForBespokeEmail() throws MandrillApiError, IOException { MailMap mailMap = new MailMap(); mailMap.add("sathya.t@ishafoundation.org", "Sathya", "Thilakan"); String from = "sathyanarayanant@gmail.com"; MailTest.suppressEmailInTestEnv(); Group.addOrDeleteAllowedEmailSender(client, sgp.groupId, from, "Sathya t", true, User.SUPER_USER); List<SentMailEntity> entities = Mail.sendBespoke(client, sgp.groupId, mailMap, "test subject", "test body", from, null, User.SUPER_USER); assertEquals(1, entities.size()); MailContentProp mailContentProp = MailContent.safeGet(client, entities.get(0).mailContentId).toProp(); assertTrue(mailContentProp.displayName.contains("Bespoke_")); } @Test(expected = APIException.class) public void onlyValidUserCanCreateMailContent() { MailContent.create(client, "Test mail", sgp.groupId, "test", "test", "invalid@invalid.com"); } @Test public void privilageRequiredToUpdateMailContentCreatedBySomeoneElse() { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); try { MailContent.update(client, sepSathsang.mailContentId, "Sep Sathsang", "Sathsang on 6 sep", "We cordially invite you...", false, validUser2.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode); } MailContent.update(client, sepSathsang.mailContentId, "Sep Sathsang", "Sathsang on 6 sep", "We cordially invite you...", false, userWithUpdatePrivilage.email); sepSathsang = MailContent.safeGet(client, sepSathsang.mailContentId) .toProp(); assertEquals("Sep Sathsang", sepSathsang.displayName); assertEquals("Sathsang on 6 sep", sepSathsang.subject); assertEquals("We cordially invite you...", sepSathsang.body); } @Test public void privilageRequiredToDeleteMailContentCreatedBySomeoneElse() { MailContentProp sepSathsang = MailContent.create(client, "sep sathsang", sgp.groupId, "sathsang on 5 sep", "we invite you...", validUser.email); try { MailContent.delete(client, sepSathsang.mailContentId, validUser2.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode); } MailContent.delete(client, sepSathsang.mailContentId, userWithUpdatePrivilage.email); try { MailContent.safeGet(client, sepSathsang.mailContentId).toProp(); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode); } } @Test public void canGetByName() { MailContentProp mailContentProp = MailContent.create(client, "Account Verification", sgp.groupId, "Account verification", "Please verify..", User.SUPER_USER); MailContentEntity mailContentEntity = MailContent.getByName(client, "Account verification", sgp.groupId); assertEquals(mailContentProp.mailContentId, mailContentEntity.mailContentId); } @Test public void getByNameReturnsNullIfNameDoesNotExist() { MailContentEntity mailContentEntity = MailContent.getByName(client, "Dummy", sgp.groupId); assertNull(mailContentEntity); } }