/** * 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.sql.Date; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import javax.persistence.EntityManagerFactory; import javax.persistence.TemporalType; 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; /** * * @author wangwei */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:com/ewcms/common/query/applicationContext.xml"}) @TransactionConfiguration(transactionManager = "txManager", defaultRollback = false) @Transactional public class HqlQueryTest { @Autowired EntityManagerFactory entityManagerFactory; @Autowired private QueryInit entityQueryInit; @Before public void before()throws IOException{ entityQueryInit.initDatabase(); } @Test public void testSetParameter() { String where = "o.id =:id"; String hql = String.format("From Certificate o Where %s", where); String countHql = String.format("Select count(o.id) From Certificate o Where %s", where); String sumHql = String.format("Select sum(o.limit) From Certificate o Where %s", where); HqlQueryable query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql, sumHql); query.setParameter("id", "72300125"); Resultable result = query.queryResult(); Assert.assertEquals(1,result.getCount()); Assert.assertEquals(298,((Long)result.getExtList().get(0)).intValue()); Assert.assertEquals(1,result.getResultList().size()); } @Test public void testSetParameterPosition() { String where = "o.id =?1"; String hql = String.format("From Certificate o Where %s", where); String countHql = String.format("Select count(o.id) From Certificate o Where %s", where); String sumHql = String.format("Select sum(o.limit) From Certificate o Where %s", where); HqlQueryable query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql, sumHql); query.setParameter(1, "72300125"); Resultable result = query.queryResult(); Assert.assertEquals(1,result.getCount()); Assert.assertEquals(298,((Long)result.getExtList().get(0)).intValue()); Assert.assertEquals(1,result.getResultList().size()); } @Test public void testSetParameterDate() { String where = "o.brithdate > :date"; String hql = String.format("From Certificate o Where %s", where); String countHql = String.format("Select count(o.id) From Certificate o Where %s", where); HqlQueryable query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); Calendar calendar = Calendar.getInstance(); calendar.set(1975, 0, 1); Resultable result = query.setParameter( "date", new Date(calendar.getTimeInMillis()), TemporalType.DATE).queryResult(); Assert.assertTrue(result.getCount() == 13); } @Test public void testSetParameterDatePosition() { String where = "o.brithdate > ?1"; String hql = String.format("From Certificate o Where %s", where); String countHql = String.format("Select count(o.id) From Certificate o Where %s", where); HqlQueryable query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); Calendar calendar = Calendar.getInstance(); calendar.set(1975, 0, 1); Resultable result = query.setParameter( 1, new Date(calendar.getTimeInMillis()), TemporalType.DATE).queryResult(); Assert.assertTrue(result.getCount() == 13); } @Test public void testNullCacheGetCacheReult(){ String hql = "From Certificate o"; String countHql = "Select count(o.id) From Certificate o"; HqlQueryable query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); Resultable result = query .setRow(20) .setPage(3) .queryCacheResult("testCacheKey"); Assert.assertEquals(20, result.getResultList().size()); } @Test public void testMaxResultsIsNotLimit(){ String hql = "From Certificate o"; String countHql = "Select count(o.id) From Certificate o"; HqlQuery query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); 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(){ String hql = "From Certificate o"; String countHql = "Select count(o.id) From Certificate o"; HqlQuery query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); 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(){ String hql = "From Certificate o"; String countHql = "Select count(o.id) From Certificate o"; HqlQuery query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); 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(){ String hql = "From Certificate o"; String countHql = "Select count(o.id) From Certificate o"; HqlQueryable query = new HqlQuery(entityManagerFactory.createEntityManager(), hql, countHql); 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()); } }