package org.springframework.roo.addon.jpa.activerecord; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.roo.classpath.layers.MethodParameter; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; /** * Unit test of the {@link EntityLayerMethod} enum * * @author Andrew Swan * @since 1.2.0 */ public class EntityLayerMethodTest { private static final List<JavaType> NO_TYPES = Collections .<JavaType> emptyList(); private static final String PLURAL = "People"; @Mock private JpaCrudAnnotationValues mockAnnotationValues; @Mock private JavaType mockIdType; @Mock private JavaSymbolName mockParameterName; // Fixture @Mock private JavaType mockTargetEntity; private void assertMethodCall(final String expectedMethodCall, final EntityLayerMethod method, final String... parameterNames) { final List<MethodParameter> parameters = new ArrayList<MethodParameter>(); for (final String parameterName : parameterNames) { final JavaSymbolName mockSymbol = mock(JavaSymbolName.class); when(mockSymbol.getSymbolName()).thenReturn(parameterName); // We can use any parameter type here, as it's ignored in production parameters.add(new MethodParameter(JavaType.OBJECT, mockSymbol)); } // Invoke and check assertEquals(expectedMethodCall, method.getCall(mockAnnotationValues, mockTargetEntity, PLURAL, parameters)); } @Before public void setUp() { MockitoAnnotations.initMocks(this); when(mockParameterName.getSymbolName()).thenReturn("person"); when(mockTargetEntity.getFullyQualifiedTypeName()).thenReturn( "com.example.Person"); when(mockTargetEntity.getSimpleTypeName()).thenReturn("Person"); when(mockIdType.getFullyQualifiedTypeName()).thenReturn( Long.class.getName()); } @Test public void testCallClearMethod() { // Set up when(mockAnnotationValues.getClearMethod()).thenReturn("erase"); // Invoke and check assertMethodCall("Person.erase()", EntityLayerMethod.CLEAR); } @Test public void testCallCountAllMethod() { // Set up when(mockAnnotationValues.getCountMethod()).thenReturn("total"); // Invoke and check assertMethodCall("Person.totalPeople()", EntityLayerMethod.COUNT_ALL); } @Test public void testCallFindAllMethod() { // Set up when(mockAnnotationValues.getFindAllMethod()).thenReturn("seekAll"); // Invoke and check assertMethodCall("Person.seekAllPeople()", EntityLayerMethod.FIND_ALL); } @Test public void testCallFindEntriesMethod() { // Set up when(mockAnnotationValues.getFindEntriesMethod()).thenReturn("lookFor"); // Invoke and check assertMethodCall("Person.lookForPersonEntries(x, y)", EntityLayerMethod.FIND_ENTRIES, "x", "y"); } @Test public void testCallFlushMethod() { // Set up when(mockAnnotationValues.getFlushMethod()).thenReturn("bloosh"); // Invoke and check assertMethodCall("person.bloosh()", EntityLayerMethod.FLUSH, "person"); } @Test public void testCallMergeMethod() { // Set up when(mockAnnotationValues.getMergeMethod()).thenReturn("blend"); // Invoke and check assertMethodCall("person.blend()", EntityLayerMethod.MERGE, "person"); } @Test public void testCallPersistMethod() { // Set up when(mockAnnotationValues.getPersistMethod()).thenReturn("store"); // Invoke and check assertMethodCall("person.store()", EntityLayerMethod.PERSIST, "person"); } @Test public void testCallRemoveMethod() { // Set up when(mockAnnotationValues.getRemoveMethod()).thenReturn("trash"); // Invoke and check assertMethodCall("person.trash()", EntityLayerMethod.REMOVE, "person"); } @Test public void testParameterTypes() { for (final EntityLayerMethod method : EntityLayerMethod.values()) { final List<JavaType> parameterTypes = method.getParameterTypes( mockTargetEntity, mockIdType); if (method.isStatic()) { // All we can check is that it's not null assertNotNull(method + " method has null parameter types", parameterTypes); } else { assertEquals(Arrays.asList(mockTargetEntity), parameterTypes); } } } @Test public void testValueOfBogusMethodId() { assertNull(EntityLayerMethod.valueOf("foo", NO_TYPES, mockTargetEntity, mockIdType)); } }