/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.common.query.jpa;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Selection;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import com.ewcms.common.query.Resultable;
import com.ewcms.common.query.cache.CacheResult;
import com.ewcms.common.query.cache.CacheResultable;
import com.ewcms.common.query.cache.ResultCacheable;
import com.ewcms.common.query.model.Certificate;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:com/ewcms/common/query/applicationContext.xml"})
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = false)
@Transactional
public class EntityQueryTest {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Autowired
private QueryInit entityQueryInit;
private EntityQuery query;
@Before
public void before()throws IOException{
query = new EntityQuery(entityManagerFactory.createEntityManager(),Certificate.class);
entityQueryInit.initDatabase();
}
@Test
public void testEq() {
query.eq("id", "72300125");
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 1);
Assert.assertTrue(list.size() == 1);
Assert.assertEquals(((Certificate)list.get(0)).getName(), "王伟");
}
@Test
public void testNotEq() {
query.notEq("id", "72300125");
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 159);
Assert.assertEquals(159,list.size());
}
@Test
public void testGt() {
query.gt("limit", 3000);
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 13);
Assert.assertTrue(list.size() == 13);
}
@Test
public void testGe() {
query.ge("limit", 3000);
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 18);
Assert.assertTrue(list.size() == 18);
}
@Test
public void testLt() {
query.lt("limit", 3000);
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 142);
Assert.assertTrue(list.size() == 142);
}
@Test
public void testLe() {
query.le("limit", 3000);
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 147);
Assert.assertTrue(list.size() == 147);
}
@Test
public void testLikeStart() {
query.likeStart("name", "王");
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 6);
Assert.assertTrue(list.size() == 6);
}
@Test
public void testLikeEnd() {
query.likeEnd("name", "伟");
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 4);
Assert.assertTrue(list.size() == 4);
}
@Test
public void testLikeAny() {
query.likeAnywhere("name", "伟");
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 4);
Assert.assertTrue(list.size() == 4);
}
private Date getDate(int year, int month, int day) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day);
return new Date(calendar.getTimeInMillis());
}
@Test
public void testBetween() {
Date start = getDate(1969, 11, 31);
Date end = getDate(1980, 0, 1);
query.between("brithdate", start, end);
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 31);
Assert.assertTrue(list.size() == 31);
}
@Test
public void testIn() {
List<String> names = new ArrayList<String>();
names.add("王伟");
names.add("周冬初");
query.in("name", names);
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 2);
Assert.assertTrue(list.size() == 2);
}
@Test
public void testIsNull() {
query.isNull("name");
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 0);
Assert.assertTrue(list.isEmpty());
}
@Test
public void testIsNotNull() {
query.isNotNull("name");
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 160);
Assert.assertTrue(list.size() == 160);
}
@Test
public void testAnd() {
query.eq("name", "王伟").and(query.eq("id", "72300125"));
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 1);
Assert.assertTrue(list.size() == 1);
}
@Test
public void testOr() {
query.eq("name", "王伟").or(query.eq("name", "周冬初"));
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 2);
Assert.assertTrue(list.size() == 2);
}
@Test
public void testComplex() {
query.eq("name", "周冬初").or(query.eq("name", "王伟").and(query.eq("id", "72300125")));
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 2);
Assert.assertTrue(list.size() == 2);
}
@Test
public void testNot() {
query.not(query.likeEnd("name", "伟"));
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 156);
Assert.assertTrue(list.size() == 156);
}
@Test
public void testCompoundAnd() {
query.eq("id", "72300125").eq("name", "王伟");
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 1);
Assert.assertTrue(list.size() == 1);
}
@Test
public void testCompoundOr(){
query.eq("id", "72300126").eq("name", "王伟").or();
Resultable result = query.queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 2);
Assert.assertTrue(list.size() == 2);
}
@Test
public void testOrderAsc() {
query.orderAsc("id");
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 160);
Assert.assertTrue(list.size() == 160);
int first_id = Integer.valueOf(((Certificate)list.get(0)).getId());
int second_id = Integer.valueOf(((Certificate)list.get(2)).getId());
int end_id = Integer.valueOf(((Certificate)list.get(list.size() - 1)).getId());
Assert.assertTrue(end_id > second_id);
Assert.assertTrue(second_id > first_id);
}
@Test
public void testOrderDesc() {
query.orderDesc("id");
Resultable result = query.setRow(160).queryResult();
List<Object> list = result.getResultList();
Assert.assertTrue(result.getCount() == 160);
Assert.assertTrue(list.size() == 160);
int first_id = Integer.valueOf(((Certificate)list.get(0)).getId());
int second_id = Integer.valueOf(((Certificate)list.get(2)).getId());
int end_id = Integer.valueOf(((Certificate)list.get(list.size() - 1)).getId());
Assert.assertTrue(first_id > second_id);
Assert.assertTrue(second_id > end_id);
}
@Test
public void testPagination(){
Resultable result = query.setRow(30).setPage(5).queryResult();
Assert.assertTrue(result.getCount() == 160);
Assert.assertTrue(result.getResultList().size() == 10);
Assert.assertTrue(result.getPageCount() == 6);
}
@Test
public void testCountSelectionQuery(){
Resultable result = new EntityQuery(entityManagerFactory.createEntityManager(),Certificate.class,new SelectCallback(){
@Override
public Selection<?> select(CriteriaBuilder builder, Root<?> root) {
return builder.count(root.get("id"));
}
},null).setRow(160).queryResult();
Assert.assertTrue(result.getCount() == 160);
Assert.assertTrue(result.getResultList().size() == 160);
}
@Test
public void testExtSelectionQuery(){
Resultable result = new EntityQuery(entityManagerFactory.createEntityManager(),Certificate.class,new SelectCallback(){
@Override
public Selection<?> select(CriteriaBuilder builder, Root<?> root) {
Path<Number> path = root.get("limit");
return builder.sum(path);
}
}).setRow(160).queryResult();
Assert.assertTrue(result.getCount() == 160);
Assert.assertTrue(result.getResultList().size() == 160);
Assert.assertTrue(result.getExtList().size() == 1);
int sumMoneyLimit = ((Integer)result.getExtList().get(0));
Assert.assertTrue(sumMoneyLimit == 222873);
}
@Test
public void testNullCacheGetCacheReult(){
Resultable result = query
.setRow(20)
.setPage(3)
.queryCacheResult("testCacheKey");
Assert.assertEquals(20, result.getResultList().size());
}
@Test
public void testMaxResultsIsNotLimit(){
ResultCacheable cache = mock(ResultCacheable.class);
when(cache.getMaxResult()).thenReturn(-1);
when(cache.getNewsResult()).thenReturn(50);
when(cache.getResultFromCache(any(String.class))).thenReturn(null);
query.setCache(cache);
Assert.assertEquals(160, query.getCacheCount(cache,160));
}
@Test
public void testMaxResultsIsLimit(){
ResultCacheable cache = mock(ResultCacheable.class);
when(cache.getMaxResult()).thenReturn(100);
when(cache.getNewsResult()).thenReturn(50);
when(cache.getResultFromCache(any(String.class))).thenReturn(null);
query.setCache(cache);
Assert.assertEquals(100, query.getCacheCount(cache,160));
Assert.assertEquals(99, query.getCacheCount(cache,99));
}
@Test
public void testEnabledCacheGetCacheResultIsNull(){
ResultCacheable cache = mock(ResultCacheable.class);
when(cache.getMaxResult()).thenReturn(10000);
when(cache.getNewsResult()).thenReturn(50);
when(cache.getResultFromCache(any(String.class))).thenReturn(null);
when(cache.putResultInCache(any(CacheResultable.class))).thenAnswer(new Answer<CacheResultable>(){
@Override
public CacheResultable answer(InvocationOnMock invocation)
throws Throwable {
return (CacheResultable)invocation.getArguments()[0];
}
});
Resultable result = query
.setRow(20)
.setPage(3)
.setCache(cache)
.queryCacheResult("testCacheKey");
Assert.assertEquals(20, result.getResultList().size());
Assert.assertEquals(160, result.getCount());
}
private void initResultList(CacheResult result,int size){
List<Object> list = new ArrayList<Object>();
for(int i = 0 ; i < size ; i++){
Certificate c = new Certificate();
c.setId(String.valueOf(i));
list.add(c);
}
result.appendResultList(list);
}
@Test
public void testEnableCacheGetCacheResult(){
ResultCacheable cache = mock(ResultCacheable.class);
when(cache.getMaxResult()).thenReturn(10000);
when(cache.getNewsResult()).thenReturn(50);
CacheResult cacheResult = new CacheResult("testCacheKey",160,new ArrayList<Object>());
initResultList(cacheResult,50);
when(cache.getResultFromCache(any(String.class))).thenReturn(null);
when(cache.putResultInCache(any(CacheResultable.class))).thenAnswer(new Answer<CacheResultable>(){
@Override
public CacheResultable answer(InvocationOnMock invocation)
throws Throwable {
return (CacheResultable)invocation.getArguments()[0];
}
});
Resultable result = query
.setRow(30)
.setPage(5)
.setCache(cache)
.queryCacheResult("testCacheKey");
Assert.assertEquals(10, result.getResultList().size());
Assert.assertEquals(160, result.getCount());
}
}