package com.ideyatech.dao.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.ext.mysql.MySqlDataTypeFactory;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;
import org.opentides.bean.SortField;
import org.opentides.bean.SortField.OrderFlow;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import com.ideyatech.bean.Ninja;
import com.ideyatech.dao.NinjaDAO;
/**
* Integration test for BaseEntityDAOJpaImpl class using the sample Ninja class.
*
* @author gino
*
*/
@ContextConfiguration(locations = {"classpath:applicationContext-dao-test.xml"})
public class BaseEntityDAOJpaImplIntegrationTest extends AbstractJUnit4SpringContextTests {
@Autowired
private NinjaDAO ninjaDAO;
@Autowired
private DataSource dataSource;
@PersistenceContext
private EntityManager entityManager;
@Autowired
private PlatformTransactionManager transactionManager;
/**
* We will use transactionTemplate to handle transaction. For some unknown reason annotating with @TransactionConfiguration
* is not working.
*/
private TransactionTemplate transactionTemplate;
@Before
public void init() throws Exception {
IDatabaseConnection dbUnitCon = null;
Connection conn = DataSourceUtils.getConnection(dataSource);
dbUnitCon = new DatabaseConnection(conn);
DatabaseConfig config = dbUnitCon.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
IDataSet dataSet = new FlatXmlDataSet(
new FileInputStream("./src/test/resources/dataset/ninja-dataset.xml"));
DatabaseOperation.CLEAN_INSERT.execute(dbUnitCon, dataSet);
transactionTemplate = new TransactionTemplate(transactionManager);
}
@Test
public void testInsertSelectAllDelete() {
//Insert new Ninja
final Ninja ninja = new Ninja();
ninja.setFirstName("Richard");
ninja.setLastName("Buendia");
ninja.setGender("Male");
ninja.setEmail("richard@buendia.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
ninjaDAO.saveEntityModel(ninja);
Ninja searchedNinja = ninjaDAO.loadEntityModel(ninja.getId());
assertNotNull(searchedNinja);
assertEquals(ninja, searchedNinja);
//Updating
searchedNinja.setEmail("email@email.com");
ninjaDAO.saveEntityModel(ninja);
//ID should not be changed
assertEquals(new Long(ninja.getId()), searchedNinja.getId());
assertEquals("email@email.com", searchedNinja.getEmail());
// Select all Ninja
List<Ninja> ninjas = ninjaDAO.findAll();
assertEquals(4, ninjas.size());
//Delete ninja
ninjaDAO.deleteEntityModel(ninja.getId());
// Select all Ninja again...
List<Ninja> newNinjas = ninjaDAO.findAll();
assertEquals(3, newNinjas.size());
}
});
}
@Test
public void testSelectAllWithStartTotal() {
List<Ninja> ninjas = ninjaDAO.findAll(1, 2);
assertNotNull(ninjas);
assertEquals(2, ninjas.size());
Ninja ninja1 = ninjas.get(0);
assertEquals(new Long(2), ninja1.getId());
Ninja ninja2 = ninjas.get(1);
assertEquals(new Long(3), ninja2.getId());
}
@Test
public void testFindByNamedQuery() {
final Ninja ninja = new Ninja();
ninja.setFirstName("Richard");
ninja.setLastName("Buendia");
ninja.setGender("Male");
ninja.setEmail("richard@buendia.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
//We will use this for searching...
ninjaDAO.saveEntityModel(ninja);
String jpql = "jpql.ninja.findByName";
Map<String, Object> params = new HashMap<>();
params.put("firstName", "Richard");
List<Ninja> ninjas = ninjaDAO.findByNamedQuery(jpql, params);
//I expect only 1 Richard..
assertEquals(1, ninjas.size());
Ninja result = ninjas.get(0);
assertEquals("Richard", result.getFirstName());
assertEquals("Buendia", result.getLastName());
assertEquals("Male", result.getGender());
//Find all using jpql but with limit
jpql = "jpql.ninja.findAll";
ninjas = ninjaDAO.findByNamedQuery(jpql, null, 1, 2);
assertEquals(2, ninjas.size());
Ninja ninja1 = ninjas.get(0);
Ninja ninja2 = ninjas.get(1);
//jpql is ordered by ID so ID of ninja1 should be 2 and for ninja2 it should be 3
//Check ninja-dataset.xml
assertEquals(new Long(2l), ninja1.getId());
assertEquals("email2@email.com", ninja1.getEmail());
assertEquals("Master", ninja1.getFirstName());
assertEquals("Ninja", ninja1.getLastName());
assertEquals(new Long(3l), ninja2.getId());
assertEquals("email3@email.com", ninja2.getEmail());
assertEquals("Sensei", ninja2.getFirstName());
assertEquals("Boss", ninja2.getLastName());
}
});
}
@Test
public void testFindByNamedQueryUsingObjectWithPaging() {
final Ninja ninja = new Ninja();
ninja.setFirstName("Sensei");
ninja.setLastName("Buendia");
ninja.setGender("Male");
ninja.setEmail("richard@buendia.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
//We will use this for searching...
ninjaDAO.saveEntityModel(ninja);
String jpql = "jpql.ninja.findByNameObj";
List<Ninja> ninjas = ninjaDAO.findByNamedQuery(jpql, 1, 1, new Object[]{"Sensei"});
//I expect only 1 Richard..
assertEquals(1, ninjas.size());
Ninja result = ninjas.get(0);
assertEquals("Sensei", result.getFirstName());
assertEquals("Buendia", result.getLastName());
assertEquals("Male", result.getGender());
}
});
}
@Test
public void testCountAndFindByExample() {
final Ninja ninja1 = new Ninja();
ninja1.setFirstName("Richard");
ninja1.setLastName("Buendia");
ninja1.setGender("Male");
ninja1.setEmail("richard@buendia.com");
final Ninja ninja2 = new Ninja();
ninja2.setFirstName("Richard");
ninja2.setLastName("Santos");
ninja2.setGender("Male");
ninja2.setEmail("richard@santos.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
ninjaDAO.saveEntityModel(ninja1);
ninjaDAO.saveEntityModel(ninja2);
Ninja sample = new Ninja();
sample.setFirstName("Richard");
Long count = ninjaDAO.countByExample(sample);
assertEquals(new Long(2l), count);
List<Ninja> result = ninjaDAO.findByExample(sample);
assertEquals(2, result.size());
List<Ninja> expected = new ArrayList<>();
expected.add(ninja1);
expected.add(ninja2);
assertEquals(expected, result);
}
});
}
@Test
public void testSaveAllEntityModel() {
final Ninja ninja1 = new Ninja();
ninja1.setFirstName("Richard");
ninja1.setLastName("Buendia");
ninja1.setGender("Male");
ninja1.setEmail("richard@buendia.com");
final Ninja ninja2 = new Ninja();
ninja2.setFirstName("Richard");
ninja2.setLastName("Santos");
ninja2.setGender("Male");
ninja2.setEmail("richard@santos.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
List<Ninja> ninjas = new ArrayList<>();
ninjas.add(ninja1);
ninjas.add(ninja2);
ninjaDAO.saveAllEntityModel(ninjas);
Long result = ninjaDAO.countAll();
assertEquals(new Long(5l), result);
}
});
}
@Test
public void testMultisortAsc() {
final Ninja ninja1 = new Ninja();
ninja1.setFirstName("Richard");
ninja1.setLastName("Naruto");
ninja1.setGender("Male");
ninja1.setEmail("richard@buendia.com");
final Ninja ninja2 = new Ninja();
ninja2.setFirstName("Gino");
ninja2.setLastName("Naruto");
ninja2.setGender("Male");
ninja2.setEmail("richard@santos.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
ninjaDAO.saveEntityModel(ninja1);
ninjaDAO.saveEntityModel(ninja2);
Ninja sample = new Ninja();
sample.setLastName("Naruto");
List<SortField> sortFields = new ArrayList<SortField>();
sortFields.add(new SortField("lastName", OrderFlow.ASC));
sortFields.add(new SortField("firstName", OrderFlow.ASC));
sample.setSortFields(sortFields);
Long count = ninjaDAO.countByExample(sample);
assertEquals(new Long(3l), count);
List<Ninja> result = ninjaDAO.findByExample(sample);
assertEquals(3, result.size());
Ninja n1 = result.get(0);
Ninja n2 = result.get(1);
Ninja n3 = result.get(2);
assertEquals("Gino", n1.getFirstName());
assertEquals("Richard", n2.getFirstName());
assertEquals("Uzumaki", n3.getFirstName());
}
});
}
@Test
public void testMultisortDesc() {
final Ninja ninja1 = new Ninja();
ninja1.setFirstName("Richard");
ninja1.setLastName("Naruto");
ninja1.setGender("Male");
ninja1.setEmail("richard@buendia.com");
final Ninja ninja2 = new Ninja();
ninja2.setFirstName("Gino");
ninja2.setLastName("Naruto");
ninja2.setGender("Male");
ninja2.setEmail("richard@santos.com");
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
ninjaDAO.saveEntityModel(ninja1);
ninjaDAO.saveEntityModel(ninja2);
Ninja sample = new Ninja();
sample.setLastName("Naruto");
List<SortField> sortFields = new ArrayList<SortField>();
sortFields.add(new SortField("lastName", OrderFlow.ASC));
sortFields.add(new SortField("firstName", OrderFlow.DESC));
sample.setSortFields(sortFields);
Long count = ninjaDAO.countByExample(sample);
assertEquals(new Long(3l), count);
List<Ninja> result = ninjaDAO.findByExample(sample);
assertEquals(3, result.size());
Ninja n1 = result.get(2);
Ninja n2 = result.get(1);
Ninja n3 = result.get(0);
assertEquals("Gino", n1.getFirstName());
assertEquals("Richard", n2.getFirstName());
assertEquals("Uzumaki", n3.getFirstName());
}
});
}
}