package crmdna.attendance;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.google.gson.Gson;
import com.googlecode.objectify.ObjectifyFilter;
import crmdna.client.Client;
import crmdna.client.isha.IshaConfig;
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.programtype.ProgramType;
import crmdna.programtype.ProgramTypeProp;
import crmdna.teacher.Teacher;
import crmdna.teacher.Teacher.TeacherProp;
import crmdna.user.User;
import crmdna.user.User.GroupLevelPrivilege;
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 AttendanceTest {
private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private final String client = "isha";
private final String validUser = "valid@login.com";
private final String sgpUser = "sgpuser@login.com";
private final String klUser = "kluser@login.com";
private final String sgpAndKlUser = "sgpandkl@login.com";
GroupProp sgp;
GroupProp kl;
PracticeProp suryaNamaskar;
PracticeProp yogaAsanas;
PracticeProp shambhavi;
PracticeProp aumChanting;
PracticeProp ishaKriya;
ProgramTypeProp innerEngineering7Day;
ProgramTypeProp suryaNamaskarAndAsanas;
ProgramTypeProp ishaKriyaTeacherLed;
ProgramTypeProp sathsang;
ProgramTypeProp shambhavi2Day;
VenueProp giis;
VenueProp chaichee;
VenueProp gujarathiBhavan;
VenueProp yuhuaCC;
VenueProp woodlandsCC;
TeacherProp muthu;
TeacherProp sharmila;
MemberProp paramesh, thulasi, duane;
ProgramProp ishaKriya20131229;
ProgramProp sathsang20140405;
ProgramProp shambhavi201405;
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
sgp = crmdna.group.Group.create(client, "Singapore", User.SUPER_USER);
assertEquals(1, sgp.groupId);
kl = crmdna.group.Group.create(client, "KL", User.SUPER_USER);
assertEquals(2, kl.groupId);
User.create(client, validUser, sgp.groupId, User.SUPER_USER);
assertEquals(1, User.get(client, validUser).toProp(client).userId);
User.create(client, sgpUser, sgp.groupId, User.SUPER_USER);
assertEquals(2, User.get(client, sgpUser).toProp(client).userId);
User.addGroupLevelPrivilege(client, sgp.groupId, sgpUser,
GroupLevelPrivilege.CHECK_IN, User.SUPER_USER);
User.create(client, klUser, kl.groupId, User.SUPER_USER);
assertEquals(3, User.get(client, klUser).toProp(client).userId);
User.addGroupLevelPrivilege(client, kl.groupId, klUser,
GroupLevelPrivilege.CHECK_IN, User.SUPER_USER);
User.create(client, sgpAndKlUser, sgp.groupId, User.SUPER_USER);
assertEquals(4, User.get(client, sgpAndKlUser).toProp(client).userId);
User.addGroupLevelPrivilege(client, sgp.groupId, sgpAndKlUser,
GroupLevelPrivilege.CHECK_IN, User.SUPER_USER);
User.addGroupLevelPrivilege(client, kl.groupId, sgpAndKlUser,
GroupLevelPrivilege.CHECK_IN, User.SUPER_USER);
suryaNamaskar = Practice.create(client, "Surya Namaskar",
User.SUPER_USER);
yogaAsanas = Practice.create(client, "Yoga Asanas", User.SUPER_USER);
shambhavi = Practice.create(client, "Shambhavi", User.SUPER_USER);
ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
aumChanting = Practice.create(client, "Aum Chanting", User.SUPER_USER);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(shambhavi.practiceId);
practiceIds.add(aumChanting.practiceId);
innerEngineering7Day = ProgramType.create(client,
"Inner Engineering 7 day", practiceIds, User.SUPER_USER);
practiceIds.clear();
practiceIds.add(suryaNamaskar.practiceId);
practiceIds.add(yogaAsanas.practiceId);
suryaNamaskarAndAsanas = ProgramType.create(client,
"Hata Yoga (Surya Namaskar & Asanas)", practiceIds,
User.SUPER_USER);
practiceIds.clear();
practiceIds.add(ishaKriya.practiceId);
ishaKriyaTeacherLed = ProgramType.create(client, "Isha Kriya",
practiceIds, User.SUPER_USER);
sathsang = ProgramType
.create(client, "Sathsang", null, User.SUPER_USER);
practiceIds.clear();
practiceIds.add(shambhavi.practiceId);
shambhavi2Day = ProgramType.create(client, "Shambhavi", practiceIds,
User.SUPER_USER);
giis = Venue.create(client, "GIIS", "GIIS", sgp.groupId,
User.SUPER_USER);
chaichee = Venue.create(client, "Chai Chee", "Chai Chee", sgp.groupId,
User.SUPER_USER);
gujarathiBhavan = Venue.create(client, "Gujarathi Bhavan",
"Gujarathi Bhavan", sgp.groupId, User.SUPER_USER);
yuhuaCC = Venue.create(client, "Yuhua CC", "Yuhua CC", sgp.groupId,
User.SUPER_USER);
woodlandsCC = Venue.create(client, "Woodlands CC", "Woodlands CC",
sgp.groupId, User.SUPER_USER);
muthu = Teacher.create(client, "Muthu", "Kumar", "muthu_sys@gmail.com", sgp.groupId,
User.SUPER_USER);
sharmila = Teacher.create(client, "", "", "sharmila@bhairaviyoga.sg",
sgp.groupId, User.SUPER_USER);
// add members
ContactProp contactDetailProp = new ContactProp();
contactDetailProp.email = "paramesh@ishafoundation.com";
contactDetailProp.asOfyyyymmdd = 20140703;
paramesh = Member.create(client, sgp.groupId, contactDetailProp, false,
User.SUPER_USER);
assertEquals(1, paramesh.memberId);
contactDetailProp = new ContactProp();
contactDetailProp.email = "thulasidhar@gmail.com";
contactDetailProp.asOfyyyymmdd = 20140703;
thulasi = Member.create(client, sgp.groupId, contactDetailProp, false,
User.SUPER_USER);
assertEquals(2, thulasi.memberId);
contactDetailProp = new ContactProp();
contactDetailProp.email = "duane.bong@barclays.com";
contactDetailProp.asOfyyyymmdd = 20140703;
duane = Member.create(client, sgp.groupId, contactDetailProp, false,
User.SUPER_USER);
duane = MemberLoader.safeGet(client, duane.memberId, User.SUPER_USER)
.toProp();
assertEquals(3, duane.memberId);
assertEquals("duane.bong@barclays.com", duane.contact.email);
ishaKriya20131229 = Program.create(client, sgp.groupId,
ishaKriyaTeacherLed.programTypeId, yuhuaCC.venueId,
muthu.teacherId, 20131229, 20131229, 2, null, 0, null,
User.SUPER_USER);
sathsang20140405 = Program.create(client, sgp.groupId,
sathsang.programTypeId, giis.venueId, sharmila.teacherId,
20140405, 20140405, 1, null, 0, null, User.SUPER_USER);
shambhavi201405 = Program.create(client, sgp.groupId,
shambhavi2Day.programTypeId, giis.venueId, sharmila.teacherId,
20140503, 20140504, 1, null, 0, null, User.SUPER_USER);
ObjectifyFilter.complete();
Member.addOrDeleteProgram(client, thulasi.memberId,
shambhavi201405.programId, true, User.SUPER_USER);
Member.addOrDeleteProgram(client, paramesh.memberId,
shambhavi201405.programId, true, User.SUPER_USER);
Set<Long> sathsangPracticeIds = new HashSet<>();
sathsangPracticeIds.add(shambhavi.practiceId);
sathsangPracticeIds.add(ishaKriya.practiceId);
IshaConfig.setSathsangPractices(sathsangPracticeIds, User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void checkInCheckOutAndGetNumCheckInsTest() {
IAttendance impl = AttendanceFactory.getImpl(client);
// num checkins should be 0
int numCheckins = impl.getNumCheckins(ishaKriya20131229.programId,
20131229, 1);
assertEquals(0, numCheckins);
// date should be valid
try {
impl.checkin(paramesh.memberId, ishaKriya20131229.programId,
20131230, 1, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
// member should be valid
try {
impl.checkin(100, // invalid member id
ishaKriya20131229.programId, 20131229, 1, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// program id should be valid
try {
impl.checkin(paramesh.memberId, ishaKriya20131229.programId + 100,
20131229, 1, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
// batch no should be valid
try {
impl.checkin(paramesh.memberId, ishaKriya20131229.programId,
20131229, 3, User.SUPER_USER);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_INCORRECT, ex.statusCode);
}
// user should have permission - kl user cannot checkin for singapore
// program
try {
impl.checkin(paramesh.memberId, ishaKriya20131229.programId,
20131229, 1, klUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
numCheckins = impl.checkin(paramesh.memberId,
ishaKriya20131229.programId, 20131229, 1, sgpUser);
assertEquals(1, numCheckins);
// this program should be tagged to member
paramesh = MemberLoader.safeGet(client, paramesh.memberId,
User.SUPER_USER).toProp();
assertTrue(paramesh.programIds.contains(ishaKriya20131229.programId));
// cannot checkin the same member again in same batch
try {
impl.checkin(paramesh.memberId, ishaKriya20131229.programId,
20131229, 1, sgpUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
// cannot checkin the same member again in batch 2
try {
impl.checkin(paramesh.memberId, ishaKriya20131229.programId,
20131229, 2, sgpUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
// can checkout
numCheckins = impl.checkout(paramesh.memberId,
ishaKriya20131229.programId, 20131229, User.SUPER_USER);
// batch 1 count should go to zero
assertEquals(0, numCheckins);
// Member should not show this member as completed
paramesh = MemberLoader.safeGet(client, paramesh.memberId,
User.SUPER_USER).toProp();
ObjectifyFilter.complete();
assertTrue(!paramesh.programIds.contains(ishaKriya20131229.programId));
// can check in the same member in batch 2
numCheckins = impl.checkin(paramesh.memberId,
ishaKriya20131229.programId, 20131229, 2, User.SUPER_USER);
// batch 2 count should be 1, batch 1 should remain at 0
assertEquals(1, numCheckins);
assertEquals(0,
impl.getNumCheckins(ishaKriya20131229.programId, 20131229, 1));
paramesh = MemberLoader.safeGet(client, paramesh.memberId,
User.SUPER_USER).toProp();
assertTrue(paramesh.programIds.contains(ishaKriya20131229.programId));
// can checkin another member in batch 2
numCheckins = impl.checkin(thulasi.memberId,
ishaKriya20131229.programId, 20131229, 2, User.SUPER_USER);
// batch 2 count should be 2
assertEquals(2, numCheckins);
thulasi = MemberLoader.safeGet(client, thulasi.memberId,
User.SUPER_USER).toProp();
assertTrue(thulasi.programIds.contains(ishaKriya20131229.programId));
// for a program with multiple sessions, member record will be marked
// as complete only when checked in for all sessions
ProgramProp suryaKriya201403 = Program.create(client, sgp.groupId,
ishaKriyaTeacherLed.programTypeId, yuhuaCC.venueId,
sharmila.teacherId, 20140308, 20140309, 2, null, 0, null,
User.SUPER_USER);
numCheckins = impl.checkin(paramesh.memberId,
suryaKriya201403.programId, 20140308, 1, sgpUser);
assertEquals(1, numCheckins);
paramesh = MemberLoader.safeGet(client, paramesh.memberId, sgpUser)
.toProp();
assertTrue(!paramesh.programIds.contains(suryaKriya201403.programId));
// now check in for the second session
numCheckins = impl.checkin(paramesh.memberId,
suryaKriya201403.programId, 20140309, 1, sgpUser);
assertEquals(1, numCheckins);
paramesh = MemberLoader.safeGet(client, paramesh.memberId, sgpUser)
.toProp();
assertTrue(paramesh.programIds.contains(suryaKriya201403.programId));
// checkout of second session
impl.checkout(paramesh.memberId, suryaKriya201403.programId, 20140309,
sgpUser);
paramesh = MemberLoader.safeGet(client, paramesh.memberId, sgpUser)
.toProp();
assertTrue(!paramesh.programIds.contains(suryaKriya201403.programId));
}
@Test
public void getMembersForCheckInTest() {
IAttendance impl = AttendanceFactory.getImpl(client);
List<CheckInMemberProp> props = impl.getMembersForCheckIn(".com",
sathsang20140405.programId, 20140405, 100, User.SUPER_USER);
System.out.println("props: " + new Gson().toJson(props));
assertEquals(3, props.size());
// should be sorted
assertEquals(duane.memberId, props.get(0).memberId);
assertEquals(false, props.get(0).allow);
assertEquals(0, props.get(0).practices.size());
assertTrue(props.get(0).notAllowingReason.toLowerCase().contains(
"not meditator"));
assertEquals(paramesh.memberId, props.get(1).memberId);
assertEquals(true, props.get(1).allow);
assertEquals(1, props.get(1).practices.size());
assertEquals("Shambhavi", props.get(1).practices.first());
assertEquals(thulasi.memberId, props.get(2).memberId);
assertEquals(true, props.get(2).allow);
assertEquals(1, props.get(2).practices.size());
assertEquals("Shambhavi", props.get(2).practices.first());
// check in thulasi
impl.checkin(thulasi.memberId, sathsang20140405.programId, 20140405, 1,
User.SUPER_USER);
props = impl.getMembersForCheckIn(".com", sathsang20140405.programId,
20140405, 100, User.SUPER_USER);
assertEquals(thulasi.memberId, props.get(2).memberId);
assertEquals(false, props.get(2).allow);
assertTrue(props.get(2).notAllowingReason.toLowerCase().contains(
"checked in"));
// now check out thulasi
impl.checkout(thulasi.memberId, sathsang20140405.programId, 20140405,
User.SUPER_USER);
props = impl.getMembersForCheckIn(".com", sathsang20140405.programId,
20140405, 100, User.SUPER_USER);
assertEquals(thulasi.memberId, props.get(2).memberId);
assertEquals(true, props.get(2).allow);
}
}