package org.jooby.internal.hbm; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.persistence.RollbackException; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Session; import org.jooby.Response; import org.jooby.Result; import org.jooby.Results; import org.jooby.test.MockUnit; import org.junit.Test; public class TrxResponseTest { @Test public void defaults() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); session.setDefaultReadOnly(true); session.setDefaultReadOnly(false); session.setFlushMode(FlushMode.MANUAL); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); expect(trx.isActive()).andReturn(false); trx.commit(); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); rotrx.commit(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test public void doneNoActive() throws Exception { new MockUnit(Response.class, EntityManager.class) .expect(unit -> { Session session = unit.mock(Session.class); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(false); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); expect(em.getTransaction()).andReturn(trx); em.close(); }) .run(unit -> { TrxResponse trx = new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)); trx.begin(); trx.done(); }); } @Test public void doneActive() throws Exception { new MockUnit(Response.class, EntityManager.class) .expect(unit -> { Session session = unit.mock(Session.class); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.commit(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); expect(em.getTransaction()).andReturn(trx); em.close(); }) .run(unit -> { TrxResponse trx = new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)); trx.begin(); trx.done(); }); } @Test public void doneCommitWithErr() throws Exception { new MockUnit(Response.class, EntityManager.class) .expect(unit -> { Session session = unit.mock(Session.class); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.commit(); expectLastCall().andThrow(new RollbackException("intentional err")); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); expect(em.getTransaction()).andReturn(trx); em.close(); }) .run(unit -> { TrxResponse trx = new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)); trx.begin(); trx.done(); }); } @Test(expected = HibernateException.class) public void doneRollback() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); expectLastCall().andThrow(new HibernateException("flush")); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.rollback(); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); rotrx.commit(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test public void doneCommit() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); session.setDefaultReadOnly(true); session.setDefaultReadOnly(false); session.setFlushMode(FlushMode.MANUAL); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.commit(); expect(trx.isActive()).andReturn(true); trx.commit(); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); rotrx.commit(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test(expected = HibernateException.class) public void silentReadOnlyTrx() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); session.setDefaultReadOnly(true); session.setDefaultReadOnly(false); session.setFlushMode(FlushMode.MANUAL); expectLastCall().andThrow(new HibernateException("intentional err")); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.commit(); expect(trx.isActive()).andReturn(false); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test(expected = HibernateException.class) public void silentReadOnlyTrx2() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); session.setDefaultReadOnly(true); session.setDefaultReadOnly(false); session.setFlushMode(FlushMode.MANUAL); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.commit(); expect(trx.isActive()).andReturn(false); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); expectLastCall().andThrow(new HibernateException("intentional err")); expect(rotrx.isActive()).andReturn(true); rotrx.rollback(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test(expected = HibernateException.class) public void silentReadOnlyTrx3() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); session.setDefaultReadOnly(true); session.setDefaultReadOnly(false); session.setFlushMode(FlushMode.MANUAL); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(true); trx.commit(); expect(trx.isActive()).andReturn(false); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); expectLastCall().andThrow(new HibernateException("intentional err")); expect(rotrx.isActive()).andReturn(false); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test public void defaultsNoActiveTrx() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.setDefaultReadOnly(true); session.setDefaultReadOnly(false); session.setFlushMode(FlushMode.MANUAL); session.flush(); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andReturn(false); expect(trx.isActive()).andReturn(false); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); rotrx.commit(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } @Test(expected = HibernateException.class) public void defaultsRollbackActiveTrx() throws Exception { Result result = Results.ok(); new MockUnit(Response.class, EntityManager.class) .expect(unit -> { unit.get(Response.class).send((Object) result); }) .expect(unit -> { Session session = unit.mock(Session.class); session.flush(); EntityTransaction trx = unit.mock(EntityTransaction.class); trx.begin(); expect(trx.isActive()).andThrow(new HibernateException("intentional err")); expect(trx.isActive()).andReturn(true); trx.rollback(); EntityTransaction rotrx = unit.mock(EntityTransaction.class); rotrx.begin(); rotrx.commit(); EntityManager em = unit.get(EntityManager.class); expect(em.getDelegate()).andReturn(session); em.close(); expect(em.getTransaction()).andReturn(trx); expect(em.getTransaction()).andReturn(rotrx); }) .run(unit -> { new TrxResponse(unit.get(Response.class), unit.get(EntityManager.class)) .begin() .send(result); }); } }