package crmdna.mail2; 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.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.ListProp; import crmdna.member.Member; import crmdna.member.MemberProp; import crmdna.user.User; import crmdna.user.User.GroupLevelPrivilege; import crmdna.user.UserProp; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.Date; import java.util.HashSet; import java.util.Set; import static org.junit.Assert.*; public class MailScheduleTest { 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 userWithSgpEmailPrivilage; private MailContentProp newsletter; private ListProp newsletterListSgp; private ListProp ishakriyaListSgp; private ListProp newsletterListKl; private MemberProp sharmila, patma; @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_SCHEDULE, User.SUPER_USER); userWithSgpEmailPrivilage = User.create(client, "userwithsgpemail@invalid.com", sgp.groupId, User.SUPER_USER); User.addGroupLevelPrivilege(client, sgp.groupId, userWithSgpEmailPrivilage.email, GroupLevelPrivilege.SEND_EMAIL, User.SUPER_USER); validUser = User.create(client, "validuser@invalid.com", sgp.groupId, User.SUPER_USER); newsletter = MailContent.create(client, "Newsletter", sgp.groupId, "Mail content subject", "Mail content body", User.SUPER_USER); newsletterListSgp = List.createPublic(client, sgp.groupId, "Newsletter sgp list", User.SUPER_USER); ishakriyaListSgp = List.createPublic(client, sgp.groupId, "Isha kriya sgp list", User.SUPER_USER); newsletterListKl = List.createPublic(client, kl.groupId, "Newsletter kl list", User.SUPER_USER); ContactProp c = new ContactProp(); c.asOfyyyymmdd = 20151118; c.firstName = "Sharmila"; c.email = "sharmila@sharmila.com"; sharmila = Member.create(client, sgp.groupId, c, false, User.SUPER_USER); Member.subscribeList_to_be_removed(client, sharmila.memberId, ishakriyaListSgp.listId, User.SUPER_USER); Member.subscribeList_to_be_removed(client, sharmila.memberId, newsletterListSgp.listId, User.SUPER_USER); c = new ContactProp(); c.asOfyyyymmdd = 20151118; c.firstName = "Patma"; c.email = "patma@patma.com"; patma = Member.create(client, kl.groupId, c, false, User.SUPER_USER); Member.subscribeList_to_be_removed(client, patma.memberId, newsletterListKl.listId, User.SUPER_USER); } @After public void tearDown() { ObjectifyFilter.complete(); datastoreHelper.tearDown(); } @Test(expected = APIException.class) public void cannotScheduleEmailForInvalidClient() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailSchedule.create("invalidclient", 1, after24Hours, newsletterListSgp.listId, "Isha", "Isha", User.SUPER_USER); } @Test public void userWOPermissionCannotScheduleEmail() { try { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailSchedule.create(client, newsletter.mailContentId, after24Hours, newsletterListSgp.listId, "Isha", "Isha", validUser.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode); } } @Test public void cannotScheduleForTimeInPast() { try { Date before24Hours = new Date(new Date().getTime() - 86400 * 1000); MailSchedule.create(client, newsletter.mailContentId, before24Hours, newsletterListSgp.listId, "Isha", "Isha", User.SUPER_USER); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode); } } @Test public void cannotCreateScheduledEmailForInvalidList() { try { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); long invalidListId = 1098; MailSchedule.create(client, newsletter.mailContentId, after24Hours, invalidListId, "Isha", "Isha", User.SUPER_USER); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode); } } @Test public void cannotCreateScheduleIfListHasNoMembers() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); ListProp listProp = List.createPublic(client, sgp.groupId, "List", User.SUPER_USER); assertNotNull(listProp); try { MailSchedule.create(client, newsletter.mailContentId, after24Hours, listProp.listId, "Isha", "Isha", User.SUPER_USER); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode); } } @Test public void userWithPermissionCanScheduleEmail() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after24Hours, newsletterListSgp.listId, "Isha", "Isha", userWithUpdatePrivilage.email); mailScheduleProp = MailSchedule.safeGet(client, mailScheduleProp.mailScheduleId); //check all fields populated correctly assertEquals(1, mailScheduleProp.mailScheduleId); assertEquals(newsletter.mailContentId, mailScheduleProp.mailContentId); assertEquals(after24Hours, mailScheduleProp.scheduledTime); assertEquals(1, mailScheduleProp.listIds.size()); assertTrue(mailScheduleProp.listIds.contains(newsletterListSgp.listId)); assertEquals(userWithUpdatePrivilage.email, mailScheduleProp.owner); assertEquals(newsletterListSgp.groupId, mailScheduleProp.groupId); assertEquals(false, mailScheduleProp.cancelled); assertEquals(false, mailScheduleProp.sendAttempted); assertNull(mailScheduleProp.sendAttemptedTime); assertNull(mailScheduleProp.sendSuccess); assertNull(mailScheduleProp.failureReason); assertEquals(mailScheduleProp.subject, MailContent.safeGet(client, newsletter.mailContentId).subject); } @Test public void mailScheduleIdAssignedInSequence() { Date after1Day = new Date(new Date().getTime() + 86400 * 1000); Set<Long> listIds = new HashSet<>(); listIds.add(newsletterListSgp.listId); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after1Day, newsletterListSgp.listId, "Isha", "Isha", User.SUPER_USER); assertEquals(1, mailScheduleProp.mailScheduleId); Date after3Days = new Date(new Date().getTime() + 3 * 24 * 3600 * 1000); mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after3Days, newsletterListSgp.listId, "Isha", "Isha", User.SUPER_USER); assertEquals(2, mailScheduleProp.mailScheduleId); Date after5Days = new Date(new Date().getTime() + 5 * 24 * 3600 * 1000); mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after5Days, newsletterListSgp.listId, "Isha", "Isha", User.SUPER_USER); assertEquals(3, mailScheduleProp.mailScheduleId); } @Test public void canCancelOnesOwnScheduledEmail() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after24Hours, newsletterListSgp.listId, "Isha", "Isha", userWithSgpEmailPrivilage.email); assertEquals(1, mailScheduleProp.mailScheduleId); MailSchedule.cancel(client, mailScheduleProp.mailScheduleId, userWithSgpEmailPrivilage.email); mailScheduleProp = MailSchedule.safeGet(client, mailScheduleProp.mailScheduleId); assertTrue(mailScheduleProp.cancelled); } @Test public void canUndoCancelOnesOwnScheduledEmail() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after24Hours, newsletterListSgp.listId, "Isha", "Isha", userWithSgpEmailPrivilage.email); assertEquals(1, mailScheduleProp.mailScheduleId); MailSchedule.cancel(client, mailScheduleProp.mailScheduleId, userWithSgpEmailPrivilage.email); mailScheduleProp = MailSchedule.safeGet(client, mailScheduleProp.mailScheduleId); assertTrue(mailScheduleProp.cancelled); MailSchedule.undoCancel(client, mailScheduleProp.mailScheduleId, userWithSgpEmailPrivilage.email); mailScheduleProp = MailSchedule.safeGet(client, mailScheduleProp.mailScheduleId); assertFalse(mailScheduleProp.cancelled); } @Test public void userWOPermissionCannotCancelSomeonesScheduledEmail() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after24Hours, newsletterListSgp.listId, "Isha", "Isha", userWithSgpEmailPrivilage.email); assertEquals(1, mailScheduleProp.mailScheduleId); try { MailSchedule.cancel(client, mailScheduleProp.mailScheduleId, validUser.email); assertTrue(false); } catch (APIException ex) { assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode); } } @Test public void userWithPermissionCanCancelSomeonesScheduledEmail() { Date after24Hours = new Date(new Date().getTime() + 86400 * 1000); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after24Hours, newsletterListSgp.listId, "Isha", "Isha", userWithSgpEmailPrivilage.email); assertEquals(1, mailScheduleProp.mailScheduleId); MailSchedule.cancel(client, mailScheduleProp.mailScheduleId, userWithUpdatePrivilage.email); mailScheduleProp = MailSchedule.safeGet(client, mailScheduleProp.mailScheduleId); assertTrue(mailScheduleProp.cancelled); } @Test public void cannotCancelIfAlreadyPickedUpForSending() { assertTrue(false); } @Test public void canGetAllOutstandingScheduledEmails() { assertTrue(false); } @Test public void canGetAllScheduledEmailsForAGroup() { assertTrue(false); } @Test public void scheduledEmailSentOutOnlyOnce() { assertTrue(false); } @Test public void notSentIfCancelled() { assertTrue(false); } @Test public void sentAtScheduledTimeIfNotCancelled() throws InterruptedException { Date after10Ms = new Date(new Date().getTime() + 10); MailScheduleProp mailScheduleProp = MailSchedule.create(client, newsletter.mailContentId, after10Ms, newsletterListSgp.listId, "Isha", "Isha", userWithSgpEmailPrivilage.email); Thread.sleep(200); MailTest.suppressEmailInTestEnv(); MailSchedule.processScheduledEmails(client, new Date()); mailScheduleProp = MailSchedule.safeGet(client, mailScheduleProp.mailScheduleId); assertTrue(mailScheduleProp.sendAttempted); SentMailQueryCondition smqc = new SentMailQueryCondition(); smqc.email = sharmila.contact.email; smqc.mailContentId = newsletter.mailContentId; java.util.List<SentMailEntity> sentMailEntities = Mail.queryEntitiesSortedByTimeDesc(client, smqc, User.SUPER_USER); assertEquals(1, sentMailEntities.size()); } @Test public void reportSentToOwnerAfterMailSent() { assertTrue(false); } @Test public void reportSentToOwnerAfterError() { assertTrue(false); } }