package crmdna.practice;
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.api.APIException;
import crmdna.common.api.APIResponse.Status;
import crmdna.practice.Practice.PracticeProp;
import crmdna.user.User;
import crmdna.user.User.ClientLevelPrivilege;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class PracticeTest {
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";
@Before
public void setUp() {
datastoreHelper.setUp();
ObjectifyFilter.complete();
Client.create(client);
// can call getAll without any groups
List<PracticeProp> props = Practice.getAll(client);
assertEquals(0, props.size());
long groupId = crmdna.group.Group.create(client, "Singapore",
User.SUPER_USER).groupId;
assertEquals(1, groupId);
User.create(client, validUser, groupId, User.SUPER_USER);
assertEquals(1, User.get(client, validUser).toProp(client).userId);
User.create(client, userWithPermission, groupId, User.SUPER_USER);
assertEquals(2,
User.get(client, userWithPermission).toProp(client).userId);
User.addClientLevelPrivilege(client, userWithPermission,
ClientLevelPrivilege.UPDATE_PRACTICE, User.SUPER_USER);
}
@After
public void tearDown() {
ObjectifyFilter.complete();
datastoreHelper.tearDown();
}
@Test
public void createTest() {
PracticeProp prop = Practice.create(client, "Isha Kriya",
userWithPermission);
assertEquals("first entity has id 1", 1, prop.practiceId);
prop = Practice.safeGet(client, prop.practiceId).toProp();
assertEquals("name is populated correctly", "ishakriya", prop.name);
assertEquals("display name is populated correctly", "Isha Kriya",
prop.displayName);
// cannot create duplicate
try {
Practice.create("isha", "ISHA KRIYA", User.SUPER_USER);
assertTrue(false);
} catch (APIException e) {
assertEquals("cannot create duplicate practice",
Status.ERROR_RESOURCE_ALREADY_EXISTS, e.statusCode);
}
// ids should be in sequence
prop = Practice.create(client, "Shoonya", userWithPermission);
assertEquals("practice id is in sequence", 2, prop.practiceId);
prop = Practice.create(client, "Shambhavi", userWithPermission);
assertEquals("practice id is in sequence", 3, prop.practiceId);
prop = Practice.create(client, "Surya Kriya", userWithPermission);
assertEquals("practice id is in sequence", 4, prop.practiceId);
prop = Practice.safeGet(client, 2).toProp();
assertEquals("name is populated correctly", "shoonya", prop.name);
assertEquals("display name is populated correctly", "Shoonya",
prop.displayName);
prop = Practice.safeGet(client, 3).toProp();
assertEquals("display name is populated correctly", "Shambhavi",
prop.displayName);
prop = Practice.safeGet(client, 4).toProp();
assertEquals("display name is populated correctly", "Surya Kriya",
prop.displayName);
assertEquals("name is populated correctly", "suryakriya", prop.name);
// access control
try {
Practice.create("isha", "Hata Yoga", validUser);
assertTrue(false);
} catch (APIException e) {
assertEquals("permission required to edit practice",
Status.ERROR_INSUFFICIENT_PERMISSION, e.statusCode);
}
// client should be valid
try {
Practice.create(invalidClient, "Aum Chanting", User.SUPER_USER);
assertTrue(false);
} catch (APIException e) {
assertEquals("client should be valid",
Status.ERROR_RESOURCE_NOT_FOUND, e.statusCode);
}
}
@Test
public void safeGetTest() {
PracticeProp prop = Practice.create(client, "Shoonya",
userWithPermission);
assertTrue(prop.practiceId != 0);
prop = Practice.safeGet("isha", prop.practiceId).toProp();
assertEquals("name is populated correctly", "shoonya", prop.name);
assertEquals("display name is populated correctly", "Shoonya",
prop.displayName);
// exception for non existing
try {
Practice.safeGet("isha", prop.practiceId + 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 renameTest() {
PracticeProp shoonya = Practice.create("isha", "Shoonya",
userWithPermission);
Practice.create(client, "Shambhavi", userWithPermission);
try {
Practice.rename("isha", shoonya.practiceId, "Shambhavi",
userWithPermission);
assertTrue(false);
} catch (APIException ex) {
assertEquals("cannot rename to existing",
Status.ERROR_RESOURCE_ALREADY_EXISTS, ex.statusCode);
}
// can change case and rename
Practice.rename("isha", shoonya.practiceId, "shoonya",
userWithPermission);
shoonya = Practice.safeGet("isha", shoonya.practiceId).toProp();
assertEquals("name correctly populated after rename", "shoonya",
shoonya.name);
assertEquals("name correctly populated after rename", "shoonya",
shoonya.displayName);
Practice.rename("isha", shoonya.practiceId, "Shoonya Meditation",
userWithPermission);
shoonya = Practice.safeGet("isha", shoonya.practiceId).toProp();
assertEquals("name populated correctly", "shoonyameditation",
shoonya.name);
assertEquals("display name populated correctly", "Shoonya Meditation",
shoonya.displayName);
try {
Practice.rename("isha", shoonya.practiceId, "Shoonya", validUser);
assertTrue(false);
} catch (APIException ex) {
assertEquals("permission required to rename practice",
Status.ERROR_INSUFFICIENT_PERMISSION, ex.statusCode);
}
try {
Practice.rename(invalidClient, shoonya.practiceId, "Shoonya",
userWithPermission);
assertTrue(false);
} catch (APIException ex) {
assertEquals("client should be valid",
Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
@Test
public void getAllTest() {
Practice.create("isha", "Shoonya", userWithPermission);
Practice.create("isha", "Shambhavi", userWithPermission);
ObjectifyFilter.complete();
List<PracticeProp> props = Practice.getAll("isha");
assertEquals(2, props.size());
// should be sorted
assertEquals("shambhavi", props.get(0).name);
assertEquals("Shambhavi", props.get(0).displayName);
assertEquals("shoonya", props.get(1).name);
assertEquals("Shoonya", props.get(1).displayName);
}
@Test
public void toPropTest() {
PracticeEntity entity = new PracticeEntity();
entity.practiceId = 123l;
entity.displayName = "Shoonya";
entity.name = entity.displayName.toLowerCase();
PracticeProp prop = entity.toProp();
assertEquals("practise id correctly populated", 123, prop.practiceId);
assertEquals("display name correctly populated", "Shoonya",
prop.displayName);
assertEquals("name correctly populated", "shoonya", prop.name);
}
@Test
public void practiseNameSavedInLCWithSpecialCharRemoved() {
PracticeProp practiceProp = Practice.create("isha",
"Shambhavi_Mahamudra (kriya)", User.SUPER_USER);
practiceProp = Practice.safeGet(client, practiceProp.practiceId)
.toProp();
assertEquals("shambhavimahamudrakriya", practiceProp.name);
}
@Test
public void practiseNameSavedInLCWithSpecialCharRemovedAfterUpdate() {
PracticeProp practiceProp = Practice.create("isha",
"Shambhavi Mahamudra", User.SUPER_USER);
practiceProp = Practice.safeGet(client, practiceProp.practiceId)
.toProp();
assertEquals("shambhavimahamudra", practiceProp.name);
Practice.rename(client, practiceProp.practiceId,
"Shambhavi_Mahamudra (Kriya)", User.SUPER_USER);
practiceProp = Practice.safeGet(client, practiceProp.practiceId)
.toProp();
assertEquals("shambhavimahamudrakriya", practiceProp.name);
assertEquals("Shambhavi_Mahamudra (Kriya)", practiceProp.displayName);
}
@Test
public void displayNameSavedAsIs() {
PracticeProp practiceProp = Practice.create("isha",
"Shambhavi_Mahamudra (kriya)", User.SUPER_USER);
practiceProp = Practice.safeGet(client, practiceProp.practiceId)
.toProp();
assertEquals("Shambhavi_Mahamudra (kriya)", practiceProp.displayName);
}
@Test
public void safeGetByIdOrNameTest() {
PracticeProp shoonya = Practice.create(client, "Shoonya", User.SUPER_USER);
assertEquals(shoonya.practiceId, Practice.safeGetByIdOrName(client, shoonya.practiceId + "").practiceId);
assertEquals(shoonya.practiceId, Practice.safeGetByIdOrName(client, shoonya.name).practiceId);
try {
Practice.safeGetByIdOrName(client, "dummy");
assertTrue(false);
} catch (APIException ex) {
assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, ex.statusCode);
}
}
}