package org.jboss.seam.test.unit;
import java.lang.reflect.Field;
import java.util.List;
import javax.persistence.EntityManager;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.framework.HibernateEntityHome;
import org.jboss.seam.framework.Home;
import org.jboss.seam.international.StatusMessage;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.test.unit.entity.SimpleEntity;
import org.jboss.seam.util.Reflections;
import org.testng.annotations.Test;
public class HomeTest
{
/**
* The only condition under which the getEntityClass() should be able to
* resolve the entity correctly is if the entityClass is provided or the Home
* implementation extends either EntityHome or HibernateEntityHome and
* provides a type parameter in the class definition
*/
@Test
public void testReadEntityClassFromTypeParameter()
{
EntityHome typelessHome = new EntityHome();
typelessHome.setEntityClass(SimpleEntity.class);
assert typelessHome.getEntityClass() == SimpleEntity.class;
assert new SimpleEntityHomeWithType().getEntityClass() == SimpleEntity.class;
try
{
Class ec = new SimpleEntityHomeSansType().getEntityClass();
assert false : "Not expecting to have resolved a type, but got " + ec;
}
catch (IllegalArgumentException e)
{
}
try
{
Class ec = new EntityHome<SimpleEntity>().getEntityClass();
assert false : "Not expecting to have resolved a type, but got " + ec;
}
catch (IllegalArgumentException e)
{
}
assert new SimpleHibernateEntityHomeWithType().getEntityClass() == SimpleEntity.class;
try
{
Class ec = new SimpleHibernateEntityHomeSansType().getEntityClass();
assert false : "Not expecting to have resolved a type, but got " + ec;
}
catch (IllegalArgumentException e)
{
}
try
{
Class ec = new HibernateEntityHome<SimpleEntity>().getEntityClass();
assert false : "Not expecting to have resolved a type, but got " + ec;
}
catch (IllegalArgumentException e)
{
}
assert new Home<EntityManager, SimpleEntity>()
{
@Override
protected String getEntityName()
{
return "SimpleEntity";
}
@Override
protected String getPersistenceContextName()
{
return "entityManager";
}
}.getEntityClass() == SimpleEntity.class;
}
/**
* Ensure that the add message methods do not trigger a null pointer
* exception if the getEntityClass() method is overridden.
*/
@Test
public void testGetEntityClassOverride() {
SimpleEntityHomeWithMessageStubs home = new SimpleEntityHomeWithMessageStubs();
// emulate @Create method
home.create();
home.triggerCreatedMessage();
List<StatusMessage> registeredMessages = home.getRegisteredMessages();
assert registeredMessages.size() == 1;
}
/**
* Ensure that an instance can be created when getEntityClass()
* method is overridden.
*/
@Test
public void testCreateInstance() {
SimpleEntityHomeWithMessageStubs home = new SimpleEntityHomeWithMessageStubs();
// emulate @Create method
home.create();
SimpleEntity entity = home.getInstance();
assert entity != null : "Excepting a non-null instance";
assert entity.getClass().equals(SimpleEntity.class) : "Expecting entity class to be " + SimpleEntity.class + " but got " + entity.getClass();
}
public class SimpleEntityHomeSansType extends EntityHome {}
public class SimpleEntityHomeWithType extends EntityHome<SimpleEntity> {}
public class SimpleHibernateEntityHomeSansType extends HibernateEntityHome {}
public class SimpleHibernateEntityHomeWithType extends HibernateEntityHome<SimpleEntity> {}
public class SimpleEntityHomeWithMessageStubs extends Home<EntityManager, SimpleEntity> {
private StatusMessages statusMessages;
public SimpleEntityHomeWithMessageStubs() {
statusMessages = new FacesMessages();
}
public void triggerCreatedMessage() {
createdMessage();
}
@Override
protected void debug(Object object, Object... params)
{
// ignore
}
@Override
protected StatusMessages getStatusMessages()
{
return statusMessages;
}
protected List<StatusMessage> getRegisteredMessages()
{
Field field = Reflections.getField(statusMessages.getClass(), "messages");
if (!field.isAccessible())
{
field.setAccessible(true);
}
return (List<StatusMessage>) Reflections.getAndWrap(field, statusMessages);
}
@Override
public Class<SimpleEntity> getEntityClass()
{
return SimpleEntity.class;
}
@Override
protected String getEntityName()
{
return "SimpleEntity";
}
@Override
protected String getPersistenceContextName()
{
return "entityManager";
}
}
}