package io.dropwizard.hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.query.NativeQuery; import org.junit.Test; import org.mockito.InOrder; import static org.assertj.core.api.Assertions.assertThat; import static org.hibernate.resource.transaction.spi.TransactionStatus.ACTIVE; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @SuppressWarnings("HibernateResourceOpenedButNotSafelyClosed") public class SessionFactoryHealthCheckTest { private final SessionFactory factory = mock(SessionFactory.class); private final SessionFactoryHealthCheck healthCheck = new SessionFactoryHealthCheck(factory, "SELECT 1"); @Test public void hasASessionFactory() throws Exception { assertThat(healthCheck.getSessionFactory()) .isEqualTo(factory); } @Test public void hasAValidationQuery() throws Exception { assertThat(healthCheck.getValidationQuery()) .isEqualTo("SELECT 1"); } @Test public void isHealthyIfNoExceptionIsThrown() throws Exception { final Session session = mock(Session.class); when(factory.openSession()).thenReturn(session); final Transaction transaction = mock(Transaction.class); when(session.beginTransaction()).thenReturn(transaction); final NativeQuery query = mock(NativeQuery.class); when(session.createNativeQuery(anyString())).thenReturn(query); assertThat(healthCheck.execute().isHealthy()).isTrue(); final InOrder inOrder = inOrder(factory, session, transaction, query); inOrder.verify(factory).openSession(); inOrder.verify(session).beginTransaction(); inOrder.verify(session).createNativeQuery("SELECT 1"); inOrder.verify(query).list(); inOrder.verify(transaction).commit(); inOrder.verify(session).close(); } @Test public void isUnhealthyIfAnExceptionIsThrown() throws Exception { final Session session = mock(Session.class); when(factory.openSession()).thenReturn(session); final Transaction transaction = mock(Transaction.class); when(session.beginTransaction()).thenReturn(transaction); when(transaction.getStatus()).thenReturn(ACTIVE); final NativeQuery query = mock(NativeQuery.class); when(session.createNativeQuery(anyString())).thenReturn(query); when(query.list()).thenThrow(new HibernateException("OH NOE")); assertThat(healthCheck.execute().isHealthy()) .isFalse(); final InOrder inOrder = inOrder(factory, session, transaction, query); inOrder.verify(factory).openSession(); inOrder.verify(session).beginTransaction(); inOrder.verify(session).createNativeQuery("SELECT 1"); inOrder.verify(query).list(); inOrder.verify(transaction).rollback(); inOrder.verify(session).close(); verify(transaction, never()).commit(); } }