package crmdna.programtype;
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.Utils.Currency;
import crmdna.common.api.APIException;
import crmdna.common.api.APIResponse.Status;
import crmdna.common.contact.ContactProp;
import crmdna.group.Group.GroupProp;
import crmdna.member.Member;
import crmdna.member.MemberLoader;
import crmdna.member.MemberProp;
import crmdna.practice.Practice;
import crmdna.practice.Practice.PracticeProp;
import crmdna.program.Program;
import crmdna.program.ProgramProp;
import crmdna.teacher.Teacher;
import crmdna.teacher.Teacher.TeacherProp;
import crmdna.user.User;
import crmdna.user.User.ClientLevelPrivilege;
import crmdna.venue.Venue;
import crmdna.venue.Venue.VenueProp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
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 ProgramTypeTest {
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 userWithPermission = "withpermission@login.com";
GroupProp sgp;
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
// can call getAll without any records
List<ProgramTypeProp> props = ProgramType.getAll(client);
assertEquals(0, props.size());
sgp = crmdna.group.Group.create(client, "Singapore", User.SUPER_USER);
assertEquals(1, sgp.groupId);
User.create(client, validUser, sgp.groupId, User.SUPER_USER);
assertEquals(1, User.get(client, validUser).toProp(client).userId);
User.create(client, userWithPermission, sgp.groupId, User.SUPER_USER);
assertEquals(2, User.get(client, userWithPermission).toProp(client).userId);
User.addClientLevelPrivilege(client, userWithPermission, ClientLevelPrivilege.UPDATE_PROGRAM_TYPE,
User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void createTest() {
PracticeProp ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(ishaKriya.practiceId);
ProgramTypeProp prop = ProgramType.create(client, "Isha Kriya Online", practiceIds, userWithPermission);
assertEquals("first entity has id 1", 1, prop.programTypeId);
prop = ProgramType.safeGet(client, prop.programTypeId).toProp(client);
assertEquals("name is populated correctly", "ishakriyaonline", prop.name);
assertEquals("display name is populated correctly", "Isha Kriya Online", prop.displayName);
assertEquals(1, prop.practiceProps.size());
assertEquals("ishakriya", prop.practiceProps.get(0).name);
// cannot create duplicate
try {
ProgramType.create("isha", "ISHA KRIYA onLine", practiceIds, User.SUPER_USER);
assertTrue(false);
} catch (APIException e) {
assertEquals("cannot create duplicate", Status.ERROR_RESOURCE_ALREADY_EXISTS, e.statusCode);
}
// ids should be in sequence
prop = ProgramType.create(client, "Shambhavi 2 day", practiceIds, userWithPermission);
assertEquals("id is in sequence", 2, prop.programTypeId);
prop = ProgramType.create(client, "Inner Engineering Retreat", practiceIds, userWithPermission);
assertEquals("practice id is in sequence", 3, prop.programTypeId);
prop = ProgramType.create(client, "Surya Kriya", practiceIds, userWithPermission);
assertEquals("practice id is in sequence", 4, prop.programTypeId);
prop = ProgramType.safeGet(client, 2).toProp(client);
assertEquals("name is populated correctly", "shambhavi2day", prop.name);
assertEquals("display name is populated correctly", "Shambhavi 2 day", prop.displayName);
prop = ProgramType.safeGet(client, 3).toProp(client);
assertEquals("display name is populated correctly", "Inner Engineering Retreat", prop.displayName);
prop = ProgramType.safeGet(client, 4).toProp(client);
assertEquals("display name is populated correctly", "Surya Kriya", prop.displayName);
assertEquals("name is populated correctly", "suryakriya", prop.name);
// access control
try {
ProgramType.create("isha", "Hata Yoga - Asanas", practiceIds, validUser);
assertTrue(false);
} catch (APIException e) {
assertEquals("permission required to edit program type", Status.ERROR_INSUFFICIENT_PERMISSION, e.statusCode);
}
// client should be valid
try {
ProgramType.create(invalidClient, "Hata Yoga - Upa Yoga", practiceIds, User.SUPER_USER);
assertTrue(false);
} catch (APIException e) {
assertEquals("client should be valid", Status.ERROR_RESOURCE_NOT_FOUND, e.statusCode);
}
}
@Test
public void safeGetTest() {
long shoonya = Practice.create(client, "Shoonya", User.SUPER_USER).practiceId;
long shakthiChalana = Practice.create(client, "Shakthi Chalana Kriya", User.SUPER_USER).practiceId;
long suryaNamaskar = Practice.create(client, "Surya Namaskar", User.SUPER_USER).practiceId;
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(suryaNamaskar);
practiceIds.add(shoonya);
practiceIds.add(shakthiChalana);
ProgramTypeProp prop = ProgramType.create(client, "Shoonya Intensive", practiceIds, userWithPermission);
assertTrue(prop.programTypeId != 0);
prop = ProgramType.safeGet("isha", prop.programTypeId).toProp(client);
assertEquals("name is populated correctly", "shoonyaintensive", prop.name);
assertEquals("display name is populated correctly", "Shoonya Intensive", prop.displayName);
// practice should be sorted by name
assertEquals("shakthichalanakriya", prop.practiceProps.get(0).name);
assertEquals("shoonya", prop.practiceProps.get(1).name);
assertEquals("suryanamaskar", prop.practiceProps.get(2).name);
// exception for non existing
try {
ProgramType.safeGet("isha", prop.programTypeId + 20939); // non
// existant
assertTrue(false);
} catch (APIException ex) {
assertEquals("exception thrown for non exisitng practise id", Status.ERROR_RESOURCE_NOT_FOUND,
ex.statusCode);
}
}
@Test
public void safeGetByIdOrNameTest() {
long shoonya = Practice.create(client, "Shoonya", User.SUPER_USER).practiceId;
long shakthiChalana = Practice.create(client, "Shakthi Chalana Kriya", User.SUPER_USER).practiceId;
long suryaNamaskar = Practice.create(client, "Surya Namaskar", User.SUPER_USER).practiceId;
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(suryaNamaskar);
practiceIds.add(shoonya);
practiceIds.add(shakthiChalana);
ProgramTypeProp prop = ProgramType.create(client, "Shoonya Intensive", practiceIds, userWithPermission);
assertTrue(prop.programTypeId != 0);
prop = ProgramType.safeGetByIdOrName("isha", "shoonya InteNsive").toProp(client);
assertEquals("name is populated correctly", "shoonyaintensive", prop.name);
assertEquals("display name is populated correctly", "Shoonya Intensive", prop.displayName);
prop = ProgramType.safeGetByIdOrName("isha", prop.programTypeId + "").toProp(client);
assertEquals("get by id", "shoonyaintensive", prop.name);
assertEquals("get by id", "Shoonya Intensive", prop.displayName);
// practice should be sorted by name
assertEquals("shakthichalanakriya", prop.practiceProps.get(0).name);
assertEquals("shoonya", prop.practiceProps.get(1).name);
assertEquals("suryanamaskar", prop.practiceProps.get(2).name);
// exception for non existing
try {
ProgramType.safeGetByIdOrName("isha", "non existing"); // non-existing
assertTrue(false);
} catch (APIException ex) {
assertEquals("exception thrown for non exisitng practise id", Status.ERROR_RESOURCE_NOT_FOUND,
ex.statusCode);
}
// exception for non existing
try {
ProgramType.safeGetByIdOrName("isha", 100 + ""); // non-existing
assertTrue(false);
} catch (APIException ex) {
assertEquals("exception thrown for non exisitng practise id", Status.ERROR_RESOURCE_NOT_FOUND,
ex.statusCode);
}
}
@Test
public void ensureValidTest() {
Set<Long> programTypeIds = new HashSet<>();
programTypeIds.add((long) 100);
programTypeIds.add((long) 101);
try {
ProgramType.ensureValid(client, programTypeIds);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// add some program types
ProgramTypeProp pt1 = ProgramType.create(client, "PT1", null, User.SUPER_USER);
ProgramTypeProp pt2 = ProgramType.create(client, "PT2", null, User.SUPER_USER);
try {
ProgramType.ensureValid(client, programTypeIds);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
programTypeIds.clear();
programTypeIds.add(pt1.programTypeId);
programTypeIds.add(pt2.programTypeId);
ProgramType.ensureValid(client, programTypeIds); // no exception
}
@Test
public void renameTest() {
long shoonya = Practice.create(client, "Shoonya", User.SUPER_USER).practiceId;
long shakthiChalana = Practice.create(client, "Shakthi Chalana Kriya", User.SUPER_USER).practiceId;
long suryaNamaskar = Practice.create(client, "Surya Namaskar", User.SUPER_USER).practiceId;
long shambhavi = Practice.create(client, "Shambhavi", User.SUPER_USER).practiceId;
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(suryaNamaskar);
practiceIds.add(shoonya);
practiceIds.add(shakthiChalana);
ProgramTypeProp prop = ProgramType.create("isha", "Shoonya Intensive", practiceIds, userWithPermission);
practiceIds.clear();
practiceIds.add(shambhavi);
ProgramType.create(client, "Shambhavi 2 day", practiceIds, userWithPermission);
try {
ProgramType.rename("isha", prop.programTypeId, "Shambhavi 2 day", userWithPermission);
assertTrue(false);
} catch (APIException ex) {
assertEquals("cannot rename to existing", Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
// can change case and rename
ProgramType.rename("isha", prop.programTypeId, "shoonya intensive", userWithPermission);
prop = ProgramType.safeGet("isha", prop.programTypeId).toProp(client);
assertEquals("name correctly populated after rename", "shoonyaintensive", prop.name);
assertEquals("name correctly populated after rename", "shoonya intensive", prop.displayName);
ProgramType.rename("isha", prop.programTypeId, "Shoonya Meditation", userWithPermission);
prop = ProgramType.safeGet("isha", prop.programTypeId).toProp(client);
assertEquals("name populated correctly", "shoonyameditation", prop.name);
assertEquals("display name populated correctly", "Shoonya Meditation", prop.displayName);
try {
ProgramType.rename("isha", prop.programTypeId, "Shoonya Training", validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals("permission required to rename practice", Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
try {
ProgramType.rename(invalidClient, prop.programTypeId, "Shoonya", userWithPermission);
assertTrue(false);
} catch (APIException ex) {
assertEquals("client should be valid", Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test
public void getAllTest() {
try {
ProgramType.getAll(invalidClient);
} catch (APIException ex) {
assertEquals("client should be valid", Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
assertEquals("getall returns empty list if no records", 0, ProgramType.getAll(client).size());
long suryaNamaskar = Practice.create(client, "Surya Namaskar", User.SUPER_USER).practiceId;
long shoonya = Practice.create(client, "Shoonya", User.SUPER_USER).practiceId;
long shakthiChalana = Practice.create(client, "Shakthi Chalana Kriya", User.SUPER_USER).practiceId;
long shambhavi = Practice.create(client, "Shambhavi", User.SUPER_USER).practiceId;
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(suryaNamaskar);
practiceIds.add(shoonya);
practiceIds.add(shakthiChalana);
ProgramType.create(client, "Shoonya Intensive", practiceIds, userWithPermission);
practiceIds.clear();
practiceIds.add(shambhavi);
ProgramType.create(client, "Shambhavi 2 day", practiceIds, userWithPermission);
ObjectifyFilter.complete();
List<ProgramTypeProp> props = ProgramType.getAll(client);
assertEquals(2, props.size());
// should be sorted
assertEquals("shambhavi2day", props.get(0).name);
assertEquals("Shambhavi 2 day", props.get(0).displayName);
assertEquals(1, props.get(0).practiceProps.size());
assertEquals("shambhavi", ((PracticeProp) props.get(0).practiceProps.toArray()[0]).name);
assertEquals("shoonyaintensive", props.get(1).name);
assertEquals("Shoonya Intensive", props.get(1).displayName);
assertEquals(3, props.get(1).practiceProps.size());
// practice should be sorted by name
assertEquals("shakthichalanakriya", props.get(1).practiceProps.get(0).name);
assertEquals("shoonya", props.get(1).practiceProps.get(1).name);
assertEquals("suryanamaskar", props.get(1).practiceProps.get(2).name);
}
@Test
public void getPracticeIdsTest() {
PracticeProp p1 = Practice.create(client, "p1", User.SUPER_USER);
PracticeProp p2 = Practice.create(client, "p2", User.SUPER_USER);
PracticeProp p3 = Practice.create(client, "p3", User.SUPER_USER);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(p1.practiceId);
practiceIds.add(p2.practiceId);
ProgramTypeProp pt1 = ProgramType.create(client, "pt1", practiceIds, User.SUPER_USER);
practiceIds.clear();
practiceIds.add(p2.practiceId);
practiceIds.add(p3.practiceId);
ProgramTypeProp pt2 = ProgramType.create(client, "pt2", practiceIds, User.SUPER_USER);
Set<Long> programTypeIds = new HashSet<>();
programTypeIds.add(pt1.programTypeId);
programTypeIds.add((long) 100);
practiceIds = ProgramType.getPracticeIds(client, programTypeIds);
assertEquals(2, practiceIds.size());
assertTrue(practiceIds.contains(p1.practiceId));
assertTrue(practiceIds.contains(p2.practiceId));
programTypeIds.add(pt2.programTypeId);
practiceIds = ProgramType.getPracticeIds(client, programTypeIds);
assertEquals(3, practiceIds.size());
assertTrue(practiceIds.contains(p1.practiceId));
assertTrue(practiceIds.contains(p2.practiceId));
assertTrue(practiceIds.contains(p3.practiceId));
}
@Test
public void toPropTest() {
ProgramTypeEntity entity = new ProgramTypeEntity();
entity.programTypeId = 123l;
entity.displayName = "Shoonya Intensive";
entity.name = entity.displayName.toLowerCase();
ProgramTypeProp prop = entity.toProp(client);
assertEquals("practise id correctly populated", 123, prop.programTypeId);
assertEquals("display name correctly populated", "Shoonya Intensive", prop.displayName);
assertEquals("name correctly populated", "shoonya intensive", prop.name);
}
@Test
public void updatePracticeIdsTest() {
PracticeProp upaYogaBasic = Practice.create(client, "Upa Yoga Basic", User.SUPER_USER);
PracticeProp ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(upaYogaBasic.practiceId);
practiceIds.add(ishaKriya.practiceId);
ProgramTypeProp mysticEye = ProgramType.create(client, "Mystic Eye", practiceIds, User.SUPER_USER);
VenueProp expo = Venue.create(client, "Expo", "expo", sgp.groupId, User.SUPER_USER);
TeacherProp sadhguru = Teacher.create(client, "", "", "sadhguru@ishafoundation"
+ ".org", sgp.groupId, User.SUPER_USER);
ProgramProp mysticEye12Jan = Program.create(client, sgp.groupId, mysticEye.programTypeId, expo.venueId,
sadhguru.teacherId, 20140112, 20140112, 1, null, 0.0, Currency.SGD, User.SUPER_USER);
ContactProp contact = new ContactProp();
contact.email = "priya@gmail.com";
contact.asOfyyyymmdd = 20140801;
MemberProp priya = Member.create(client, sgp.groupId, contact, false, User.SUPER_USER);
priya = Member.addOrDeleteProgram(client, priya.memberId, mysticEye12Jan.programId, true, userWithPermission);
assertTrue(priya.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue(priya.practiceIds.contains(ishaKriya.practiceId));
contact.email = "kalyan@gmail.com";
MemberProp kalyan = Member.create(client, sgp.groupId, contact, false, User.SUPER_USER);
kalyan = Member.addOrDeleteProgram(client, kalyan.memberId, mysticEye12Jan.programId, true, userWithPermission);
assertTrue(kalyan.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue(kalyan.practiceIds.contains(ishaKriya.practiceId));
PracticeProp mysticEyePractice = Practice.create(client, "Mystic Eye", User.SUPER_USER);
practiceIds.clear();
practiceIds.add(mysticEyePractice.practiceId);
ProgramType.updatePracticeIds(client, mysticEye.programTypeId, practiceIds, User.SUPER_USER);
ObjectifyFilter.complete();
priya = MemberLoader.safeGet(client, priya.memberId, userWithPermission).toProp();
assertTrue(priya.practiceIds.contains(mysticEyePractice.practiceId));
assertTrue(!priya.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue(!priya.practiceIds.contains(ishaKriya.practiceId));
kalyan = MemberLoader.safeGet(client, kalyan.memberId, userWithPermission).toProp();
assertTrue(kalyan.practiceIds.contains(mysticEyePractice.practiceId));
assertTrue(!kalyan.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue(!kalyan.practiceIds.contains(ishaKriya.practiceId));
}
@Test
public void practiceIdSavedWhenCreating() {
PracticeProp upaYogaBasic = Practice.create(client, "Upa Yoga Basic", User.SUPER_USER);
PracticeProp ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(upaYogaBasic.practiceId);
practiceIds.add(ishaKriya.practiceId);
ProgramTypeProp mysticEye = ProgramType.create(client, "Mystic Eye", practiceIds, User.SUPER_USER);
ProgramTypeEntity mysticEyeEntity = ProgramType.safeGet(client, mysticEye.programTypeId);
assertTrue(mysticEyeEntity.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue(mysticEyeEntity.practiceIds.contains(ishaKriya.practiceId));
assertEquals(2, mysticEyeEntity.practiceIds.size());
}
@Test
public void practiceIdSavedWhenUpdating() {
PracticeProp upaYogaBasic = Practice.create(client, "Upa Yoga Basic", User.SUPER_USER);
ProgramTypeProp mysticEye = ProgramType.create(client, "Mystic Eye", Utils.getSet(upaYogaBasic.practiceId),
User.SUPER_USER);
ProgramTypeEntity mysticEyeEntity = ProgramType.safeGet(client, mysticEye.programTypeId);
assertTrue(mysticEyeEntity.practiceIds.contains(upaYogaBasic.practiceId));
assertEquals(1, mysticEyeEntity.practiceIds.size());
PracticeProp ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
ProgramType.updatePracticeIds(client, mysticEye.programTypeId,
Utils.getSet(upaYogaBasic.practiceId, ishaKriya.practiceId), User.SUPER_USER);
mysticEyeEntity = ProgramType.safeGet(client, mysticEye.programTypeId);
assertTrue(mysticEyeEntity.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue(mysticEyeEntity.practiceIds.contains(ishaKriya.practiceId));
assertEquals(2, mysticEyeEntity.practiceIds.size());
}
}