package org.springframework.roo.addon.jpa.activerecord;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.CLEAR_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.COUNT_ALL_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.FIND_ALL_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.FIND_ENTRIES_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.FIND_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.FLUSH_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.MERGE_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.PERSIST_METHOD;
import static org.springframework.roo.classpath.customdata.CustomDataKeys.REMOVE_METHOD;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.roo.addon.plural.PluralMetadata;
import org.springframework.roo.classpath.TypeLocationService;
import org.springframework.roo.classpath.customdata.tagkeys.MethodMetadataCustomDataKey;
import org.springframework.roo.classpath.layers.MemberTypeAdditions;
import org.springframework.roo.metadata.MetadataService;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.project.Path;
/**
* Unit test of {@link EntityLayerProvider}
*
* @author Andrew Swan
* @since 1.2.0
*/
public class EntityLayerProviderTest {
private static final String CALLER_MID = "MID:caller#com.example.MyService";
// Maps the supported entity methods to their test parameter names
private static final Map<MethodMetadataCustomDataKey, List<String>> METHODS = new HashMap<MethodMetadataCustomDataKey, List<String>>();
static {
METHODS.put(CLEAR_METHOD, Collections.<String> emptyList());
METHODS.put(COUNT_ALL_METHOD, Collections.<String> emptyList());
METHODS.put(FIND_ALL_METHOD, Collections.<String> emptyList());
METHODS.put(FIND_ENTRIES_METHOD, Arrays.asList("x", "y"));
METHODS.put(FIND_METHOD, Arrays.asList("id"));
METHODS.put(FLUSH_METHOD, Collections.<String> emptyList());
METHODS.put(MERGE_METHOD, Collections.<String> emptyList());
METHODS.put(PERSIST_METHOD, Collections.<String> emptyList());
METHODS.put(REMOVE_METHOD, Collections.<String> emptyList());
}
// Fixture
private EntityLayerProvider layerProvider;
@Mock private JpaCrudAnnotationValues mockAnnotationValues;
@Mock private JavaType mockIdType;
@Mock private JpaActiveRecordMetadataProvider mockJpaActiveRecordMetadataProvider;
@Mock private MetadataService mockMetadataService;
@Mock private PluralMetadata mockPluralMetadata;
@Mock private JavaType mockTargetEntity;
@Mock private TypeLocationService mockTypeLocationService;
private String pluralId;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mockTargetEntity.getFullyQualifiedTypeName()).thenReturn(
"com.example.Pizza");
when(mockIdType.getFullyQualifiedTypeName()).thenReturn(
Long.class.getName());
when(mockTypeLocationService.getTypePath(mockTargetEntity)).thenReturn(
Path.SRC_MAIN_JAVA.getModulePathId(""));
pluralId = PluralMetadata.createIdentifier(mockTargetEntity,
Path.SRC_MAIN_JAVA.getModulePathId(""));
layerProvider = new EntityLayerProvider();
layerProvider.typeLocationService = mockTypeLocationService;
layerProvider
.setJpaActiveRecordMetadataProvider(mockJpaActiveRecordMetadataProvider);
layerProvider.setMetadataService(mockMetadataService);
}
private void setUpMockAnnotationValues() {
when(
mockJpaActiveRecordMetadataProvider
.getAnnotationValues(mockTargetEntity)).thenReturn(
mockAnnotationValues);
}
private void setUpPlural(final String plural) {
when(mockMetadataService.get(pluralId)).thenReturn(mockPluralMetadata);
when(mockPluralMetadata.getPlural()).thenReturn(plural);
}
@Test
public void testGetAdditionsForBogusMethod() {
// Set up
setUpMockAnnotationValues();
setUpPlural("anything");
// Invoke
final MemberTypeAdditions additions = layerProvider
.getMemberTypeAdditions(CALLER_MID, "bogus", mockTargetEntity,
mockIdType);
// Check
assertNull(additions);
}
@Test
public void testGetAdditionsForMethodAnnotatedWithEmptyName() {
// Set up
setUpMockAnnotationValues();
when(mockAnnotationValues.getFindAllMethod()).thenReturn("");
setUpPlural("anything");
// Invoke
final MemberTypeAdditions additions = layerProvider
.getMemberTypeAdditions(CALLER_MID, FIND_ALL_METHOD.name(),
mockTargetEntity, mockIdType);
// Check
assertNull(additions);
}
@Test
public void testGetAdditionsForMethodAnnotatedWithNonEmptyName() {
// Set up
setUpMockAnnotationValues();
when(mockAnnotationValues.getFindAllMethod()).thenReturn("getAll");
setUpPlural("Pizzas");
// Invoke
final MemberTypeAdditions additions = layerProvider
.getMemberTypeAdditions(CALLER_MID, FIND_ALL_METHOD.name(),
mockTargetEntity, mockIdType);
// Check
assertEquals("getAllPizzas", additions.getMethodName());
}
@Test
public void testGetAdditionsWhenEntityAnnotationValuesNotAvailable() {
// Set up
when(
mockJpaActiveRecordMetadataProvider
.getAnnotationValues(mockTargetEntity))
.thenReturn(null);
// Invoke
final MemberTypeAdditions additions = layerProvider
.getMemberTypeAdditions(CALLER_MID, FIND_ALL_METHOD.name(),
mockTargetEntity, mockIdType);
// Check
assertNull(additions);
}
@Test
public void testGetAdditionsWhenGovernorPluralIsEmpty() {
// Set up
setUpMockAnnotationValues();
setUpPlural("");
// Invoke
final MemberTypeAdditions additions = layerProvider
.getMemberTypeAdditions(CALLER_MID, FIND_ALL_METHOD.name(),
mockTargetEntity, mockIdType);
// Check
assertNull(additions);
}
@Test
public void testGetAdditionsWhenGovernorPluralMetadataIsNull() {
setUpMockAnnotationValues();
when(mockMetadataService.get(pluralId)).thenReturn(null);
// Invoke
final MemberTypeAdditions additions = layerProvider
.getMemberTypeAdditions(CALLER_MID, FIND_ALL_METHOD.name(),
mockTargetEntity, mockIdType);
// Check
assertNull(additions);
}
}