package crmdna.member;
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.OfyService;
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.practice.Practice;
import crmdna.practice.Practice.PracticeProp;
import crmdna.program.Program;
import crmdna.program.ProgramProp;
import crmdna.programtype.ProgramType;
import crmdna.programtype.ProgramTypeProp;
import crmdna.teacher.Teacher;
import crmdna.teacher.Teacher.TeacherProp;
import crmdna.user.User;
import crmdna.user.User.ClientLevelPrivilege;
import crmdna.user.UserCore;
import crmdna.venue.Venue;
import crmdna.venue.Venue.VenueProp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class MemberSaverTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private final String invalidClient = "invalid";
private final String validUser = "valid@login.com";
private final String validUser2 = "valid2@login.com";
private final String invalidUser = "invalid@login.com";
private final String userWithPermission = "userwithpermission@login.com";
ProgramProp shambhavi201405, mysticEye201401, sathsang201405;
MemberProp thulasi;
String sgpUser = "sgpuser@valid.com";
private GroupProp sgp;
private GroupProp kl;
private GroupProp sydney;
private GroupProp iyc;
private PracticeProp shambhavi, mysticEye, ishaKriya;
private ProgramTypeProp shambhavi2Day, mysticEye1Day;
@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, "Malaysia/KL", User.SUPER_USER);
assertEquals(2, kl.groupId);
sydney = Group.create(client, "Australia/Sydney", User.SUPER_USER);
assertEquals(3, sydney.groupId);
iyc = Group.create(client, "India/Isha Yoga Center", User.SUPER_USER);
assertEquals(4, iyc.groupId);
User.create(client, validUser, sgp.groupId, User.SUPER_USER);
assertEquals(1,
UserCore.safeGet(client, validUser).toProp(client).userId);
User.create(client, validUser2, sgp.groupId, User.SUPER_USER);
assertEquals(2,
UserCore.safeGet(client, validUser2).toProp(client).userId);
User.create(client, userWithPermission, sgp.groupId, User.SUPER_USER);
assertEquals(
3,
UserCore.safeGet(client, userWithPermission).toProp(client).userId);
User.addClientLevelPrivilege(client, userWithPermission,
ClientLevelPrivilege.UPDATE_INTERACTION, User.SUPER_USER);
shambhavi = Practice.create("isha", "Shambhavi", User.SUPER_USER);
mysticEye = Practice.create("isha", "MysticEye", User.SUPER_USER);
ishaKriya = Practice.create("isha", "IshaKriya", User.SUPER_USER);
Set<Long> sathsangPracticeIds = new HashSet<>();
sathsangPracticeIds.add(shambhavi.practiceId);
sathsangPracticeIds.add(mysticEye.practiceId);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(shambhavi.practiceId);
ProgramTypeProp shambhavi2Day = ProgramType.create("isha", "Shambhavi",
practiceIds, User.SUPER_USER);
practiceIds.clear();
practiceIds.add(mysticEye.practiceId);
ProgramTypeProp mysticEye1Day = ProgramType.create("isha", "MysticEye",
practiceIds, User.SUPER_USER);
ProgramTypeProp sathsang = ProgramType.create("isha", "Sathsang", null,
User.SUPER_USER);
GroupProp chennai = Group.create("isha", "Chennai", User.SUPER_USER);
VenueProp giis = Venue.create("isha", "GIIS", "GIIS", sgp.groupId,
User.SUPER_USER);
VenueProp expo = Venue.create("isha", "Expo", "Expo", sgp.groupId,
User.SUPER_USER);
TeacherProp nidhi = Teacher.create("isha", "Nidhi", "Jain",
"nidhi.jain@ishafoundation.org", sgp.groupId, User.SUPER_USER);
TeacherProp sadhguru = Teacher.create("isha", "Sadhguru", "",
"sadhguru@ishafoundation.org", sgp.groupId, User.SUPER_USER);
shambhavi201405 = Program.create("isha", sgp.groupId,
shambhavi2Day.programTypeId, giis.venueId, nidhi.teacherId,
20140503, 20140504, 1, null, 0, null, User.SUPER_USER);
mysticEye201401 = Program.create("isha", sgp.groupId,
mysticEye1Day.programTypeId, expo.venueId, sadhguru.teacherId,
20140503, 20140504, 1, null, 0, null, User.SUPER_USER);
sathsang201405 = Program.create("isha", sgp.groupId,
sathsang.programTypeId, giis.venueId, nidhi.teacherId,
20140503, 20140503, 1, null, 0, null, User.SUPER_USER);
User.create("isha", sgpUser, sgp.groupId, User.SUPER_USER);
User.addClientLevelPrivilege("isha", sgpUser,
ClientLevelPrivilege.UPDATE_GROUP, User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void addOrDeleteGroupTest() {
ContactProp contact = new ContactProp();
contact.email = "Sathya.t@IshaFoundation.org";
contact.mobilePhone = "+6598361844";
contact.homePhone = "+6565227030";
contact.asOfyyyymmdd = 20141007;
MemberProp prop = Member.create(client, sgp.groupId, contact, false,
User.SUPER_USER);
// user cannot be invalid
try {
Member.addOrDeleteGroup(client, prop.memberId, sgp.groupId, true,
invalidUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
// member should exist
try {
Member.addOrDeleteGroup(client, 3456, kl.groupId, true, validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// center should exist
try {
Member.addOrDeleteGroup(client, prop.memberId, 100, true, validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// add kl
Member.addOrDeleteGroup(client, prop.memberId, kl.groupId, true,
validUser);
ObjectifyFilter.complete();
prop = MemberLoader.safeGet(client, prop.memberId, User.SUPER_USER)
.toProp();
assertEquals(2, prop.groupIds.size());
assertTrue(prop.groupIds.contains(sgp.groupId));
assertTrue(prop.groupIds.contains(kl.groupId));
// can add the same center again
Member.addOrDeleteGroup(client, prop.memberId, kl.groupId, true,
validUser);
ObjectifyFilter.complete();
prop = MemberLoader.safeGet(client, prop.memberId, User.SUPER_USER)
.toProp();
assertEquals(2, prop.groupIds.size());
assertTrue(prop.groupIds.contains(sgp.groupId));
assertTrue(prop.groupIds.contains(kl.groupId));
// remove center
Member.addOrDeleteGroup(client, prop.memberId, kl.groupId, false,
validUser);
ObjectifyFilter.complete();
prop = MemberLoader.safeGet(client, prop.memberId, User.SUPER_USER)
.toProp();
assertEquals(1, prop.groupIds.size());
assertTrue(prop.groupIds.contains(sgp.groupId));
assertTrue(!prop.groupIds.contains(kl.groupId));
// can remove center again
Member.addOrDeleteGroup(client, prop.memberId, kl.groupId, false,
validUser);
ObjectifyFilter.complete();
prop = MemberLoader.safeGet(client, prop.memberId, User.SUPER_USER)
.toProp();
assertEquals(1, prop.groupIds.size());
assertTrue(prop.groupIds.contains(sgp.groupId));
assertTrue(!prop.groupIds.contains(kl.groupId));
// there should be atleast 1 center
try {
Member.addOrDeleteGroup(client, prop.memberId, sgp.groupId, false,
validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_PRECONDITION_FAILED, ex.statusCode);
}
}
@Test
public void populateDependantIndexFieldsTest() {
// moved to a seperate java clas
}
@Test
public void addOrDeleteProgramTest() {
ContactProp contactDetailProp = new ContactProp();
contactDetailProp.email = "simansmile@yahoo.com";
contactDetailProp.asOfyyyymmdd = 20141027;
MemberProp narasimhan = Member.create(client, sgp.groupId,
contactDetailProp, false, User.SUPER_USER);
contactDetailProp.email = "thulasidhar@gmail.com";
MemberProp thulasi = Member.create(client, sgp.groupId,
contactDetailProp, false, User.SUPER_USER);
VenueProp adiYogiAlayam = Venue.create(client, "Adi yogi aalayam",
"Adi yogi aalamay", iyc.groupId, User.SUPER_USER);
PracticeProp suryaKriya = Practice.create(client, "surya kriya",
User.SUPER_USER);
PracticeProp upaYoga = Practice.create(client, "upa yoga",
User.SUPER_USER);
PracticeProp angamardhana = Practice.create(client, "angamardhana",
User.SUPER_USER);
PracticeProp yogaAsanas = Practice.create(client, "yoga asanas",
User.SUPER_USER);
Set<Long> practiceIds = new HashSet<Long>();
practiceIds.add(suryaKriya.practiceId);
practiceIds.add(upaYoga.practiceId);
practiceIds.add(angamardhana.practiceId);
practiceIds.add(yogaAsanas.practiceId);
ProgramTypeProp hatayoga21day = ProgramType.create(client,
"Hata yoga 21 day", practiceIds, User.SUPER_USER);
TeacherProp sheela = Teacher.create(client, "Sheela", "",
"sheela.r@ishafoundation.org", iyc.groupId, User.SUPER_USER);
ProgramProp hatayoga21day2013 = Program.create(client, iyc.groupId,
hatayoga21day.programTypeId, adiYogiAlayam.venueId,
sheela.teacherId, 20130701, 20130721, 1, null, 0, null,
User.SUPER_USER);
List<Long> memberIds = new ArrayList<Long>();
// can call with empty list
Member.addOrDeleteProgram(client, thulasi.memberId,
hatayoga21day2013.programId, true, User.SUPER_USER);
Member.addOrDeleteProgram(client, narasimhan.memberId,
hatayoga21day2013.programId, true, User.SUPER_USER);
// clear session cache
ObjectifyFilter.complete();
OfyService.ofy(client).clear();
MemberProp thulasiProp = MemberLoader.safeGet(client, thulasi.memberId,
User.SUPER_USER).toProp();
assertEquals(1, thulasiProp.programIds.size());
assertTrue(thulasiProp.programIds.contains(hatayoga21day2013.programId));
assertEquals(1, thulasiProp.programTypeIds.size());
assertTrue(thulasiProp.programTypeIds
.contains(hatayoga21day.programTypeId));
assertEquals(4, thulasiProp.practiceIds.size());
assertTrue(thulasiProp.practiceIds.contains(suryaKriya.practiceId));
assertTrue(thulasiProp.practiceIds.contains(upaYoga.practiceId));
assertTrue(thulasiProp.practiceIds.contains(angamardhana.practiceId));
assertTrue(thulasiProp.practiceIds.contains(yogaAsanas.practiceId));
MemberProp narasimhanProp = MemberLoader.safeGet(client,
narasimhan.memberId, User.SUPER_USER).toProp();
assertEquals(1, narasimhanProp.programIds.size());
assertTrue(narasimhanProp.programIds
.contains(hatayoga21day2013.programId));
assertEquals(1, narasimhanProp.programTypeIds.size());
assertTrue(narasimhanProp.programTypeIds
.contains(hatayoga21day.programTypeId));
assertEquals(4, narasimhanProp.practiceIds.size());
assertTrue(narasimhanProp.practiceIds.contains(suryaKriya.practiceId));
assertTrue(narasimhanProp.practiceIds.contains(upaYoga.practiceId));
assertTrue(narasimhanProp.practiceIds.contains(angamardhana.practiceId));
assertTrue(narasimhanProp.practiceIds.contains(yogaAsanas.practiceId));
// add again
Member.addOrDeleteProgram(client, narasimhan.memberId,
hatayoga21day.programTypeId, true, validUser);
ObjectifyFilter.complete();
OfyService.ofy(client).clear();
thulasiProp = MemberLoader.safeGet(client, thulasi.memberId,
User.SUPER_USER).toProp();
assertEquals(1, thulasiProp.programIds.size());
assertTrue(thulasiProp.programIds.contains(hatayoga21day2013.programId));
assertEquals(1, thulasiProp.programTypeIds.size());
assertTrue(thulasiProp.programTypeIds
.contains(hatayoga21day.programTypeId));
assertEquals(4, thulasiProp.practiceIds.size());
assertTrue(thulasiProp.practiceIds.contains(suryaKriya.practiceId));
assertTrue(thulasiProp.practiceIds.contains(upaYoga.practiceId));
assertTrue(thulasiProp.practiceIds.contains(angamardhana.practiceId));
assertTrue(thulasiProp.practiceIds.contains(yogaAsanas.practiceId));
narasimhanProp = MemberLoader.safeGet(client, narasimhan.memberId,
User.SUPER_USER).toProp();
assertEquals(1, narasimhanProp.programIds.size());
assertTrue(narasimhanProp.programIds
.contains(hatayoga21day2013.programId));
assertEquals(1, narasimhanProp.programTypeIds.size());
assertTrue(narasimhanProp.programTypeIds
.contains(hatayoga21day.programTypeId));
assertEquals(4, narasimhanProp.practiceIds.size());
assertTrue(narasimhanProp.practiceIds.contains(suryaKriya.practiceId));
assertTrue(narasimhanProp.practiceIds.contains(upaYoga.practiceId));
assertTrue(narasimhanProp.practiceIds.contains(angamardhana.practiceId));
assertTrue(narasimhanProp.practiceIds.contains(yogaAsanas.practiceId));
// delete member
Member.addOrDeleteProgram(client, narasimhan.memberId,
hatayoga21day.programTypeId, false, validUser);
ObjectifyFilter.complete();
OfyService.ofy(client).clear();
// exception if client is invalid
try {
Member.addOrDeleteProgram(invalidClient, narasimhan.memberId,
hatayoga21day2013.programId, true, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// program id should be valid
try {
Member.addOrDeleteProgram(client, narasimhan.memberId, 938, true,
User.SUPER_USER); // invalid
// program
// id
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// user should be a valid user
try {
Member.addOrDeleteProgram(client, narasimhan.memberId,
hatayoga21day2013.programId, true, invalidUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
}
}