/*
* Copyright (c) 2010. All rights reserved.
*/
package ro.isdc.wro.model.group.processor;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import ro.isdc.wro.WroRuntimeException;
import ro.isdc.wro.cache.CacheKey;
import ro.isdc.wro.config.Context;
import ro.isdc.wro.config.jmx.WroConfiguration;
import ro.isdc.wro.manager.factory.BaseWroManagerFactory;
import ro.isdc.wro.manager.factory.WroManagerFactory;
import ro.isdc.wro.model.WroModel;
import ro.isdc.wro.model.factory.WroModelFactory;
import ro.isdc.wro.model.group.Group;
import ro.isdc.wro.model.resource.Resource;
import ro.isdc.wro.model.resource.ResourceType;
import ro.isdc.wro.model.resource.locator.factory.SimpleUriLocatorFactory;
import ro.isdc.wro.model.resource.locator.factory.UriLocatorFactory;
import ro.isdc.wro.model.resource.processor.ResourcePreProcessor;
import ro.isdc.wro.model.resource.processor.decorator.ProcessorDecorator;
import ro.isdc.wro.model.resource.processor.factory.ProcessorsFactory;
import ro.isdc.wro.model.resource.processor.factory.SimpleProcessorsFactory;
import ro.isdc.wro.model.resource.processor.impl.css.CssMinProcessor;
import ro.isdc.wro.model.resource.processor.impl.js.JSMinProcessor;
import ro.isdc.wro.util.WroTestUtils;
/**
* TestGroupsProcessor.
*
* @author Alex Objelean
* @created Created on Jan 5, 2010
*/
public class TestGroupsProcessor {
private GroupsProcessor victim;
final String groupName = "group";
@BeforeClass
public static void onBeforeClass() {
assertEquals(0, Context.countActive());
}
@AfterClass
public static void onAfterClass() {
assertEquals(0, Context.countActive());
}
@Before
public void setUp() {
Context.set(Context.standaloneContext());
victim = new GroupsProcessor();
initVictim(new WroConfiguration());
}
@After
public void tearDown() {
Context.unset();
}
private void initVictim(final WroConfiguration config) {
final WroModelFactory modelFactory = WroTestUtils.simpleModelFactory(new WroModel().addGroup(new Group(groupName)));
final WroManagerFactory managerFactory = new BaseWroManagerFactory().setModelFactory(modelFactory);
initVictim(config, managerFactory);
}
private void initVictim(final WroConfiguration config, final WroManagerFactory managerFactory) {
Context.get().setConfig(config);
final Injector injector = InjectorBuilder.create(managerFactory).build();
injector.inject(victim);
}
@Test
public void shouldReturnEmptyStringWhenGroupHasNoResources() {
final CacheKey key = new CacheKey(groupName, ResourceType.JS, true);
Assert.assertEquals(StringUtils.EMPTY, victim.process(key));
}
/**
* Same as above, but with ignoreEmptyGroup config updated.
*/
@Test(expected = WroRuntimeException.class)
public void shouldFailWhenGroupHasNoResourcesAndIgnoreEmptyGroupIsFalse() {
final WroConfiguration config = new WroConfiguration();
config.setIgnoreEmptyGroup(false);
initVictim(config);
final CacheKey key = new CacheKey("group", ResourceType.JS, true);
victim.process(key);
}
@Test
public void shouldLeaveContentUnchangedWhenAProcessorFails() {
final CacheKey key = new CacheKey(groupName, ResourceType.JS, true);
final Group group = new Group(groupName).addResource(Resource.create("1.js")).addResource(Resource.create("2.js"));
final WroModelFactory modelFactory = WroTestUtils.simpleModelFactory(new WroModel().addGroup(group));
// the locator which returns the name of the resource as its content
final UriLocatorFactory locatorFactory = new SimpleUriLocatorFactory().addLocator(WroTestUtils.createResourceMockingLocator());
final ResourcePreProcessor failingPreProcessor = new ResourcePreProcessor() {
public void process(final Resource resource, final Reader reader, final Writer writer)
throws IOException {
throw new IOException("BOOM!");
}
};
final ProcessorsFactory processorsFactory = new SimpleProcessorsFactory().addPreProcessor(failingPreProcessor).addPostProcessor(
new ProcessorDecorator(failingPreProcessor));
final BaseWroManagerFactory managerFactory = new BaseWroManagerFactory().setModelFactory(modelFactory).setUriLocatorFactory(
locatorFactory);
managerFactory.setProcessorsFactory(processorsFactory);
final WroConfiguration config = new WroConfiguration();
config.setIgnoreFailingProcessor(true);
initVictim(config, managerFactory);
final String actual = victim.process(key);
WroTestUtils.compare("1.js\n2.js", actual);
}
@Test
public void shouldApplyOnlyEligibleProcessors()
throws Exception {
final CssMinProcessor cssMinProcessor = Mockito.spy(new CssMinProcessor());
final BaseWroManagerFactory managerFactory = new BaseWroManagerFactory();
managerFactory.setProcessorsFactory(new SimpleProcessorsFactory().addPostProcessor(cssMinProcessor));
managerFactory.setModelFactory(WroTestUtils.simpleModelFactory(new WroModel().addGroup(new Group("g1").addResource(Resource.create("/script.js")))));
initVictim(new WroConfiguration(), managerFactory);
victim.process(new CacheKey("g1", ResourceType.JS, true));
verify(cssMinProcessor, Mockito.never()).process(Mockito.any(Resource.class), Mockito.any(Reader.class),
Mockito.any(Writer.class));
}
@Test
public void shouldApplyEligibleMinimizeAwareProcessors()
throws Exception {
final JSMinProcessor cssMinProcessor = Mockito.spy(new JSMinProcessor());
final BaseWroManagerFactory managerFactory = new BaseWroManagerFactory();
managerFactory.setProcessorsFactory(new SimpleProcessorsFactory().addPostProcessor(cssMinProcessor));
managerFactory.setModelFactory(WroTestUtils.simpleModelFactory(new WroModel().addGroup(new Group("g1").addResource(Resource.create("/script.js")))));
initVictim(new WroConfiguration(), managerFactory);
victim.process(new CacheKey("g1", ResourceType.JS, true));
verify(cssMinProcessor).process(Mockito.any(Resource.class), Mockito.any(Reader.class), Mockito.any(Writer.class));
}
@Test
public void shouldCleanupProperlyWhenDestroyed() {
PreProcessorExecutor mockPreProcessorExecutor = mock(PreProcessorExecutor.class);
victim.setPreProcessorExecutor(mockPreProcessorExecutor);
victim.destroy();
verify(mockPreProcessorExecutor).destroy();
}
}