/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.opentides.util;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Test;
import org.opentides.bean.SystemCodes;
import org.opentides.bean.user.BaseUser;
import org.opentides.bean.user.UserCredential;
import org.opentides.exception.InvalidImplementationException;
import com.ideyatech.bean.Ninja;
import com.ideyatech.bean.UserCriteria;
/**
* @author allanctan
*
*/
public class CrudUtilTest {
@Test
public void testBuildCreateMessage() throws ParseException {
final SystemCodes sc = new SystemCodes("category","key","value");
final String expected = "<p class='add-message'>Added new System Codes with Value:<span class='primary-field'>value</span> " +
"with the following: Key=<span class='field-value'>KEY</span> and Category=<span class='field-value'>CATEGORY</span> </p>";
Assert.assertEquals(expected,
CrudUtil.buildCreateMessage(sc));
// added date formatting
sc.setCreateDate(new Date());
final String cDate = DateUtil.dateToString(sc.getCreateDate(), "EEE, dd MMM yyyy HH:mm:ss z");
final String expected2 = "<p class='add-message'>Added new System Codes with Value:<span class='primary-field'>value</span> " +
"with the following: " +
"Key=<span class='field-value'>KEY</span> and Category=<span class='field-value'>CATEGORY</span> </p>";
Assert.assertEquals(expected2,
CrudUtil.buildCreateMessage(sc));
// date with no time
final Date date = DateUtil.stringToDate("03/12/2013", "MM/dd/yyyy");
final SystemCodes sc3 = new SystemCodes("category","key","value");
sc3.setCreateDate(date);
final String expected3 = "<p class='add-message'>Added new System Codes with Value:<span class='primary-field'>value</span> " +
"with the following: " +
"Key=<span class='field-value'>KEY</span> and Category=<span class='field-value'>CATEGORY</span> </p>";
Assert.assertEquals(expected3,
CrudUtil.buildCreateMessage(sc3));
}
@Test
public void testGetUpdatedFields() {
final SystemCodes oldsc = new SystemCodes("categoryold","keyold","value");
final SystemCodes newsc = new SystemCodes("categorynew","keynew","value");
final SystemCodes samesc = new SystemCodes("categoryold","keyold","value");
final SystemCodes emptysc = new SystemCodes("categorynew","keynew","");
Assert.assertEquals(Arrays.asList("key", "category"),
CrudUtil.getUpdatedFields(oldsc, newsc));
Assert.assertEquals(Arrays.asList("value"),
CrudUtil.getUpdatedFields(newsc, emptysc));
Assert.assertEquals(Arrays.asList("value"),
CrudUtil.getUpdatedFields(emptysc, newsc));
Assert.assertEquals(new ArrayList<String>(),
CrudUtil.getUpdatedFields(oldsc, samesc));
newsc.setNumberValue(2l);
Assert.assertEquals(Arrays.asList("key", "category", "numberValue"),
CrudUtil.getUpdatedFields(oldsc, newsc));
}
@Test
public void testGetUpdatedFieldsArray() {
final SystemCodes oldsc = new SystemCodes("categoryold","keyold","valueold");
final SystemCodes newsc = new SystemCodes("categorynew","keynew","valuenew");
final SystemCodes samesc = new SystemCodes("categoryold","keysame","valuesame");
final List<SystemCodes> oldFaves = new ArrayList<SystemCodes>();
oldFaves.add(samesc);
oldFaves.add(oldsc);
final List<SystemCodes> newFaves = new ArrayList<SystemCodes>();
newFaves.add(newsc);
newFaves.add(samesc);
final UserCriteria oldUser = new UserCriteria();
final UserCriteria newUser = new UserCriteria();
oldUser.setFavorites(oldFaves);
newUser.setFavorites(oldFaves);
Assert.assertEquals(new ArrayList<String>(),
CrudUtil.getUpdatedFields(oldUser, newUser));
newUser.setFavorites(newFaves);
Assert.assertEquals(Arrays.asList("favorites"),
CrudUtil.getUpdatedFields(oldUser, newUser));
}
@Test
public void testBuildUpdateMessage() {
final SystemCodes oldsc = new SystemCodes("categoryold","keyold","value");
final SystemCodes newsc = new SystemCodes("categorynew","keynew","value");
final SystemCodes samesc = new SystemCodes("categoryold","keyold","value");
final SystemCodes emptysc = new SystemCodes("categorynew","keynew","");
final String expected = "<p class='change-message'>Changed System Codes with Value:<span class='primary-field'>value</span> " +
"with the following: Key from <span class='field-value-from'>KEYOLD</span> to <span class='field-value-to'>KEYNEW</span> " +
"and Category from <span class='field-value-from'>CATEGORYOLD</span> " +
"to <span class='field-value-to'>CATEGORYNEW</span> </p>";
Assert.assertEquals(expected,
CrudUtil.buildUpdateMessage(oldsc, newsc));
final String expected2 = "<p class='change-message'>Changed System Codes with Value:<span class='primary-field'>value</span> " +
"with the following: Value <span class='field-value-removed'>value</span> is removed </p>";
Assert.assertEquals(expected2,
CrudUtil.buildUpdateMessage(newsc, emptysc));
final String expected3 = "<p class='change-message'>Changed System Codes " +
"with the following: Value is set to <span class='field-value-to'>value</span> </p>";
Assert.assertEquals(expected3,
CrudUtil.buildUpdateMessage(emptysc, newsc));
Assert.assertEquals("",
CrudUtil.buildUpdateMessage(oldsc, samesc));
}
@Test
public void testBuildUpdateArrayMessage() {
final SystemCodes oldsc = new SystemCodes("categoryold","keyold","valueold");
final SystemCodes newsc = new SystemCodes("categorynew","keynew","valuenew");
final SystemCodes samesc = new SystemCodes("categoryold","keysame","valuesame");
final List<SystemCodes> oldFaves = new ArrayList<SystemCodes>();
oldFaves.add(samesc);
oldFaves.add(oldsc);
final List<SystemCodes> newFaves = new ArrayList<SystemCodes>();
newFaves.add(newsc);
newFaves.add(samesc);
final UserCriteria oldUser = new UserCriteria();
final UserCriteria newUser = new UserCriteria();
oldUser.setFavorites(oldFaves);
newUser.setFavorites(newFaves);
final String expected = "<p class='change-message'>Changed User Criteria with the following: added Favorites <span class='field-values-added'>[KEYNEW:valuenew]</span> " +
"and removed Favorites <span class='field-values-removed'>[KEYOLD:valueold]</span> </p>";
Assert.assertEquals(expected,
CrudUtil.buildUpdateMessage(oldUser, newUser));
}
@Test
public void testBuildUpdateSystemCodesMessage() {
final SystemCodes oldsc = new SystemCodes("categoryold","keyold","old");
final SystemCodes newsc = new SystemCodes("categorynew","keynew","new");
final Ninja oldtc = new Ninja();
oldtc.setFirstName("Samurai");
oldtc.setLastName("Ken");
oldtc.setStatus(oldsc);
final Ninja newtc = new Ninja();
newtc.setStatus(newsc);
newtc.setFirstName("Samurai");
newtc.setLastName("Ken");
final Ninja sametc = new Ninja();
sametc.setStatus(oldsc);
sametc.setFirstName("Samurai");
sametc.setLastName("Ken");
final String expected = "<p class='change-message'>Changed Ninja with Name:<span class='primary-field'>Samurai Ken</span> with the following: " +
"Status from <span class='field-value-from'>KEYOLD:old</span> to <span class='field-value-to'>KEYNEW:new</span> </p>";
Assert.assertEquals(expected,
CrudUtil.buildUpdateMessage(oldtc, newtc));
Assert.assertEquals("",
CrudUtil.buildUpdateMessage(oldtc, sametc));
}
@Test
public void testBuildDeleteMessage() {
final SystemCodes oldsc = new SystemCodes("categoryold","keyold","old");
final String expected = "<p class='delete-message'>Deleted System Codes with Value:<span class='primary-field'>old</span></p>";
Assert.assertEquals(expected,
CrudUtil.buildDeleteMessage(oldsc));
}
@Test
public void testBuildURLParameters() {
// empty parameter
final SystemCodes sc = new SystemCodes();
Assert.assertEquals("", CrudUtil.buildURLParameters(sc));
sc.setValue("");
Assert.assertEquals("", CrudUtil.buildURLParameters(sc));
//category=SAMPLE&key=&value=&parent.key=&orderOption=&orderFlow=&p=1
sc.setKey("PH");
Assert.assertEquals("key=PH", CrudUtil.buildURLParameters(sc));
sc.setValue("Aloe Vera");
Assert.assertEquals(
"value=Aloe+Vera&key=PH",
CrudUtil.buildURLParameters(sc));
}
@Test
public void testBuildJpaQueryString() {
final SystemCodes sc = new SystemCodes();
Assert.assertEquals("", CrudUtil.buildJpaQueryString(sc, true));
sc.setValue("");
Assert.assertEquals("", CrudUtil.buildJpaQueryString(sc, true));
sc.setKey("PH");
Assert.assertEquals(" where obj.key = 'PH'", CrudUtil
.buildJpaQueryString(sc, true));
Assert.assertEquals(" where obj.key like '%PH%' escape '\\\\'",
CrudUtil
.buildJpaQueryString(sc, false));
sc.setValue("Philippines");
Assert.assertEquals(
" where obj.key = 'PH' and obj.value = 'Philippines'",
CrudUtil.buildJpaQueryString(sc, true));
Assert.assertEquals(
" where obj.key like '%PH%' escape '\\\\' and obj.value like '%Philippines%' escape '\\\\'",
CrudUtil.buildJpaQueryString(sc, false));
// Category cat = new Category();
// cat.setId(12l);
// sc.setCategory(cat);
// Assert.assertEquals(" where key = 'PH' and value = 'Philippines' and category.id = 12",
// CrudUtil.buildJpaQueryString(sc, true));
// Assert.assertEquals(" where key like '%PH%' and value like '%Philippines%' and category.id = 12",
// CrudUtil.buildJpaQueryString(sc, false));
}
@Test
public void testBuildJpqQueryStringSpecialChars() {
final SystemCodes sc = new SystemCodes();
// handle (%)
sc.setValue("Phil%");
sc.setKey("");
Assert.assertEquals(
" where obj.value = 'Phil%'",
CrudUtil.buildJpaQueryString(sc, true));
Assert.assertEquals(
" where obj.value like '%Phil\\%%' escape '\\\\'",
CrudUtil.buildJpaQueryString(sc, false));
// handle '
sc.setValue("Phil's");
sc.setKey("");
Assert.assertEquals(
" where obj.value = 'Phil''s'",
CrudUtil.buildJpaQueryString(sc, true));
Assert.assertEquals(
" where obj.value like '%Phil''s%' escape '\\\\'",
CrudUtil.buildJpaQueryString(sc, false));
// handle (\)
sc.setValue("Phil's\\Jay");
sc.setKey("");
Assert.assertEquals(
" where obj.value = 'Phil''s\\\\Jay'",
CrudUtil.buildJpaQueryString(sc, true));
Assert.assertEquals(
" where obj.value like '%Phil''s\\\\\\\\Jay%' escape '\\\\'",
CrudUtil.buildJpaQueryString(sc, false));
// handle (_)
sc.setValue("Phil_Jay");
sc.setKey("");
Assert.assertEquals(
" where obj.value = 'Phil_Jay'",
CrudUtil.buildJpaQueryString(sc, true));
Assert.assertEquals(
" where obj.value like '%Phil\\_Jay%' escape '\\\\'",
CrudUtil.buildJpaQueryString(sc, false));
}
/**
* Test for inner class
*/
@Test
public void testBuildJpaQueryString2() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
user.setFirstName("Test");
cred.setUsername("testname");
cred.setEnabled(true);
user.setCredential(cred);
Assert
.assertEquals(
" where obj.firstName like '%Test%' escape '\\\\' and obj.credential.username like '%testname%' escape '\\\\' and obj.credential.enabled = true",
CrudUtil.buildJpaQueryString(user, false));
Assert
.assertEquals(
" where obj.firstName = 'Test' and obj.credential.username = 'testname' and obj.credential.enabled = true",
CrudUtil.buildJpaQueryString(user, true));
}
/**
* Test for numeric types
*/
@Test
public void testBuildJpaQueryString3() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
user.setFirstName("Test");
cred.setId(123l);
cred.setEnabled(null);
user.setCredential(cred);
Assert
.assertEquals(
" where obj.firstName like '%Test%' escape '\\\\' and obj.credential.id = 123",
CrudUtil.buildJpaQueryString(user, false));
Assert.assertEquals(
" where obj.firstName = 'Test' and obj.credential.id = 123",
CrudUtil.buildJpaQueryString(user, true));
}
/**
* Test for SystemCodes
*/
@Test
public void testBuildJpaQueryString4() {
final UserCriteria user = new UserCriteria();
final SystemCodes sc = new SystemCodes("STATUS","ACTIVE","Active");
user.setStatus(sc);
Assert.assertEquals(
" where obj.status.key = 'ACTIVE' and obj.credential.enabled = true",
CrudUtil.buildJpaQueryString(user, false));
}
/**
* Test for BaseEntity
*/
@Test
public void testBuildJpaQueryString5() {
final UserCriteria user = new UserCriteria();
final BaseUser supervisor = new BaseUser();
supervisor.setId(125l);
user.setSupervisor(supervisor);
Assert.assertEquals(
" where obj.supervisor.id = 125 and obj.credential.enabled = true",
CrudUtil.buildJpaQueryString(user, false));
}
@Test
public void testRetrieveObjectValue() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
user.setFirstName("Test");
user.setEmailAddress("admin@ideyatech.com");
cred.setUsername("testname");
cred.setPassword("password");
cred.setId(123l);
cred.setEnabled(true);
user.setCredential(cred);
Assert.assertEquals("Test", CrudUtil.retrieveObjectValue(user, "firstName"));
Assert.assertEquals("admin@ideyatech.com", CrudUtil.retrieveObjectValue(user, "emailAddress"));
Assert.assertEquals("testname", CrudUtil.retrieveObjectValue(user, "credential.username"));
// Assert.assertEquals("password", CrudUtil.retrieveObjectValue(user, "credential.password"));
Assert.assertEquals(123l,CrudUtil.retrieveObjectValue(user, "credential.id"));
try {
Assert.assertEquals(null,CrudUtil.retrieveObjectValue(user, "garbage"));
Assert.fail("No exception thrown on invalid property [garbage]");
} catch (final InvalidImplementationException iie) {
}
try {
Assert.assertEquals(null,CrudUtil.retrieveObjectValue(user, "credential.garbage"));
Assert.fail("No exception thrown on invalid property [credential.garbage]");
} catch (final InvalidImplementationException iie) {
}
}
@SuppressWarnings("rawtypes")
@Test
public void testRetrieveObjectValueArray1() {
final UserCriteria user = new UserCriteria();
user.setFirstName("Test");
user.setEmailAddress("admin@ideyatech.com");
final List<SystemCodes> codes = new ArrayList<SystemCodes>();
codes.add(new SystemCodes("CATEGORY", "STRING_1", "VALUE_1"));
codes.add(new SystemCodes("CATEGORY", "STRING_2", "VALUE_2"));
codes.add(new SystemCodes("CATEGORY", "STRING_3", "VALUE_3"));
user.setFavorites(codes);
final List keysResult = (List) CrudUtil.retrieveObjectValue(user, "favorites.key");
Assert.assertEquals(3, keysResult.size());
Assert.assertEquals("STRING_1", keysResult.get(0));
Assert.assertEquals("STRING_2", keysResult.get(1));
Assert.assertEquals("STRING_3", keysResult.get(2));
final List valuesResult = (List) CrudUtil.retrieveObjectValue(user, "favorites.value");
Assert.assertEquals(3, keysResult.size());
Assert.assertEquals("VALUE_1", valuesResult.get(0));
Assert.assertEquals("VALUE_2", valuesResult.get(1));
Assert.assertEquals("VALUE_3", valuesResult.get(2));
}
@Test
public void testRetrieveObjectMap() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
user.setFirstName("Test");
user.setEmailAddress("admin@ideyatech.com");
cred.setUsername("testname");
cred.setPassword("password");
cred.setId(123l);
cred.setEnabled(true);
user.setCredential(cred);
final Map<String, Object> map = new HashMap<String, Object>();
map.put("user", user);
map.put("cred", cred);
Assert.assertEquals("Test", CrudUtil.retrieveObjectValue(map, "user.firstName"));
Assert.assertEquals("admin@ideyatech.com", CrudUtil.retrieveObjectValue(map, "user.emailAddress"));
Assert.assertEquals("testname", CrudUtil.retrieveObjectValue(map, "cred.username"));
Assert.assertEquals("testname", CrudUtil.retrieveObjectValue(map, "user.credential.username"));
Assert.assertEquals(null,CrudUtil.retrieveObjectValue(map, "credential.garbage"));
Assert.assertEquals(null,CrudUtil.retrieveObjectValue(map, "garbage"));
}
@Test
public void testRetrieveObjectType() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
user.setFirstName("Test");
user.setEmailAddress("admin@ideyatech.com");
cred.setUsername("testname");
cred.setPassword("password");
cred.setId(123l);
cred.setEnabled(true);
user.setCredential(cred);
Assert.assertEquals(String.class, CrudUtil.retrieveObjectType(user, "firstName"));
Assert.assertEquals(String.class, CrudUtil.retrieveObjectType(user, "credential.username"));
Assert.assertEquals(Long.class, CrudUtil.retrieveObjectType(user, "credential.id"));
try {
Assert.assertEquals(null,CrudUtil.retrieveObjectType(user, "garbage"));
Assert.fail("No exception thrown on invalid property [garbage]");
} catch (final InvalidImplementationException iie) {
}
try {
Assert.assertEquals(null,CrudUtil.retrieveObjectType(user, "credential.garbage"));
Assert.fail("No exception thrown on invalid property [credential.garbage]");
} catch (final InvalidImplementationException iie) {
}
}
@Test
public void testReplaceSQLParameters() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
user.setFirstName("Test");
user.setEmailAddress("admin@ideyatech.com");
cred.setUsername("testname");
cred.setPassword("password");
cred.setId(123l);
cred.setEnabled(true);
user.setCredential(cred);
Assert.assertEquals("firstName='Test' and credential.id=123",
CrudUtil.replaceSQLParameters("firstName=:firstName and credential.id=:credential.id", user));
}
@Test
public void testReplaceSQLParametersList() {
final UserCriteria user = new UserCriteria();
final UserCredential cred = new UserCredential();
final List<SystemCodes> favorites = new ArrayList<SystemCodes>();
final List<String> alias = new ArrayList<String>();
favorites.add(new SystemCodes("FAVORITES","BANANA","Banana"));
favorites.add(new SystemCodes("FAVORITES","MANGO","Mango"));
alias.add("name1");
alias.add("name2");
user.setFirstName("Test");
user.setEmailAddress("admin@ideyatech.com");
user.setFavorites(favorites);
user.setAlias(alias);
cred.setUsername("testname");
cred.setPassword("password");
cred.setId(123l);
cred.setEnabled(true);
user.setCredential(cred);
Assert.assertEquals("firstName='Test' and credential.id=123 and favorites in ( 'BANANA', 'MANGO' ) and alias in ( 'name1', 'name2' )",
CrudUtil.replaceSQLParameters("firstName=:firstName and credential.id=:credential.id " +
"and favorites in ( :favorites ) and alias in ( :alias )", user));
}
@Test
public void testGetAllFields() throws SecurityException, NoSuchFieldException {
// List<Field> fields = CrudUtil.getAllFields(Ninja.class);
// Assert.assertEquals(35, fields.size());
// Field keyField = Ninja.class.getDeclaredField("key");
// Field statusField = Ninja.class.getDeclaredField("status");
// Field createDateField = BaseEntity.class.getDeclaredField("createDate");
// Assert.assertTrue(fields.contains(keyField));
// Assert.assertTrue(fields.contains(statusField));
// Assert.assertTrue(fields.contains(createDateField));
}
}