/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.envers.test.integration.reventity.trackmodifiedentities;
import javax.persistence.EntityManager;
import org.hibernate.envers.EntityTrackingRevisionListener;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.StrIntTestEntity;
import org.hibernate.envers.test.entities.StrTestEntity;
import org.hibernate.envers.test.entities.reventity.trackmodifiedentities.CustomTrackingRevisionEntity;
import org.hibernate.envers.test.entities.reventity.trackmodifiedentities.CustomTrackingRevisionListener;
import org.hibernate.envers.test.entities.reventity.trackmodifiedentities.ModifiedEntityTypeEntity;
import org.hibernate.envers.test.tools.TestTools;
import org.junit.Test;
/**
* Tests proper behavior of entity listener that implements {@link EntityTrackingRevisionListener}
* interface. {@link CustomTrackingRevisionListener} shall be notified whenever an entity instance has been
* added, modified or removed, so that changed entity name can be persisted.
*
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
public class CustomTrackingEntitiesTest extends BaseEnversJPAFunctionalTestCase {
private Integer steId = null;
private Integer siteId = null;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {
ModifiedEntityTypeEntity.class,
StrTestEntity.class,
StrIntTestEntity.class,
CustomTrackingRevisionEntity.class
};
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getEntityManager();
// Revision 1 - Adding two entities
em.getTransaction().begin();
StrTestEntity ste = new StrTestEntity( "x" );
StrIntTestEntity site = new StrIntTestEntity( "y", 1 );
em.persist( ste );
em.persist( site );
steId = ste.getId();
siteId = site.getId();
em.getTransaction().commit();
// Revision 2 - Modifying one entity
em.getTransaction().begin();
site = em.find( StrIntTestEntity.class, siteId );
site.setNumber( 2 );
em.getTransaction().commit();
// Revision 3 - Deleting both entities
em.getTransaction().begin();
ste = em.find( StrTestEntity.class, steId );
site = em.find( StrIntTestEntity.class, siteId );
em.remove( ste );
em.remove( site );
em.getTransaction().commit();
}
@Test
public void testTrackAddedEntities() {
ModifiedEntityTypeEntity steDescriptor = new ModifiedEntityTypeEntity( StrTestEntity.class.getName() );
ModifiedEntityTypeEntity siteDescriptor = new ModifiedEntityTypeEntity( StrIntTestEntity.class.getName() );
CustomTrackingRevisionEntity ctre = getAuditReader().findRevision( CustomTrackingRevisionEntity.class, 1 );
assert ctre.getModifiedEntityTypes() != null;
assert ctre.getModifiedEntityTypes().size() == 2;
assert TestTools.makeSet( steDescriptor, siteDescriptor ).equals( ctre.getModifiedEntityTypes() );
}
@Test
public void testTrackModifiedEntities() {
ModifiedEntityTypeEntity siteDescriptor = new ModifiedEntityTypeEntity( StrIntTestEntity.class.getName() );
CustomTrackingRevisionEntity ctre = getAuditReader().findRevision( CustomTrackingRevisionEntity.class, 2 );
assert ctre.getModifiedEntityTypes() != null;
assert ctre.getModifiedEntityTypes().size() == 1;
assert TestTools.makeSet( siteDescriptor ).equals( ctre.getModifiedEntityTypes() );
}
@Test
public void testTrackDeletedEntities() {
ModifiedEntityTypeEntity steDescriptor = new ModifiedEntityTypeEntity( StrTestEntity.class.getName() );
ModifiedEntityTypeEntity siteDescriptor = new ModifiedEntityTypeEntity( StrIntTestEntity.class.getName() );
CustomTrackingRevisionEntity ctre = getAuditReader().findRevision( CustomTrackingRevisionEntity.class, 3 );
assert ctre.getModifiedEntityTypes() != null;
assert ctre.getModifiedEntityTypes().size() == 2;
assert TestTools.makeSet( steDescriptor, siteDescriptor ).equals( ctre.getModifiedEntityTypes() );
}
@Test(expected = AuditException.class)
public void testFindEntitiesChangedInRevisionException() {
getAuditReader().getCrossTypeRevisionChangesReader();
}
}