/*
* Copyright 2009-2011 the original author or authors.
*
* Licensed 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 dao.jpa;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import junit.framework.TestCase;
import model.Author;
import model.Book;
import model.Category;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdal.dao.BeanFilter;
import org.jdal.dao.Filter;
import org.jdal.dao.Page;
import org.jdal.dao.jpa.JpaDao;
import org.jdal.dao.jpa.JpaUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
/**
* Test JpaDao
*
* @author Jose Luis Martin
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"jpaDaos.xml"})
@DirtiesContext(classMode =ClassMode.AFTER_CLASS)
public class TestJpaDao extends TestCase {
private static final Log log = LogFactory.getLog(TestJpaDao.class);
@Resource
private JpaDao<Book, Long> bookDao;
@Resource
JpaDao<Category, Long> categoryDao;
@Test
@Transactional
public void testFilter() {
BookFilter bf = new BookFilter("bookFilter");
bf.setCategory(new Category("Java"));
Page<Book> page = new Page<Book>(10);
page.setFilter(bf);
bookDao.getPage(page);
List<Book> books = page.getData();
assertEquals(10, books.size());
}
@Test
@Transactional
public void testCountQuery() {
Filter f = new BeanFilter("joinFilter");
Page<Book> p = new Page<Book>();
p.setFilter(f);
bookDao.getPage(p);
assertEquals(22, p.getCount());
}
@Test
@Transactional
public void testCountCriteria() {
EntityManager em = bookDao.getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> criteria = cb.createQuery(Book.class);
Root<Book> root = criteria.from(Book.class);
Join<Book, Author> join = root.join("author");
criteria.where(join.isNotNull());
CriteriaQuery<Long> countCriteria = JpaUtils.countCriteria(em, criteria);
Long result = em.createQuery(countCriteria).getSingleResult();
log.debug("Count: " + result);
}
@Test
@Transactional
public void testCopy() {
EntityManager em = bookDao.getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> criteria = cb.createQuery(Book.class);
// Fetch join
Root<Book> root = criteria.from(Book.class);
Path<String> path = root.join("author").<String>get("name");
root.fetch("author");
criteria.select(root);
// SubQuery
Subquery<String> sq = criteria.subquery(String.class);
Root<Author> author = sq.from(Author.class);
sq.select(author.<String>get("name"));
sq.where(cb.equal(author.<String>get("name"), "Rod"));
criteria.where(cb.in(path).value(sq));
CriteriaQuery<Book> copy = cb.createQuery(Book.class);
JpaUtils.copyCriteria(criteria, copy);
List<Book> copyBooks = em.createQuery(copy).getResultList();
List<Book> books = em.createQuery(criteria).getResultList();
assertEquals(books, copyBooks);
}
@Test
@Transactional
public void testKeys() {
Page<Book> page = new Page<Book>();
List<Serializable> keys = bookDao.getKeys(page);
assertEquals(10, keys.size());
}
@Test
@Transactional
public void testNamedQuery() {
BookFilter filter = new BookFilter("booksByAuthorName");
filter.setAuthorName("Martin");
Page<Book> page = new Page<Book>();
page.setFilter(filter);
page.setSortName("publishedDate");
page.setOrderDesc();
bookDao.getPage(page);
assertEquals(4, page.getData().size());
}
@Test
@Transactional
public void testInitialize() {
Category category = categoryDao.get(1L);
categoryDao.initialize(category);
Set<Book> books = category.getBooks();
}
}