package org.jooby.hbm; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import java.util.List; import javax.persistence.EntityManager; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.context.internal.ManagedSessionContext; import org.hibernate.jpa.HibernateEntityManagerFactory; import org.jooby.Request; import org.jooby.Response; import org.jooby.Route; import org.jooby.internal.hbm.TrxResponse; import org.jooby.internal.hbm.TrxResponseTest; import org.jooby.test.MockUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.google.common.collect.Lists; import com.google.inject.Key; @RunWith(PowerMockRunner.class) @PrepareForTest({OpenSessionInView.class, ManagedSessionContext.class, TrxResponseTest.class }) public class OpenSessionInViewTest { @SuppressWarnings("unchecked") @Test public void defaults() throws Exception { List<Key<EntityManager>> keys = Lists.newArrayList(Key.get(EntityManager.class)); new MockUnit(HibernateEntityManagerFactory.class, Request.class, Response.class, Route.Chain.class, EntityManager.class) .expect(unit -> { Request req = unit.get(Request.class); expect(req.set(keys.get(0), unit.get(EntityManager.class))).andReturn(req); TrxResponse rsp = unit.mockConstructor(TrxResponse.class, new Class[]{Response.class, EntityManager.class }, unit.get(Response.class), unit.get(EntityManager.class)); expect(rsp.begin()).andReturn(rsp); rsp.done(); Route.Chain chain = unit.get(Route.Chain.class); chain.next(req, rsp); }) .expect(unit -> { SessionFactory sf = unit.mock(SessionFactory.class); Session session = unit.mock(Session.class); session.setFlushMode(FlushMode.AUTO); unit.mockStatic(ManagedSessionContext.class); expect(ManagedSessionContext.bind(session)).andReturn(session); expect(ManagedSessionContext.unbind(sf)).andReturn(session); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); HibernateEntityManagerFactory hemf = unit.get(HibernateEntityManagerFactory.class); expect(hemf.getSessionFactory()).andReturn(sf); expect(hemf.createEntityManager()).andReturn(em); }) .run(unit -> { new OpenSessionInView(unit.get(HibernateEntityManagerFactory.class), keys) .handle( unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @SuppressWarnings("unchecked") @Test(expected = HibernateException.class) public void shouldAlwaysUnbindSession2() throws Exception { List<Key<EntityManager>> keys = Lists.newArrayList(Key.get(EntityManager.class)); new MockUnit(HibernateEntityManagerFactory.class, Request.class, Response.class, Route.Chain.class, EntityManager.class) .expect(unit -> { Request req = unit.get(Request.class); expect(req.set(keys.get(0), unit.get(EntityManager.class))).andReturn(req); TrxResponse rsp = unit.mockConstructor(TrxResponse.class, new Class[]{Response.class, EntityManager.class }, unit.get(Response.class), unit.get(EntityManager.class)); expect(rsp.begin()).andReturn(rsp); rsp.done(); expectLastCall().andThrow(new HibernateException("intentional err")); Route.Chain chain = unit.get(Route.Chain.class); chain.next(req, rsp); }) .expect(unit -> { SessionFactory sf = unit.mock(SessionFactory.class); Session session = unit.mock(Session.class); session.setFlushMode(FlushMode.AUTO); unit.mockStatic(ManagedSessionContext.class); expect(ManagedSessionContext.bind(session)).andReturn(session); expect(ManagedSessionContext.unbind(sf)).andReturn(session); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); HibernateEntityManagerFactory hemf = unit.get(HibernateEntityManagerFactory.class); expect(hemf.getSessionFactory()).andReturn(sf); expect(hemf.createEntityManager()).andReturn(em); }) .run(unit -> { new OpenSessionInView(unit.get(HibernateEntityManagerFactory.class), keys) .handle( unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @SuppressWarnings("unchecked") @Test(expected = HibernateException.class) public void shouldAlwaysUnbindSession3() throws Exception { List<Key<EntityManager>> keys = Lists.newArrayList(Key.get(EntityManager.class)); new MockUnit(HibernateEntityManagerFactory.class, Request.class, Response.class, Route.Chain.class, EntityManager.class) .expect(unit -> { Request req = unit.get(Request.class); expect(req.set(keys.get(0), unit.get(EntityManager.class))).andReturn(req); TrxResponse rsp = unit.mockConstructor(TrxResponse.class, new Class[]{Response.class, EntityManager.class }, unit.get(Response.class), unit.get(EntityManager.class)); expect(rsp.begin()).andReturn(rsp); rsp.done(); Route.Chain chain = unit.get(Route.Chain.class); chain.next(req, rsp); }) .expect(unit -> { SessionFactory sf = unit.mock(SessionFactory.class); Session session = unit.mock(Session.class); session.setFlushMode(FlushMode.AUTO); unit.mockStatic(ManagedSessionContext.class); expect(ManagedSessionContext.bind(session)).andReturn(session); expect(ManagedSessionContext.unbind(sf)) .andThrow(new HibernateException("intentional err")); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); HibernateEntityManagerFactory hemf = unit.get(HibernateEntityManagerFactory.class); expect(hemf.getSessionFactory()).andReturn(sf); expect(hemf.createEntityManager()).andReturn(em); }) .run(unit -> { new OpenSessionInView(unit.get(HibernateEntityManagerFactory.class), keys) .handle( unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } }