package io.robe.admin.hibernate.dao;
import io.robe.admin.RobeAdminTest;
import io.robe.hibernate.RobeHibernateBundle;
import io.robe.hibernate.dao.BaseDao;
import io.robe.hibernate.entity.BaseEntity;
import org.hibernate.SessionFactory;
import org.hibernate.context.internal.ManagedSessionContext;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by hasanmumin on 07/10/2016.
*/
public abstract class BaseDaoTest<T extends BaseEntity, D extends BaseDao<T>> extends RobeAdminTest {
protected SessionFactory sessionFactory;
protected D dao;
protected Class<D> daoClazz;
public abstract T instance();
public abstract T update(T model);
@Before
public void before() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
if (sessionFactory == null) {
sessionFactory = RobeHibernateBundle.getInstance().getSessionFactory();
ManagedSessionContext.bind(sessionFactory.openSession());
this.daoClazz = (Class<D>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
dao = daoClazz.getDeclaredConstructor(SessionFactory.class).newInstance(sessionFactory);
}
}
@Test
public void create() {
T instance = this.createFrom();
T entity = this.findByIdFrom(instance.getOid());
assertEquals(instance, entity);
this.deleteFrom(entity);
}
@Test
public void findById() {
T instance = this.createFrom();
T entity = this.findByIdFrom(instance.getOid());
assertEquals(instance, entity);
this.deleteFrom(entity);
}
@Test
public void findAll() {
T instance = this.createFrom();
List<T> entities = this.findByAll();
assertTrue(entities.size() > 0); //TODO change
this.deleteFrom(instance);
}
@Test
public void update() {
T instance = this.createFrom();
assertEquals(instance, instance);
T update = this.update(instance);
update = this.updateFrom(update);
T entity = this.findByIdFrom(update.getOid());
assertEquals(update, entity);
this.deleteFrom(update);
}
@Test
public void delete() {
T instance = this.createFrom();
T entity = this.findByIdFrom(instance.getOid());
assertEquals(instance, entity);
this.deleteFrom(entity);
entity = this.findByIdFrom(entity.getOid());
Assert.assertTrue("Entity deleted from database", entity == null);
}
protected T deleteFrom(T instance) {
T response = dao.delete(instance);
dao.flush();
return response;
}
protected T createFrom() {
return createFrom(instance());
}
protected T createFrom(T instance) {
T response = dao.create(instance);
dao.flush();
return response;
}
protected T updateFrom(T instance) {
T response = dao.update(instance);
dao.flush();
return response;
}
protected T findByIdFrom(String oid) {
return dao.findById(oid);
}
protected List<T> findByAll() {
return dao.findAllStrict();
}
}