/* * 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.components.dynamic; import java.util.ArrayList; import java.util.List; import junit.framework.Assert; import org.hibernate.Session; import org.hibernate.envers.exception.AuditException; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.BaseEnversFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.junit.Test; import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class SanityCheckTest extends BaseEnversFunctionalTestCase { @Override protected String[] getMappings() { return new String[] { "mappings/dynamicComponents/mapSanityCheck.hbm.xml" }; } @Test @Priority(10) public void shouldInit() { Session session = getSession(); session.getTransaction().begin(); ManyToOneEntity manyToOne = getManyToOneEntity(); ManyToManyEntity manyToMany = getManyToManyEntity(); OneToOneEntity oneToOne = getOneToOneEntity(); PlainEntity plainEntity = getPlainEntity( manyToOne, manyToMany, oneToOne ); session.save( manyToMany ); session.save( manyToOne ); session.save( oneToOne ); session.save( plainEntity ); session.getTransaction().commit(); session.getTransaction().begin(); PlainEntity load = (PlainEntity) session.load( PlainEntity.class, 1L ); Assert.assertEquals( plainEntity, load ); session.getTransaction().commit(); } private PlainEntity getPlainEntity(ManyToOneEntity manyToOne, ManyToManyEntity manyToMany, OneToOneEntity oneToOne) { PlainComponent plainComponent = new PlainComponent(); List<ManyToManyEntity> manyToManyEntityList = new ArrayList<ManyToManyEntity>(); manyToManyEntityList.add( manyToMany ); plainComponent.setManyToManyList( manyToManyEntityList ); plainComponent.setComponentNote( "Note" ); plainComponent.setOneToOneEntity( oneToOne ); plainComponent.setManyToOneEntity( manyToOne ); plainComponent.setInternalComponent( new InternalComponent( "Some val" ) ); ArrayList<InternalComponent> internalComponents = new ArrayList<InternalComponent>(); internalComponents.add( new InternalComponent( "test" ) ); plainComponent.setInternalComponents( internalComponents ); PlainEntity plainEntity = new PlainEntity(); plainEntity.setId( 1L ); plainEntity.setNote( "Plain note" ); plainEntity.setComponent( plainComponent ); return plainEntity; } private ManyToOneEntity getManyToOneEntity() { return new ManyToOneEntity( 1L, "ManyToOne" ); } private OneToOneEntity getOneToOneEntity() { return new OneToOneEntity( 1L, "OneToOne" ); } private ManyToManyEntity getManyToManyEntity() { return new ManyToManyEntity( 1L, "ManyToMany" ); } @Test public void shouldFindRevisionBySimpleProperty() { ManyToOneEntity manyToOne = getManyToOneEntity(); ManyToManyEntity manyToMany = getManyToManyEntity(); OneToOneEntity oneToOne = getOneToOneEntity(); PlainEntity entity = getPlainEntity( manyToOne, manyToMany, oneToOne ); //given (and result of shouldInitData() //when List resultList = getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.property( "component_componentNote" ).eq( "Note" ) ) .getResultList(); Assert.assertEquals( entity, resultList.get( 0 ) ); } @Test public void shouldFindByInternalComponentProperty() { ManyToOneEntity manyToOne = getManyToOneEntity(); ManyToManyEntity manyToMany = getManyToManyEntity(); OneToOneEntity oneToOne = getOneToOneEntity(); PlainEntity entity = getPlainEntity( manyToOne, manyToMany, oneToOne ); //given (and result of shouldInitData() //when List resultList = getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.property( "component_internalComponent_property" ) .eq( entity.getComponent().getInternalComponent().getProperty() ) ) .getResultList(); Assert.assertEquals( entity, resultList.get( 0 ) ); } @Test public void shouldFailWhenQueryOnManyToMany() { ManyToManyEntity manyToMany = getManyToManyEntity(); //when List<ManyToManyEntity> manyToManyEntities = new ArrayList<ManyToManyEntity>(); manyToManyEntities.add( manyToMany ); try { getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.property( "component_manyToManyList" ).eq( manyToManyEntities ) ) .getResultList(); //then fail( "This should have generated an AuditException" ); } catch ( Exception e ) { assertTyping( AuditException.class, e ); assertEquals( "This type of relation (org.hibernate.envers.test.integration.components.dynamic.PlainEntity.component_manyToManyList) isn't supported and can't be used in queries.", e.getMessage() ); } } @Test public void shouldFailWhenQueryOnManyToOne() { //when PlainEntity plainEntity = (PlainEntity) getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.relatedId( "component_manyToOneEntity" ).eq( getManyToOneEntity().getId() ) ) .getResultList().get( 0 ); //then Assert.assertEquals( getManyToOneEntity(), plainEntity.getComponent().getManyToOneEntity() ); } @Test public void shouldFailWhenQueryOnOneToOne() { //when try { getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.relatedId( "component_oneToOneEntity" ).eq( getOneToOneEntity().getId() ) ) .getResultList(); //then fail( "This should have generated an IllegalArgumentException" ); } catch ( Exception e ) { assertTyping( IllegalArgumentException.class, e ); } } }