/**
*
*/
package org.activejpa.entity;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.Arrays;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.activejpa.entity.Condition.Operator;
import org.testng.annotations.Test;
/**
* @author ganeshs
*
*/
public class FilterTest {
@Test
public void shouldSetDefaultValuesWhenInitialized() {
Filter filter = new Filter();
assertEquals(filter.getPageNo(), (Integer)1);
assertEquals(filter.getPerPage(), (Integer)Integer.MAX_VALUE);
}
@Test
public void shouldSetActualValuesWhenInitialized() {
Filter filter = new Filter(10, 2);
assertEquals(filter.getPageNo(), (Integer)2);
assertEquals(filter.getPerPage(), (Integer)10);
}
@Test
public void shouldAddConditionsInConstructor() {
Filter filter = new Filter(mock(Condition.class), mock(Condition.class));
assertEquals(filter.getConditions().size(), 2);
}
@Test
public void shouldAddConditionUsingNameValue() {
Filter filter = new Filter();
filter.addCondition("testKey", "testValue");
assertEquals(filter.getConditions().size(), 1);
assertEquals(filter.getConditions().get(0), new Condition("testKey", "testValue"));
}
@Test
public void shouldAddConditionUsingNameValueOperator() {
Filter filter = new Filter();
filter.addCondition("testKey", Operator.eq, "testValue");
assertEquals(filter.getConditions().size(), 1);
assertEquals(filter.getConditions().get(0), new Condition("testKey", Operator.eq, "testValue"));
}
@Test
public void shouldConstructQuery() {
Filter filter = new Filter();
filter.addCondition("testKey", Operator.eq, "testValue");
filter.addCondition("testKey1", Operator.eq, "testValue1");
assertEquals(filter.constructQuery(), "testKey = :testKey and testKey1 = :testKey1");
}
@Test
public void shouldConstructCriteriaQuery() {
Filter filter = new Filter(mock(Condition.class), mock(Condition.class));
CriteriaBuilder builder = mock(CriteriaBuilder.class);
Root root = mock(Root.class);
Predicate p1 = mock(Predicate.class);
Predicate p2 = mock(Predicate.class);
when(filter.getConditions().get(0).constructQuery(builder, root)).thenReturn(p1);
when(filter.getConditions().get(1).constructQuery(builder, root)).thenReturn(p2);
CriteriaQuery query = mock(CriteriaQuery.class);
filter.constructQuery(builder, query, root);
verify(query).where(p1, p2);
}
@Test
public void shouldConstructCriteriaDeleteQuery() {
Filter filter = new Filter(mock(Condition.class), mock(Condition.class));
CriteriaBuilder builder = mock(CriteriaBuilder.class);
Root root = mock(Root.class);
Predicate p1 = mock(Predicate.class);
Predicate p2 = mock(Predicate.class);
when(filter.getConditions().get(0).constructQuery(builder, root)).thenReturn(p1);
when(filter.getConditions().get(1).constructQuery(builder, root)).thenReturn(p2);
CriteriaDelete query = mock(CriteriaDelete.class);
filter.constructQuery(builder, query, root);
verify(query).where(p1, p2);
}
@Test
public void shouldConstructCriteriaQueryWithSortFields() {
Filter filter = new Filter();
filter.addSortField(mock(SortField.class));
filter.addSortField(mock(SortField.class));
CriteriaBuilder builder = mock(CriteriaBuilder.class);
Root root = mock(Root.class);
Order order1 = mock(Order.class);
Order order2 = mock(Order.class);
when(filter.getSortFields().get(0).getOrder(builder, root)).thenReturn(order1);
when(filter.getSortFields().get(1).getOrder(builder, root)).thenReturn(order2);
CriteriaQuery query = mock(CriteriaQuery.class);
filter.constructQuery(builder, query, root);
verify(query).orderBy(Arrays.asList(order1, order2));
}
@Test
public void shouldSetParameters() {
Filter filter = new Filter();
filter.addCondition("testKey", Operator.eq, "testValue");
filter.addCondition("testKey1", Operator.eq, "testValue1");
Path path = mock(Path.class);
when(path.getJavaType()).thenReturn(String.class);
filter.getConditions().get(0).setPath(path);
filter.getConditions().get(1).setPath(path);
Query query = mock(Query.class);
Parameter param = mock(Parameter.class);
when(param.getParameterType()).thenReturn(String.class);
when(query.getParameter(anyString())).thenReturn(param);
filter.setParameters(query);
verify(query).setParameter("testKey", "testValue");
verify(query).setParameter("testKey1", "testValue1");
}
@Test
public void shouldCloneFilter() {
Filter filter = new Filter();
Filter clonedFilter = filter.clone(false);
assertTrue(clonedFilter.getConditions().isEmpty());
assertEquals(clonedFilter.getPageNo(), Integer.valueOf(1));
assertEquals(clonedFilter.getPerPage(), Integer.valueOf(Integer.MAX_VALUE));
}
@Test
public void shouldCloneFilterWithConditions() {
Filter filter = new Filter(mock(Condition.class));
Filter clonedFilter = filter.clone(false);
assertEquals(clonedFilter.getConditions().size(), 1);
}
@Test
public void shouldCloneFilterWithConditionsWithPaginate() {
Filter filter = new Filter(2, 20, mock(Condition.class));
Filter clonedFilter = filter.clone(true);
assertEquals(clonedFilter.getConditions().size(), 1);
assertEquals(clonedFilter.getPageNo(), Integer.valueOf(20));
assertEquals(clonedFilter.getPerPage(), Integer.valueOf(2));
}
@Test
public void shouldCloneFilterWithConditionsWithoutPaginate() {
Filter filter = new Filter(2, 20, mock(Condition.class));
Filter clonedFilter = filter.clone(false);
assertEquals(clonedFilter.getConditions().size(), 1);
assertEquals(clonedFilter.getPageNo(), Integer.valueOf(1));
assertEquals(clonedFilter.getPerPage(), Integer.valueOf(Integer.MAX_VALUE));
}
@Test
public void shouldNotPageIfPerPageIsNotSet() {
Filter filter = new Filter(mock(Condition.class));
assertFalse(filter.shouldPage());
}
@Test
public void shouldPageIfPerPageIsSet() {
Filter filter = new Filter(10, 1, mock(Condition.class));
assertTrue(filter.shouldPage());
}
@Test
public void shouldOrderByPrimaryTableField() {
}
}