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.DateUtils.Month;
import crmdna.common.ICode;
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.programtype.ProgramType;
import crmdna.programtype.ProgramTypeProp;
import crmdna.user.User;
import crmdna.user.UserCore;
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 crmdna.common.TestUtil.ensureResourceNotFoundException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class UnverifiedProgramTest {
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 ProgramTypeProp shambhavi2Day, mysticEye1Day;
private PracticeProp shambhavi, ishaKriya, upaYogaBasic;
private MemberProp sathya;
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
GroupProp sgp = Group.create(client, "Singapore", User.SUPER_USER);
assertEquals(1, sgp.groupId);
User.create(client, validUser, sgp.groupId, User.SUPER_USER);
assertEquals(1,
UserCore.safeGet(client, validUser).toProp(client).userId);
shambhavi = Practice.create(client, "Shambhavi", User.SUPER_USER);
ishaKriya = Practice.create(client, "Isha Kriya", User.SUPER_USER);
upaYogaBasic = Practice.create(client, "Upa Yoga Basic",
User.SUPER_USER);
Set<Long> practiceIds = new HashSet<>();
practiceIds.add(shambhavi.practiceId);
shambhavi2Day = ProgramType.create("isha", "Shambhavi", practiceIds,
User.SUPER_USER);
assertEquals(1, shambhavi2Day.programTypeId);
practiceIds.clear();
practiceIds.add(ishaKriya.practiceId);
practiceIds.add(upaYogaBasic.practiceId);
mysticEye1Day = ProgramType.create("isha", "MysticEye", practiceIds,
User.SUPER_USER);
assertEquals(2, mysticEye1Day.programTypeId);
ContactProp contact = new ContactProp();
contact.email = "sathya.t@ishafoundation.org";
contact.asOfyyyymmdd = 20140722;
sathya = Member.create(client, sgp.groupId, contact, true, validUser);
assertEquals("first member has id 1", 1, sathya.memberId);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void addDeleteUnverifiedProgramTest() {
// client should be valid
ensureResourceNotFoundException(new ICode() {
@Override
public void run() {
Member.addUnverifiedProgram(invalidClient, sathya.memberId,
shambhavi2Day.programTypeId, Month.DEC, 2003,
"chennai", "india", "sadhguru", validUser);
}
});
// user can add unverified program
Member.addUnverifiedProgram(client, sathya.memberId,
shambhavi2Day.programTypeId, Month.DEC, 2003, "chennai",
"india", "sadhguru", validUser);
// member can add unverified program for himself
List<UnverifiedProgramProp> list = Member.addUnverifiedProgram(client,
sathya.memberId, mysticEye1Day.programTypeId, Month.JAN, 2014,
"singapore", "singapore", "sadhguru", sathya.contact.email);
// somebody else (non user) cannot add sathya's unverified program
try {
Member.addUnverifiedProgram(client, sathya.memberId,
mysticEye1Day.programTypeId, Month.JAN, 2014, "singapore",
"singapore", "sadhguru", "someoneelse@gmail.com");
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_INVALID_USER, ex.statusCode);
}
assertEquals(2, list.size());
assertEquals(mysticEye1Day.programTypeId, list.get(0).programTypeId);
assertEquals("singapore", list.get(0).city);
assertEquals("singapore", list.get(0).country);
assertEquals(Month.JAN, list.get(0).month);
assertEquals(2014, list.get(0).year);
assertEquals("sadhguru", list.get(0).teacher);
assertEquals(2, list.get(0).unverifiedProgramId);
assertEquals(shambhavi2Day.programTypeId, list.get(1).programTypeId);
assertEquals("chennai", list.get(1).city);
assertEquals("india", list.get(1).country);
assertEquals(Month.DEC, list.get(1).month);
assertEquals(2003, list.get(1).year);
assertEquals("sadhguru", list.get(1).teacher);
assertEquals(1, list.get(1).unverifiedProgramId);
// member should have the correct practices and program types
sathya = MemberLoader.safeGet(client, sathya.memberId, validUser)
.toProp();
assertTrue("practice tag to member",
sathya.practiceIds.contains(shambhavi.practiceId));
assertTrue("practice tag to member",
sathya.practiceIds.contains(ishaKriya.practiceId));
assertTrue("practice tag to member",
sathya.practiceIds.contains(upaYogaBasic.practiceId));
assertTrue("programType tag to member",
sathya.programTypeIds.contains(shambhavi2Day.programTypeId));
assertTrue("programType tag to member",
sathya.programTypeIds.contains(mysticEye1Day.programTypeId));
// unverified program should be included in detailed info
sathya = MemberLoader.safeGetDetailedInfo(client, sathya.memberId,
validUser);
assertEquals("detailed info includes unverified programs", 2,
sathya.memberProgramProps.size());
// delete shambhavi 2day
Member.deleteUnverifiedProgram(client, sathya.memberId, 1,
sathya.contact.email);
sathya = MemberLoader.safeGetDetailedInfo(client, sathya.memberId,
validUser);
assertTrue("programType removed",
!sathya.programTypeIds.contains(shambhavi2Day.programTypeId));
assertTrue("practice removed",
!sathya.practiceIds.contains(shambhavi.practiceId));
assertEquals("unverified program removed", 1,
sathya.memberProgramProps.size());
}
}