/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import org.candlepin.common.paging.Page;
import org.candlepin.common.paging.PageRequest;
import org.candlepin.test.DatabaseTestFixture;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
/**
* This class is used to test the pagination capabilities of the AbstractHibernateCurator.
* Ideally, this class would create its own entity object and curator for that
* entity object. However, Hibernate makes it difficult (if not impossible) to
* auto-detect entities that reside on a classpath different from the one containing
* persistence.xml. The solution would therefore be to create an EntityManagerFactory with
* a custom Ejb3Configuration and use addAnnotatedClass to add the test entity object.
* Unfortunately, since our entity manager is injected by Guice, that would require
* significant work to create a Guice module to create the EntityManagerFactory using
* our custom Ejb3Configuration. Ultimately, the most expedient thing to do is
* to reuse an entity object that Hibernate will pick up automatically.
*/
public class CuratorPaginationTest extends DatabaseTestFixture {
@Inject private OwnerCurator ownerCurator;
private Session session;
@Before
@Override
public void init() throws Exception {
super.init();
for (int i = 0; i < 10; i++) {
Owner o = new Owner();
o.setDisplayName(String.valueOf(i));
o.setKey(String.valueOf(i));
ownerCurator.create(o);
}
session = (Session) this.getEntityManager().getDelegate();
}
@Test
public void testPaging() {
PageRequest pageRequest = new PageRequest();
pageRequest.setSortBy("key");
pageRequest.setOrder(PageRequest.Order.ASCENDING);
pageRequest.setPage(3);
pageRequest.setPerPage(2);
Page<List<Owner>> p = ownerCurator.listAll(pageRequest);
assertEquals(Integer.valueOf(10), p.getMaxRecords());
List<Owner> ownerList = p.getPageData();
assertEquals(2, ownerList.size());
// Page 1 is (0, 1); page 2 is (2, 3); page 3 is (4, 5)
assertEquals("4", ownerList.get(0).getKey());
assertEquals("5", ownerList.get(1).getKey());
PageRequest pageRequest2 = p.getPageRequest();
assertEquals(pageRequest, pageRequest2);
}
@Test
public void testNoPaging() {
Page<List<Owner>> p = ownerCurator.listAll(null);
List<Owner> ownerList = p.getPageData();
assertEquals(10, ownerList.size());
}
@Test
public void testPagingWithCriteria() {
PageRequest pageRequest = new PageRequest();
pageRequest.setSortBy("key");
pageRequest.setOrder(PageRequest.Order.ASCENDING);
pageRequest.setPage(1);
pageRequest.setPerPage(2);
Criteria criteria = session.createCriteria(Owner.class).
add(Restrictions.gt("key", "5"));
Page<List<Owner>> p = ownerCurator.listByCriteria(criteria, pageRequest);
assertEquals(Integer.valueOf(4), p.getMaxRecords());
List<Owner> ownerList = p.getPageData();
assertEquals(2, ownerList.size());
assertEquals("6", ownerList.get(0).getKey());
PageRequest pageRequest2 = p.getPageRequest();
assertEquals(pageRequest, pageRequest2);
}
@Test
public void testNoPagingWithCriteria() {
Criteria criteria = session.createCriteria(Owner.class).
add(Restrictions.gt("key", "5"));
Page<List<Owner>> p = ownerCurator.listByCriteria(criteria, null);
List<Owner> ownerList = p.getPageData();
assertEquals(4, ownerList.size());
}
@Test
public void testReturnsAllResultsWhenNotPaging() {
PageRequest pageRequest = new PageRequest();
pageRequest.setSortBy("key");
pageRequest.setOrder(PageRequest.Order.ASCENDING);
assertFalse(pageRequest.isPaging());
Page<List<Owner>> p = ownerCurator.listAll(pageRequest);
assertEquals(Integer.valueOf(10), p.getMaxRecords());
List<Owner> ownerList = p.getPageData();
assertEquals(10, ownerList.size());
}
@Test
public void testReturnsAllResultsWhenPostFilteringByCriteria() {
PageRequest pageRequest = new PageRequest();
pageRequest.setSortBy("key");
pageRequest.setOrder(PageRequest.Order.ASCENDING);
pageRequest.setPage(1);
pageRequest.setPerPage(2);
Criteria criteria = session.createCriteria(Owner.class).
add(Restrictions.gt("key", "5"));
/* Since we are telling listByCriteria that we are doing post-filtering
* it should return us all results, but ordered and sorted by what we
* provide
*/
Page<List<Owner>> p = ownerCurator.listByCriteria(criteria, pageRequest, true);
assertEquals(Integer.valueOf(4), p.getMaxRecords());
List<Owner> ownerList = p.getPageData();
assertEquals(4, ownerList.size());
assertEquals("6", ownerList.get(0).getKey());
PageRequest pageRequest2 = p.getPageRequest();
assertEquals(pageRequest, pageRequest2);
}
@Test
public void testReturnsAllResultsWhenPostFiltering() {
PageRequest pageRequest = new PageRequest();
pageRequest.setSortBy("key");
pageRequest.setOrder(PageRequest.Order.ASCENDING);
pageRequest.setPage(1);
pageRequest.setPerPage(2);
/* Since we are telling listByCriteria that we are doing post-filtering
* it should return us all results, but ordered and sorted by what we
* provide
*/
Page<List<Owner>> p = ownerCurator.listAll(pageRequest, true);
assertEquals(Integer.valueOf(10), p.getMaxRecords());
List<Owner> ownerList = p.getPageData();
assertEquals(10, ownerList.size());
assertEquals("0", ownerList.get(0).getKey());
PageRequest pageRequest2 = p.getPageRequest();
assertEquals(pageRequest, pageRequest2);
}
private List<Owner> createOwners(int owners) {
List<Owner> ownerList = new ArrayList<Owner>();
for (int i = 0; i < owners; i++) {
Owner o = new Owner();
o.setDisplayName(String.valueOf(i));
o.setKey(String.valueOf(i));
ownerList.add(o);
}
return ownerList;
}
@Test
public void testTakeSubList() {
PageRequest req = new PageRequest();
req.setPage(1);
req.setPerPage(10);
List<Owner> ownerList = createOwners(20);
List<Owner> results = ownerCurator.takeSubList(req, ownerList);
assertEquals(10, results.size());
}
@Test
public void testTakeSubListWhenResultsTooSmall() {
PageRequest req = new PageRequest();
req.setPage(1);
req.setPerPage(10);
List<Owner> ownerList = createOwners(2);
List<Owner> results = ownerCurator.takeSubList(req, ownerList);
assertEquals(2, results.size());
}
@Test
public void testTakeSubListWhenRequestOutOfBounds() {
PageRequest req = new PageRequest();
req.setPage(5);
req.setPerPage(10);
List<Owner> ownerList = createOwners(10);
List<Owner> results = ownerCurator.takeSubList(req, ownerList);
assertEquals(0, results.size());
}
}