package io.hypersistence.optimizer.jpa; import io.hypersistence.optimizer.HypersistenceOptimizer; import io.hypersistence.optimizer.core.event.Event; import io.hypersistence.optimizer.forum.domain.Post; import io.hypersistence.optimizer.forum.domain.Tag; import io.hypersistence.optimizer.forum.service.ForumService; import io.hypersistence.optimizer.hibernate.event.configuration.schema.SchemaGenerationEvent; import io.hypersistence.optimizer.hibernate.event.mapping.association.ManyToManyListEvent; import io.hypersistence.optimizer.hibernate.event.mapping.association.OneToOneParentSideEvent; import io.hypersistence.optimizer.hibernate.event.mapping.association.OneToOneWithoutMapsIdEvent; import io.hypersistence.optimizer.hibernate.event.mapping.association.fetching.EagerFetchingEvent; import io.hypersistence.optimizer.hibernate.event.query.PaginationWithoutOrderByEvent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.TransactionException; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; import static org.junit.Assert.*; /** * @author Vlad Mihalcea */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class SpringJpaXmlTest { protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); @Autowired private TransactionTemplate transactionTemplate; @PersistenceContext private EntityManager entityManager; @Autowired private ForumService forumService; @Autowired private HypersistenceOptimizer hypersistenceOptimizer; @Before public void init() { try { transactionTemplate.execute((TransactionCallback<Void>) transactionStatus -> { Tag hibernate = new Tag(); hibernate.setName("hibernate"); entityManager.persist(hibernate); Tag jpa = new Tag(); jpa.setName("jpa"); entityManager.persist(jpa); return null; }); } catch (TransactionException e) { LOGGER.error("Failure", e); } } @Test public void test() { assertEventTriggered(2, EagerFetchingEvent.class); assertEventTriggered(1, ManyToManyListEvent.class); assertEventTriggered(1, OneToOneParentSideEvent.class); assertEventTriggered(1, OneToOneWithoutMapsIdEvent.class); assertEventTriggered(1, SchemaGenerationEvent.class); Post newPost = forumService.newPost("High-Performance Java Persistence", "hibernate", "jpa"); assertNotNull(newPost.getId()); List<Post> posts = forumService.findAllByTitle("High-Performance Java Persistence"); assertEquals(1, posts.size()); Post post = forumService.findById(newPost.getId()); assertEquals("High-Performance Java Persistence", post.getTitle()); assertEventTriggered(0, PaginationWithoutOrderByEvent.class); assertEquals(1, forumService.findAll(5).size()); assertEventTriggered(1, PaginationWithoutOrderByEvent.class); } protected void assertEventTriggered(int expectedCount, Class<? extends Event> eventClass) { int count = 0; for (Event event : hypersistenceOptimizer.getEvents()) { if (event.getClass().equals(eventClass)) { count++; } } assertSame(expectedCount, count); } }