/**
* Copyright Alex Objelean
*/
package ro.isdc.wro.model.group.processor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static ro.isdc.wro.config.Context.set;
import java.io.IOException;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import ro.isdc.wro.cache.CacheStrategy;
import ro.isdc.wro.cache.factory.CacheKeyFactory;
import ro.isdc.wro.config.Context;
import ro.isdc.wro.config.ReadOnlyContext;
import ro.isdc.wro.config.jmx.WroConfiguration;
import ro.isdc.wro.config.metadata.MetaDataFactory;
import ro.isdc.wro.manager.ResourceBundleProcessor;
import ro.isdc.wro.manager.callback.LifecycleCallbackRegistry;
import ro.isdc.wro.manager.factory.BaseWroManagerFactory;
import ro.isdc.wro.manager.factory.WroManagerFactory;
import ro.isdc.wro.model.factory.WroModelFactory;
import ro.isdc.wro.model.group.GroupExtractor;
import ro.isdc.wro.model.group.Inject;
import ro.isdc.wro.model.resource.locator.factory.DefaultUriLocatorFactory;
import ro.isdc.wro.model.resource.locator.factory.UriLocatorFactory;
import ro.isdc.wro.model.resource.locator.support.DispatcherStreamLocator;
import ro.isdc.wro.model.resource.processor.factory.ProcessorsFactory;
import ro.isdc.wro.model.resource.support.change.ResourceWatcher;
import ro.isdc.wro.model.resource.support.hash.HashStrategy;
import ro.isdc.wro.model.resource.support.naming.NamingStrategy;
import ro.isdc.wro.util.WroUtil;
/**
* @author Alex Objelean
* @created 8 Jan 2012
*/
public class TestInjectorBuilder {
@Mock
private HttpServletRequest mockRequest;
@Mock
private HttpServletResponse mockResponse;
@Mock
private FilterConfig mockFilterConfig;
@Mock
private ServletContext mockServletContext;
@BeforeClass
public static void onBeforeClass() {
assertEquals(0, Context.countActive());
}
@AfterClass
public static void onAfterClass() {
assertEquals(0, Context.countActive());
}
@Before
public void setUp() {
initMocks(this);
when(mockRequest.getRequestURL()).thenReturn(new StringBuffer(""));
when(mockRequest.getServletPath()).thenReturn("");
when(mockFilterConfig.getServletContext()).thenReturn(mockServletContext);
when(mockFilterConfig.getServletContext()).thenReturn(mockServletContext);
when(mockServletContext.getResourceAsStream(Mockito.anyString())).thenReturn(null);
set(Context.webContext(mockRequest, mockResponse, mockFilterConfig));
}
@Test(expected = NullPointerException.class)
public void cannotAcceptNullWroManager() {
new InjectorBuilder(null);
}
@Test(expected = NullPointerException.class)
public void cannotAcceptWhenSettingNullWroManager() {
new InjectorBuilder(null);
}
@Test
public void shouldBuildInjectorWithValidWroManager() {
final Injector injector = InjectorBuilder.create(new BaseWroManagerFactory()).build();
assertNotNull(injector);
final Sample sample = new Sample();
injector.inject(sample);
assertNotNull(sample.namingStrategy);
assertNotNull(sample.preProcessorExecutor);
assertNotNull(sample.processorsFactory);
assertNotNull(sample.uriLocatorFactory);
assertNotNull(sample.callbackRegistry);
assertSame(injector, sample.injector);
assertNotNull(sample.groupsProcessor);
assertNotNull(sample.metaDataFactory);
assertNotNull(sample.bundleProcessor);
assertNotNull(sample.resourceWatcher);
assertNotNull(sample.dispatcherLocator);
}
@Test
public void shouldBuildValidInjectorWithBaseWroManagerFactory() {
final Injector injector = InjectorBuilder.create(new BaseWroManagerFactory()).build();
assertNotNull(injector);
final Sample sample = new Sample();
injector.inject(sample);
assertNotNull(sample.namingStrategy);
assertNotNull(sample.preProcessorExecutor);
assertNotNull(sample.processorsFactory);
assertNotNull(sample.uriLocatorFactory);
assertNotNull(sample.callbackRegistry);
assertSame(injector, sample.injector);
assertNotNull(sample.groupsProcessor);
assertNotNull(sample.metaDataFactory);
assertNotNull(sample.cacheKeyFactory);
assertNotNull(sample.bundleProcessor);
assertNotNull(sample.dispatcherLocator);
}
@Test
public void shouldBuildValidInjectorWithFewFieldsSet()
throws Exception {
final NamingStrategy mockNamingStrategy = mock(NamingStrategy.class);
final ProcessorsFactory mockProcessorsFactory = mock(ProcessorsFactory.class);
final UriLocatorFactory mockLocatorFactory = mock(UriLocatorFactory.class);
final MetaDataFactory mockMetaDataFactory = Mockito.mock(MetaDataFactory.class);
final BaseWroManagerFactory managerFactroy = new BaseWroManagerFactory();
managerFactroy.setNamingStrategy(mockNamingStrategy);
managerFactroy.setProcessorsFactory(mockProcessorsFactory);
managerFactroy.setUriLocatorFactory(mockLocatorFactory);
managerFactroy.setMetaDataFactory(mockMetaDataFactory);
final Injector injector = InjectorBuilder.create(managerFactroy).build();
assertNotNull(injector);
final Sample sample = new Sample();
injector.inject(sample);
assertNotNull(sample.preProcessorExecutor);
sample.namingStrategy.rename("", WroUtil.EMPTY_STREAM);
verify(mockNamingStrategy).rename("", WroUtil.EMPTY_STREAM);
sample.processorsFactory.getPostProcessors();
verify(mockProcessorsFactory).getPostProcessors();
sample.uriLocatorFactory.getInstance("");
verify(mockLocatorFactory).getInstance("");
sample.metaDataFactory.create();
verify(mockMetaDataFactory).create();
assertNotNull(sample.callbackRegistry);
assertSame(injector, sample.injector);
assertNotNull(sample.groupsProcessor);
assertNotNull(sample.modelFactory);
assertNotNull(sample.groupExtractor);
assertNotNull(sample.cacheStrategy);
assertNotNull(sample.hashBuilder);
assertNotNull(sample.readOnlyContext);
assertNotNull(sample.metaDataFactory);
assertNotNull(sample.cacheKeyFactory);
assertNotNull(sample.bundleProcessor);
assertNotNull(sample.dispatcherLocator);
}
@Test(expected = IOException.class)
public void shouldInjectEachLocatorProvidedByLocatorFactory()
throws Exception {
final UriLocatorFactory uriLocatorFactory = new DefaultUriLocatorFactory();
final WroManagerFactory managerFactory = new BaseWroManagerFactory().setUriLocatorFactory(uriLocatorFactory);
final Injector injector = InjectorBuilder.create(managerFactory).build();
final Sample sample = new Sample();
injector.inject(sample);
// this will throw NullPointerException if the uriLocator is not injected.
sample.uriLocatorFactory.locate("/path/to/servletContext/resource.js");
}
@Test
public void shouldOverrideTheDispatcherLocatorTimeoutWithConfiguredTimeout() {
final Sample sample = new Sample();
final DispatcherStreamLocator dispatcherLocator = new DispatcherStreamLocator();
sample.dispatcherLocator = dispatcherLocator;
assertEquals(WroConfiguration.DEFAULT_CONNECTION_TIMEOUT, sample.dispatcherLocator.getTimeout());
final int timeout = 5000;
Context.get().getConfig().setConnectionTimeout(timeout);
final Injector injector = createDefaultInjector();
injector.inject(sample);
assertEquals(timeout, sample.dispatcherLocator.getTimeout());
}
private Injector createDefaultInjector() {
return new InjectorBuilder(new BaseWroManagerFactory()).build();
}
@After
public void tearDown() {
Context.unset();
}
private static class Sample {
@Inject
UriLocatorFactory uriLocatorFactory;
@Inject
ProcessorsFactory processorsFactory;
@Inject
NamingStrategy namingStrategy;
@Inject
PreProcessorExecutor preProcessorExecutor;
@Inject
LifecycleCallbackRegistry callbackRegistry;
@Inject
Injector injector;
@Inject
GroupsProcessor groupsProcessor;
@Inject
WroModelFactory modelFactory;
@Inject
GroupExtractor groupExtractor;
@Inject
CacheStrategy<?, ?> cacheStrategy;
@Inject
HashStrategy hashBuilder;
@Inject
ReadOnlyContext readOnlyContext;
@Inject
MetaDataFactory metaDataFactory;
@Inject
CacheKeyFactory cacheKeyFactory;
@Inject
ResourceBundleProcessor bundleProcessor;
@Inject
ResourceWatcher resourceWatcher;
@Inject
DispatcherStreamLocator dispatcherLocator;
}
}