package org.hibernate.envers.test.integration.inheritance.mixed;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.envers.test.AbstractEntityTest;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.integration.inheritance.mixed.entities.*;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
/**
* @author Michal Skowronek (mskowr at o2 pl)
*/
public class MixedInheritanceStrategiesEntityTest extends AbstractEntityTest {
private ActivityId id2;
private ActivityId id1;
private ActivityId id3;
@Override
public void configure(Ejb3Configuration cfg) {
cfg.addAnnotatedClass(AbstractActivity.class);
cfg.addAnnotatedClass(AbstractCheckActivity.class);
cfg.addAnnotatedClass(CheckInActivity.class);
cfg.addAnnotatedClass(NormalActivity.class);
}
@Test
@Priority(10)
public void initData() {
NormalActivity normalActivity = new NormalActivity();
id1 = new ActivityId(1, 2);
normalActivity.setId(id1);
normalActivity.setSequenceNumber(1);
// Revision 1
getEntityManager().getTransaction().begin();
getEntityManager().persist(normalActivity);
getEntityManager().getTransaction().commit();
// Revision 2
getEntityManager().getTransaction().begin();
normalActivity = getEntityManager().find(NormalActivity.class, id1);
CheckInActivity checkInActivity = new CheckInActivity();
id2 = new ActivityId(2, 3);
checkInActivity.setId(id2);
checkInActivity.setSequenceNumber(0);
checkInActivity.setDurationInMinutes(30);
checkInActivity.setRelatedActivity(normalActivity);
getEntityManager().persist(checkInActivity);
getEntityManager().getTransaction().commit();
// Revision 3
normalActivity = new NormalActivity();
id3 = new ActivityId(3, 4);
normalActivity.setId(id3);
normalActivity.setSequenceNumber(2);
getEntityManager().getTransaction().begin();
getEntityManager().persist(normalActivity);
getEntityManager().getTransaction().commit();
// Revision 4
getEntityManager().getTransaction().begin();
normalActivity = getEntityManager().find(NormalActivity.class, id3);
checkInActivity = getEntityManager().find(CheckInActivity.class, id2);
checkInActivity.setRelatedActivity(normalActivity);
getEntityManager().merge(checkInActivity);
getEntityManager().getTransaction().commit();
}
@Test
public void testRevisionsCounts() {
assertEquals(Arrays.asList(1), getAuditReader().getRevisions(NormalActivity.class, id1));
assertEquals(Arrays.asList(3), getAuditReader().getRevisions(NormalActivity.class, id3));
assertEquals(Arrays.asList(2, 4), getAuditReader().getRevisions(CheckInActivity.class, id2));
}
@Test
public void testCurrentStateOfCheckInActivity() {
final CheckInActivity checkInActivity = getEntityManager().find(CheckInActivity.class, id2);
final NormalActivity normalActivity = getEntityManager().find(NormalActivity.class, id3);
assertEquals(id2, checkInActivity.getId());
assertEquals(0, checkInActivity.getSequenceNumber().intValue());
assertEquals(30, checkInActivity.getDurationInMinutes().intValue());
final Activity relatedActivity = checkInActivity.getRelatedActivity();
assertEquals(normalActivity.getId(), relatedActivity.getId());
assertEquals(normalActivity.getSequenceNumber(), relatedActivity.getSequenceNumber());
}
@Test
public void testCheckCurrentStateOfNormalActivities() throws Exception {
final NormalActivity normalActivity1 = getEntityManager().find(NormalActivity.class, id1);
final NormalActivity normalActivity2 = getEntityManager().find(NormalActivity.class, id3);
assertEquals(id1, normalActivity1.getId());
assertEquals(1, normalActivity1.getSequenceNumber().intValue());
assertEquals(id3, normalActivity2.getId());
assertEquals(2, normalActivity2.getSequenceNumber().intValue());
}
@Test
public void doTestFirstRevisionOfCheckInActivity() throws Exception {
CheckInActivity checkInActivity = getAuditReader().find(CheckInActivity.class, id2, 2);
NormalActivity normalActivity = getAuditReader().find(NormalActivity.class, id1, 2);
assertEquals(id2, checkInActivity.getId());
assertEquals(0, checkInActivity.getSequenceNumber().intValue());
assertEquals(30, checkInActivity.getDurationInMinutes().intValue());
Activity relatedActivity = checkInActivity.getRelatedActivity();
assertEquals(normalActivity.getId(), relatedActivity.getId());
assertEquals(normalActivity.getSequenceNumber(), relatedActivity.getSequenceNumber());
}
@Test
public void doTestSecondRevisionOfCheckInActivity() throws Exception {
CheckInActivity checkInActivity = getAuditReader().find(CheckInActivity.class, id2, 4);
NormalActivity normalActivity = getAuditReader().find(NormalActivity.class, id3, 4);
assertEquals(id2, checkInActivity.getId());
assertEquals(0, checkInActivity.getSequenceNumber().intValue());
assertEquals(30, checkInActivity.getDurationInMinutes().intValue());
Activity relatedActivity = checkInActivity.getRelatedActivity();
assertEquals(normalActivity.getId(), relatedActivity.getId());
assertEquals(normalActivity.getSequenceNumber(), relatedActivity.getSequenceNumber());
}
}