/* * Copyright 2010, Andrew M Gibson * * www.andygibson.net * * This file is part of DataValve. * * DataValve is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DataValve is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * * You should have received a copy of the GNU Lesser General Public License * along with DataValve. If not, see <http://www.gnu.org/licenses/>. * */ package org.fluttercode.datavalve.provider.hibernate; import java.sql.Connection; import java.sql.DriverManager; import java.util.List; import org.fluttercode.datavalve.ParameterResolver; import org.fluttercode.datavalve.dataset.ObjectDataset; import org.fluttercode.datavalve.dataset.QueryDataset; import org.fluttercode.datavalve.params.Parameter; import org.fluttercode.datavalve.provider.ParameterizedDataProvider; import org.fluttercode.datavalve.testing.junit.AbstractObjectDatasetJUnitTest; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; /** * @author Andy Gibson * */ public class HibernateDatasetTest extends AbstractObjectDatasetJUnitTest<Person> { private static final long serialVersionUID = 1L; private SessionFactory sessionFactory; private Session session; private transient Connection connection; private QueryDataset<Person> dataset; protected QueryDataset<Person> buildQueryDatasetx() { HibernateDataProvider<Person> provider = new HibernateDataProvider<Person>(); provider.setSession(session); provider.setSelectStatement("select p from Person p"); provider.setCountStatement("select count(p) from Person p"); provider.getOrderKeyMap().put("id", "p.id"); provider.getOrderKeyMap().put("name", "p.lastName,p.firstName"); provider.getOrderKeyMap().put("phone", "p.phone"); return new QueryDataset<Person>(provider); } @Override protected void setUp() throws Exception { super.setUp(); // start up db try { Class.forName("org.hsqldb.jdbcDriver"); connection = DriverManager.getConnection( "jdbc:hsqldb:mem:unit-testing-jpa", "sa", ""); } catch (Exception ex) { ex.printStackTrace(); fail("Exception during HSQL database startup."); } AnnotationConfiguration cfg = new AnnotationConfiguration(); cfg.addAnnotatedClass(Order.class); cfg.addAnnotatedClass(Person.class); sessionFactory = cfg.configure().buildSessionFactory(); session = sessionFactory.openSession(); generateTestData(); dataset = buildQueryDatasetx(); } @Override protected void tearDown() throws Exception { super.tearDown(); if (session != null) { session.close(); } if (sessionFactory != null) { sessionFactory.close(); } // shutdown db try { connection.createStatement().execute("SHUTDOWN"); connection.close(); } catch (Exception ex) { } } public void generateTestData() { session.getTransaction().begin(); for (int i = 0; i < 30; i++) { Person p = new Person(getDataFactory().getFirstName(), getDataFactory().getLastName()); for (int or = 0; or < 10; or++) { Order order = new Order(i * 10 + or, p); session.persist(order); } session.persist(p); } session.getTransaction().commit(); } public void testVerifydataGeneration() { Person p = new Person("Andy", "Gibson"); session.getTransaction().begin(); session.persist(p); session.getTransaction().commit(); @SuppressWarnings("unchecked") List<Person> people = session.createQuery("select p from Person p") .list(); assertNotNull(people); assertEquals(31, people.size()); Long res = (Long) session.createQuery( "select count(p) from Order p where p.person.id = 10") .uniqueResult(); assertEquals(10, res.longValue()); } public void testResultCount() { long result = dataset.getResultCount(); assertEquals(30, result); dataset.getProvider().getRestrictions().add("p.id = 3"); dataset.invalidateResultInfo(); result = dataset.getResultCount(); assertEquals(1, result); } public void testSimpleParameter() { dataset.getProvider().getRestrictions().add("p.id = :personId"); dataset.getProvider().getParameters().put("personId", 4l); List<Person> result = dataset.getResultList(); Long val = (Long) dataset.getProvider().resolveParameter(":personId"); assertNotNull(val); assertEquals(4, val.intValue()); assertNotNull(result); assertEquals(1, result.size()); assertEquals(1, dataset.getPage()); Person p = result.get(0); assertEquals(new Long(4), p.getId()); } public void testMissingParameter() { dataset.getProvider().getRestrictions().add("p.id = #{personId}"); List<Person> result = dataset.getResultList(); assertNotNull(result); assertEquals(1, dataset.getPage()); assertEquals(30, result.size()); } public void testNullParameter() { dataset.getProvider().getRestrictions().add("p.id = #{personId}"); List<Person> result = dataset.getResultList(); dataset.getProvider().getParameters().put("personId", null); assertNotNull(result); assertEquals(30, result.size()); } public void testPagination() { assertEquals(1, dataset.getPage()); assertEquals(false, dataset.isNextAvailable()); assertEquals(false, dataset.isPreviousAvailable()); dataset.setMaxRows(10); assertEquals(1, dataset.getPage()); assertEquals(true, dataset.isNextAvailable()); assertEquals(false, dataset.isPreviousAvailable()); dataset.next(); assertEquals(2, dataset.getPage()); assertEquals(true, dataset.isNextAvailable()); assertEquals(true, dataset.isPreviousAvailable()); dataset.previous(); assertEquals(1, dataset.getPage()); assertEquals(true, dataset.isNextAvailable()); assertEquals(false, dataset.isPreviousAvailable()); dataset.last(); assertEquals(3, dataset.getPage()); assertEquals(false, dataset.isNextAvailable()); assertEquals(true, dataset.isPreviousAvailable()); dataset.previous(); assertEquals(2, dataset.getPage()); assertEquals(true, dataset.isNextAvailable()); assertEquals(true, dataset.isPreviousAvailable()); } public void testParameterResolverRepeatsEval() { dataset.getProvider().getRestrictions().add("p.id = #{id}"); dataset.getProvider().getRestrictions().add("p.id = #{id}"); dataset.getProvider().addParameterResolver(new ParameterResolver() { long id = 20; public boolean resolveParameter( ParameterizedDataProvider<? extends Object> dataset, Parameter parameter) { if (parameter.getName().equals("#{id}")) { parameter.setValue(id++); return true; } return false; } public boolean acceptParameter(String parameter) { boolean val = parameter.startsWith("#{") && parameter.endsWith("}"); return val; } }); List<Person> results = dataset.getResultList(); assertNotNull(results); assertEquals(0, results.size()); assertEquals(0, dataset.getResultCount().intValue()); } public void testQueryWithOrdering() { ObjectDataset<Person> qry = buildObjectDataset(); qry.setOrderKey("id"); // check record count assertEquals(getDataRowCount(), qry.getResultCount().intValue()); List<Person> results = qry.getResultList(); assertNotNull(results); assertEquals(getDataRowCount(), results.size()); } public void testOrderByAscNonPaged() { ObjectDataset<Person> qry = buildObjectDataset(); qry.setOrderKey("id"); performOrderChecks(qry, true); } public void testOrderByAscPaged() { ObjectDataset<Person> qry = buildObjectDataset(); qry.setMaxRows(7); qry.setOrderKey("id"); performOrderChecks(qry, true); } public void testOrderByDescNonPaged() { ObjectDataset<Person> qry = buildObjectDataset(); qry.setOrderKey("id"); performOrderChecks(qry, false); } public void testOrderByDescPaged() { ObjectDataset<Person> qry = buildObjectDataset(); qry.setMaxRows(7); qry.setOrderKey("id"); performOrderChecks(qry, false); } protected void performOrderChecks(ObjectDataset<Person> qry, boolean isAsc) { Long lastValue = null; do { List<Person> results = qry.getResultList(); for (int i = 0; i < results.size(); i++) { Person p = results.get(i); if (lastValue != null) { if (isAsc) { assertTrue(p.getId() > lastValue); } else { assertTrue(p.getId() < lastValue); } } } qry.next(); } while (qry.isNextAvailable()); } @Override public ObjectDataset<Person> buildObjectDataset() { return dataset; } @Override public int getDataRowCount() { return 30; } }