package ro.isdc.wro.model.resource.processor.decorator; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import ro.isdc.wro.WroRuntimeException; import ro.isdc.wro.config.Context; import ro.isdc.wro.model.resource.Resource; import ro.isdc.wro.model.resource.processor.ResourcePreProcessor; import ro.isdc.wro.model.resource.processor.impl.js.JSMinProcessor; import ro.isdc.wro.util.WroTestUtils; /** * @author Alex Objelean */ public class TestExceptionHandlingProcessorDecorator { @Mock private ResourcePreProcessor mockProcessor; @Mock private Resource mockResource; private ExceptionHandlingProcessorDecorator victim; @Before public void setUp() { Context.set(Context.standaloneContext()); MockitoAnnotations.initMocks(this); victim = new ExceptionHandlingProcessorDecorator(mockProcessor); WroTestUtils.createInjector().inject(victim); } @After public void tearDown() { Context.unset(); } @Test(expected = NullPointerException.class) public void cannotDecorateNullProcessor() { new ExceptionHandlingProcessorDecorator(null); } @Test public void shouldInvokeDecoratedProcessor() throws Exception { mockProcessor = Mockito.spy(new JSMinProcessor()); victim = new ExceptionHandlingProcessorDecorator(mockProcessor); WroTestUtils.createInjector().inject(victim); final String resourceContent = "alert( 1 );"; final StringWriter writer = new StringWriter(); final Reader reader = new StringReader(resourceContent); victim.process(mockResource, reader, writer); Mockito.verify(mockProcessor).process(Mockito.any(Resource.class), Mockito.any(Reader.class), Mockito.any(Writer.class)); Assert.assertEquals("\nalert(1);", writer.toString()); } @Test(expected = WroRuntimeException.class) public void shouldThrowRuntimeExceptionWhenProcessingFails() throws Exception { Mockito.doThrow(new IOException("BOOM")).when(mockProcessor).process(Mockito.any(Resource.class), Mockito.any(Reader.class), Mockito.any(Writer.class)); victim.process(mockResource, new StringReader(""), new StringWriter()); } @Test public void shouldPreserveContentWhenProcessingFails() throws Exception { Context.get().getConfig().setIgnoreFailingProcessor(true); Mockito.doThrow(new IOException("BOOM")).when(mockProcessor).process(Mockito.any(Resource.class), Mockito.any(Reader.class), Mockito.any(Writer.class)); final String resourceContent = "alert(1);"; final StringWriter writer = new StringWriter(); final Reader reader = new StringReader(resourceContent); victim.process(mockResource, reader, writer); Mockito.verify(mockProcessor).process(Mockito.any(Resource.class), Mockito.any(Reader.class), Mockito.any(Writer.class)); Assert.assertEquals(resourceContent, writer.toString()); } }