/**
*
*/
package org.minnal.instrument;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import javax.persistence.Entity;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import org.minnal.instrument.entity.AggregateRoot;
import org.minnal.instrument.resource.ResourceEnhancer;
import org.minnal.instrument.resource.metadata.ResourceMetaData;
import org.minnal.instrument.resource.metadata.ResourceMetaDataProvider;
import org.minnal.utils.scanner.Scanner;
import org.minnal.utils.scanner.Scanner.Listener;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
/**
* @author ganeshs
*
*/
public class ApplicationEnhancerTest {
private Application application;
private ResourceMetaData rc1;
private ResourceMetaData rc2;
private ApplicationEnhancer enhancer;
private NamingStrategy namingStrategy;
@BeforeMethod
public void setup() {
application = mock(Application.class);
rc1 = ResourceMetaDataProvider.instance().getResourceMetaData(DummyResource.class);
rc2 = ResourceMetaDataProvider.instance().getResourceMetaData(DummyResource1.class);
when(application.getClasses()).thenReturn(Sets.newHashSet(DummyResource.class, DummyResource1.class));
namingStrategy = new UnderscoreNamingStrategy();
enhancer = spy(new ApplicationEnhancer(application, namingStrategy, new String[]{"org.minnal.instrument"}, new String[]{"org.minnal.instrument"}));
}
@Test
public void shouldEnhanceResourceClass() {
doReturn(Lists.newArrayList(DummyModel.class)).when(enhancer).scanEntities();
doReturn(Lists.newArrayList(DummyResource1.class)).when(enhancer).scanResources();
ResourceEnhancer resEnhancer1 = mock(ResourceEnhancer.class);
doReturn(resEnhancer1).when(enhancer).createEnhancer(null, DummyModel.class);
enhancer.enhance();
verify(resEnhancer1).enhance();
}
@Test
public void shouldEnhanceResourceClassIgnoringEntityClassWithSamePath() {
doReturn(Lists.newArrayList(DummyModel.class)).when(enhancer).scanEntities();
doReturn(Lists.newArrayList(DummyResource.class)).when(enhancer).scanResources();
ResourceEnhancer resEnhancer1 = mock(ResourceEnhancer.class);
doReturn(resEnhancer1).when(enhancer).createEnhancer(rc1, DummyModel.class);
enhancer.enhance();
verify(resEnhancer1).enhance();
}
@Test
public void shouldEnhanceResourceClassIgnoringResourceClassNotMatchingEntityPath() {
doReturn(Lists.newArrayList(DummyModel.class)).when(enhancer).scanEntities();
doReturn(Lists.newArrayList(DummyResource1.class)).when(enhancer).scanResources();
ResourceEnhancer resEnhancer1 = mock(ResourceEnhancer.class);
ResourceEnhancer resEnhancer2 = mock(ResourceEnhancer.class);
doReturn(resEnhancer1).when(enhancer).createEnhancer(null, DummyModel.class);
doReturn(resEnhancer2).when(enhancer).createEnhancer(rc2, null);
enhancer.enhance();
verify(resEnhancer1).enhance();
verify(resEnhancer2, never()).enhance();
}
@Test
public void shouldScanClasses() {
Scanner<Class<?>> scanner = mock(Scanner.class);
enhancer.scanClasses(scanner);
verify(scanner).scan(any(Listener.class));
}
@Path("/dummy_models")
class DummyResource {
@GET
public void get() {}
}
@Path("/dummy1")
class DummyResource1 {
@GET
public void get() {}
}
@Path("/dummy2")
class DummyResource2 {
@GET
public void get() {}
}
class DummyResource3 {
@GET
public void get() {}
}
@Entity
@AggregateRoot
class DummyModel {
}
static class TestNamingStrategy extends UnderscoreNamingStrategy {
}
}