package crmdna.calling;
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.Utils;
import crmdna.common.api.APIException;
import crmdna.common.api.APIResponse;
import crmdna.common.contact.ContactProp;
import crmdna.group.Group;
import crmdna.interaction.Interaction;
import crmdna.interaction.InteractionProp;
import crmdna.member.Member;
import crmdna.member.MemberProp;
import crmdna.practice.Practice;
import crmdna.program.Program;
import crmdna.program.ProgramProp;
import crmdna.programtype.ProgramType;
import crmdna.programtype.ProgramTypeProp;
import crmdna.teacher.Teacher;
import crmdna.user.User;
import crmdna.user.UserProp;
import crmdna.venue.Venue;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by sathya on 23/8/15.
*/
public class CampaignTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
String client;
String invalidClient = "invalid";
Group.GroupProp sgp, kl;
UserProp validUser, userWithCampaignPermissionInSgp;
ProgramProp ishaKriya20150823, ishaKriya20150830;
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
client = "isha";
Client.create(client);
sgp = crmdna.group.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);
assertEquals(1, User.get(client, validUser.email).toProp(client).userId);
userWithCampaignPermissionInSgp = User.create(client, "withpermission@dummy.com", sgp.groupId, User.SUPER_USER);
assertEquals(2, User.get(client, userWithCampaignPermissionInSgp.email).toProp(client).userId);
User.addGroupLevelPrivilege(client, sgp.groupId, userWithCampaignPermissionInSgp.email,
User.GroupLevelPrivilege.UPDATE_CAMPAIGN,
User.SUPER_USER);
Venue.VenueProp woodlandsCC =
Venue.create(client, "Woodlands CC", "Woodlands CC", sgp.groupId, User.SUPER_USER);
Teacher.TeacherProp thulasi = Teacher.create(client, "", "", "thulasidhar@gmail.com", sgp.groupId, User.SUPER_USER);
Practice.PracticeProp ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
ProgramTypeProp ishaKriyaTeacherLed = ProgramType.create(client, "Isha Kriya (Teacher led)",
Utils.getSet(ishaKriya.practiceId), User.SUPER_USER);
ishaKriya20150823 = Program.create(client, sgp.groupId, ishaKriyaTeacherLed.programTypeId,
woodlandsCC.venueId, thulasi.teacherId, 20150823, 20150823, 1, null, 0, null, User.SUPER_USER);
ishaKriya20150830 = Program.create(client, sgp.groupId, ishaKriyaTeacherLed.programTypeId,
woodlandsCC.venueId, thulasi.teacherId, 20150830, 20150830, 1, null, 0, null, User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void createTest() {
Campaign.create(client, ishaKriya20150823.programId, "Default",
20150801, 20150823, userWithCampaignPermissionInSgp.email);
//create with different name
CampaignProp prop = Campaign.create(client, ishaKriya20150823.programId, "Campaign-1", 20150815,
20150822, userWithCampaignPermissionInSgp.email);
assertEquals("campaign id in sequence", 2, prop.campaignId);
assertEquals("Campaign-1", prop.displayName);
assertEquals("campaign1", prop.campaignName);
assertTrue(prop.enabled);
assertEquals(ishaKriya20150823.programId, prop.programId);
assertEquals(20150815, prop.startYYYYMMDD);
assertEquals(20150822, prop.endYYYYMMDD);
//cannot create if name clash for same program
try {
prop = Campaign.create(client, ishaKriya20150823.programId, "Campaign_1", 20150815,
20150822, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
//can create with same name for different program
prop = Campaign.create(client, ishaKriya20150830.programId, "Campaign_1",
20150801, 20150830, userWithCampaignPermissionInSgp.email);
assertEquals(ishaKriya20150830.programId, prop.programId);
//no exception
//start date, end date should be valid
try {
Campaign.create(client, ishaKriya20150830.programId, "Campaign-2",
20150000, 20150830, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("Invalid start date", APIResponse.Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
try {
Campaign.create(client, ishaKriya20150830.programId, "Campaign-2",
20150801, 20150832, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("Invalid end date", APIResponse.Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
try {
Campaign.create(client, ishaKriya20150830.programId, "Campaign-2",
20150831, 20150801, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("End date before start date", APIResponse.Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
}
@Test
public void renameTest() {
long campaignId =
Campaign.create(client, ishaKriya20150823.programId, "Default", 20150801, 20150825,
userWithCampaignPermissionInSgp.email).campaignId;
//permission required to rename
try {
Campaign.rename(client, campaignId, "Campaign-1", validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
//user with permission can rename
Campaign.rename(client, campaignId, "Campaign-1", userWithCampaignPermissionInSgp.email);
CampaignProp prop = Campaign.safeGet(client, campaignId).toProp();
assertEquals(campaignId, prop.campaignId);
assertEquals("Campaign-1", prop.displayName);
assertEquals("campaign1", prop.campaignName);
//can change case
Campaign.rename(client, campaignId, "campaign_1", userWithCampaignPermissionInSgp.email);
prop = Campaign.safeGet(client, campaignId).toProp();
assertEquals(campaignId, prop.campaignId);
assertEquals("campaign_1", prop.displayName);
assertEquals("campaign1", prop.campaignName);
//cannot rename to another existing name
prop = Campaign.create(client, ishaKriya20150823.programId, "Default", 20150801, 20150831,
userWithCampaignPermissionInSgp.email);
assertEquals("Default", prop.displayName);
try {
Campaign.rename(client, campaignId, "Default", userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
}
@Test
public void enableDisableTest() {
long campaignId =
Campaign.create(client, ishaKriya20150823.programId, "Default", 20150801, 20150825,
userWithCampaignPermissionInSgp.email).campaignId;
//permission required to enable/disable
try {
Campaign.enable(client, campaignId, false, validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
Campaign.enable(client, campaignId, false, userWithCampaignPermissionInSgp.email);
assertEquals(false, Campaign.safeGet(client, campaignId).toProp().enabled);
try {
Campaign.enable(client, campaignId, true, validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
Campaign.enable(client, campaignId, true, userWithCampaignPermissionInSgp.email);
assertEquals(true, Campaign.safeGet(client, campaignId).toProp().enabled);
}
@Test
public void updateDates() {
long campaignId =
Campaign.create(client, ishaKriya20150823.programId, "Default",
20150801, 20150831,
userWithCampaignPermissionInSgp.email).campaignId;
try {
Campaign.updateDates(client, campaignId, 20150631, null, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("invalid start date", APIResponse.Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
try {
Campaign.updateDates(client, campaignId, 20150801, 201508222, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("invalid end date", APIResponse.Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
try {
Campaign.updateDates(client, campaignId, 20150801, 20150722, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("end date before start date", APIResponse.Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
//all ok
Campaign.updateDates(client, campaignId, 20150801, 20150822, userWithCampaignPermissionInSgp.email);
CampaignProp prop = Campaign.safeGet(client, campaignId).toProp();
assertEquals(20150801, prop.startYYYYMMDD);
assertEquals(20150822, prop.endYYYYMMDD);
}
@Test
public void permissionRequiredToDelete() {
long campaignId =
Campaign.create(client, ishaKriya20150823.programId, "Default",
20150801, 20150831,
userWithCampaignPermissionInSgp.email).campaignId;
try {
Campaign.delete(client, campaignId, validUser.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("permission required to delete",
APIResponse.Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
Campaign.delete(client, campaignId, userWithCampaignPermissionInSgp.email);
//check it is deleted
try {
Campaign.safeGet(client, campaignId);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test
public void canDeleteOnlyIfNoInteractions() {
long campaignId =
Campaign.create(client, ishaKriya20150823.programId, "Default",
20150801, 20150831,
userWithCampaignPermissionInSgp.email).campaignId;
ContactProp c = new ContactProp();
c.email = "sathya.t@ishafoundation.org";
c.asOfyyyymmdd = 20150825;
MemberProp m = Member.create(client, sgp.groupId, c, false, User.SUPER_USER);
InteractionProp interactionProp = Interaction.createInteraction(client, m.memberId,
"test 1", Interaction.InteractionType.EMAIL,
new Date(), campaignId, false, validUser.email);
try {
Campaign.delete(client, campaignId, userWithCampaignPermissionInSgp.email);
assertTrue(false);
} catch (APIException ex) {
assertEquals("Cannot delete a campaign with interactions",
APIResponse.Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
}
Interaction.deleteInteraction(client, interactionProp.interactionId, validUser.email);
Campaign.delete(client, campaignId, userWithCampaignPermissionInSgp.email);
try {
Campaign.safeGet(client, campaignId);
assertTrue(false);
} catch (APIException ex) {
assertEquals(APIResponse.Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test
public void queryTest() {
CampaignQueryCondition qc = new CampaignQueryCondition();
List<CampaignEntity> campaignProps = Campaign.query(client, qc, validUser.email);
assertTrue("Empty list when no campaigns", campaignProps.isEmpty());
CampaignProp c1 = Campaign.create(client, ishaKriya20150823.programId, "C1",
20150801, 20150820,
userWithCampaignPermissionInSgp.email);
CampaignProp c2 = Campaign.create(client, ishaKriya20150823.programId, "C2",
20150808, 20150823,
userWithCampaignPermissionInSgp.email);
//try for group kl. should be empty list
qc = new CampaignQueryCondition();
qc.groupIds.add(kl.groupId);
campaignProps = Campaign.query(client, qc, validUser.email);
assertTrue(campaignProps.isEmpty());
//try for multiple groups
qc.groupIds.add(sgp.groupId);
campaignProps = Campaign.query(client, qc, validUser.email);
assertEquals(2, campaignProps.size());
//specify end date
qc = new CampaignQueryCondition();
qc.groupIds.add(kl.groupId);
qc.endDateGreaterThanYYYYMMDD = 20150820;
campaignProps = Campaign.query(client, qc, validUser.email);
assertTrue(campaignProps.isEmpty());
qc = new CampaignQueryCondition();
qc.programIds.add(ishaKriya20150823.programId);
qc.endDateGreaterThanYYYYMMDD = 20150821;
campaignProps = Campaign.query(client, qc, validUser.email);
assertEquals(1, campaignProps.size());
assertEquals(c2.campaignId, campaignProps.get(0).campaignId);
//query by enabled
qc = new CampaignQueryCondition();
qc.programIds.add(ishaKriya20150823.programId);
qc.programIds.add(ishaKriya20150830.programId);
qc.enabled = false;
campaignProps = Campaign.query(client, qc, validUser.email);
assertTrue(campaignProps.isEmpty());
}
}