package org.jboss.jca.adapters.sap.cci.impl; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import javax.naming.NamingException; import javax.naming.Reference; import javax.resource.ResourceException; import javax.resource.cci.RecordFactory; import javax.resource.cci.ResourceAdapterMetaData; import javax.resource.spi.ConnectionManager; import org.jboss.jca.adapters.sap.cci.Connection; import org.jboss.jca.adapters.sap.cci.ConnectionSpec; import org.jboss.jca.adapters.sap.spi.ConnectionRequestInfo; import org.jboss.jca.adapters.sap.spi.ManagedConnectionFactory; import org.junit.Before; import org.junit.Test; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoException; import com.sap.conn.jco.JCoRepository; public class TestConnectionFactoryImpl { private ManagedConnectionFactory mockManagedConnectionFactory; private ConnectionManager mockConnectionManager; private ConnectionFactoryImpl defaultConnectionFactory; private ConnectionFactoryImpl connectionFactory; @Before public void setUp() throws Exception { // Given mockManagedConnectionFactory = mock(ManagedConnectionFactory.class); mockConnectionManager = mock(ConnectionManager.class); defaultConnectionFactory = new ConnectionFactoryImpl(); connectionFactory = new ConnectionFactoryImpl(mockManagedConnectionFactory, mockConnectionManager); } @Test public void testGetConnection() throws ResourceException { // Given Connection mockConnection = mock(ConnectionImpl.class); when(mockConnectionManager.allocateConnection(mockManagedConnectionFactory, null)).thenReturn(mockConnection); // When Connection returnedConnection = connectionFactory.getConnection(); // Then assertThat("ConnectionFactoryImpl.getConnection() returned null value:", returnedConnection, notNullValue()); assertThat("ConnectionFactoryImpl.getConnection() returned different ConnectionImpl instance than returned by ConnectionManager.allocateConnection(): ", returnedConnection, sameInstance(mockConnection)); verify(mockConnectionManager).allocateConnection(mockManagedConnectionFactory, null); } @Test public void testGetConnectionWithConnectionSpec() throws ResourceException { // Given Connection mockConnection = mock(ConnectionImpl.class); ConnectionSpec mockConnectionSpec = mock(ConnectionSpec.class); when(mockConnectionManager.allocateConnection(eq(mockManagedConnectionFactory), any(ConnectionRequestInfo.class))).thenReturn(mockConnection); // When Connection returnedConnection = connectionFactory.getConnection(mockConnectionSpec); // Then assertThat("ConnectionFactoryImpl.getConnection(ConnectionSpec) returned null value", returnedConnection, notNullValue()); assertThat("ConnectionFactoryImpl.getConnection(ConnectionSpec) returned different ConnectionImpl instance than returned by ConnectionManager.allocateConnection()", returnedConnection, sameInstance(mockConnection)); } @Test ( expected = ResourceException.class) public void testGetConnectionWithInvalidConnectionSpec() throws ResourceException { // Given Connection mockConnection = mock(ConnectionImpl.class); javax.resource.cci.ConnectionSpec mockConnectionSpec = mock(javax.resource.cci.ConnectionSpec.class); when(mockConnectionManager.allocateConnection(eq(mockManagedConnectionFactory), any(ConnectionRequestInfo.class))).thenReturn(mockConnection); // When connectionFactory.getConnection(mockConnectionSpec); // Then fail("ConnectionFactoryImpl.getConnection(ConnectionSpec) fails to throw ResourceException when passed invalid type of ConnectionSpec"); } @Test public void testGetMetaData() throws ResourceException { // When ResourceAdapterMetaData returnedResourceAdapterMetaData = defaultConnectionFactory.getMetaData(); // Then assertNotNull("ConnectionFactoryImpl.getMetaData() returned null ResourceAdapterMetaData", returnedResourceAdapterMetaData); } @Test public void testGetRecordFactory() throws ResourceException, JCoException { // Given ConnectionImpl mockConnection = mock(ConnectionImpl.class); JCoDestination mockDestination = mock(JCoDestination.class); JCoRepository mockRepository = mock(JCoRepository.class); when(mockConnectionManager.allocateConnection(mockManagedConnectionFactory, null)).thenReturn(mockConnection); when(mockConnection.getDestination()).thenReturn(mockDestination); when(mockDestination.getRepository()).thenReturn(mockRepository); // When RecordFactory returnedRecordFactory = connectionFactory.getRecordFactory(); // Then assertThat("ConnectionFactoryImpl.getRecordFactory() returned null RecordFactory", returnedRecordFactory, notNullValue()); } @Test public void testGetReference() throws NamingException { // Given Reference mockReference = mock(Reference.class); defaultConnectionFactory.setReference(mockReference); // When Reference returnedReference = defaultConnectionFactory.getReference(); // Then assertThat("ConnectionFactoryImpl.getReference() returned different Reference instance than was set", returnedReference, sameInstance(mockReference)); } @Test(expected = NamingException.class) public void testGetReferenceThrowsNamingException() throws NamingException { // When defaultConnectionFactory.getReference(); // Then fail("ConnectionFactoryImpl.getReference() fails to throw NamingException when attempting to return null reference"); } }