package org.springframework.roo.addon.layers.repository.jpa.addon; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.springframework.roo.classpath.customdata.CustomDataKeys.FIND_ALL_METHOD; import static org.springframework.roo.classpath.customdata.CustomDataKeys.FLUSH_METHOD; import java.util.Arrays; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.roo.addon.layers.repository.jpa.addon.RepositoryJpaLayerProvider; import org.springframework.roo.addon.layers.repository.jpa.addon.RepositoryJpaLocator; import org.springframework.roo.classpath.customdata.tagkeys.MethodMetadataCustomDataKey; import org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails; import org.springframework.roo.classpath.details.FieldMetadata; import org.springframework.roo.classpath.layers.MemberTypeAdditions; import org.springframework.roo.classpath.layers.MethodParameter; import org.springframework.roo.classpath.persistence.PersistenceMemberLocator; import org.springframework.roo.model.JavaType; /** * Unit test of {@link RepositoryJpaLayerProvider} * * @author Andrew Swan * @author Stefan Schmidt * @since 1.2.0 */ public class RepositoryJpaLayerProviderTest { private static final String CALLER_MID = "MID:anything#com.example.PetService"; // Fixture private RepositoryJpaLayerProvider layerProvider; @Mock private JavaType mockIdType; @Mock private RepositoryJpaLocator mockRepositoryLocator; @Mock private JavaType mockTargetEntity; /** * Asserts that the {@link RepositoryJpaLayerProvider} generates the * expected call for the given method with the given parameters * * @param expectedMethodCall * @param methodKey * @param callerParameters */ private void assertMethodCall(final String expectedMethodCall, final MethodMetadataCustomDataKey methodKey, final MethodParameter... callerParameters) { // Set up setUpMockRepository(); // Invoke final MemberTypeAdditions additions = layerProvider.getMemberTypeAdditions(CALLER_MID, methodKey.name(), mockTargetEntity, mockIdType, callerParameters); // Check assertEquals(expectedMethodCall, additions.getMethodCall()); } @Before public void setUp() { MockitoAnnotations.initMocks(this); layerProvider = new RepositoryJpaLayerProvider(); layerProvider.setRepositoryLocator(mockRepositoryLocator); } /** * Sets up the mock {@link RepositoryJpaLocator} and * {@link PersistenceMemberLocator} to return a mock repository for our test * entity. */ private void setUpMockRepository() { final ClassOrInterfaceTypeDetails mockRepositoryDetails = mock(ClassOrInterfaceTypeDetails.class); final FieldMetadata mockFieldMetadata = mock(FieldMetadata.class); final JavaType mockRepositoryType = mock(JavaType.class); when(mockRepositoryType.getSimpleTypeName()).thenReturn("ClinicRepo"); when(mockIdType.getFullyQualifiedTypeName()).thenReturn(Long.class.getName()); when(mockRepositoryDetails.getName()).thenReturn(mockRepositoryType); when(mockFieldMetadata.getFieldType()).thenReturn(mockIdType); when(mockRepositoryLocator.getRepositories(mockTargetEntity)).thenReturn( Arrays.asList(mockRepositoryDetails)); } @Test public void testGetAdditionsForNonRepositoryLayerMethod() { // Invoke final MemberTypeAdditions additions = layerProvider.getMemberTypeAdditions(CALLER_MID, "bogus", mockTargetEntity, mockIdType); // Check assertNull(additions); } @Test public void testGetAdditionsWhenNoRepositoriesExist() { // Invoke final MemberTypeAdditions additions = layerProvider.getMemberTypeAdditions(CALLER_MID, FIND_ALL_METHOD.name(), mockTargetEntity, mockIdType); // Check assertNull(additions); } @Test public void testGetFindAllAdditions() { assertMethodCall("clinicRepo.findAll()", FIND_ALL_METHOD); } @Test public void testGetFlushAdditions() { final MethodParameter entityParameter = new MethodParameter(mockTargetEntity, "anything"); assertMethodCall("clinicRepo.flush()", FLUSH_METHOD, entityParameter); } }