package pl.matisoft.soy.render;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import com.google.common.base.Optional;
import com.google.template.soy.data.SoyMapData;
import com.google.template.soy.msgs.SoyMsgBundle;
import com.google.template.soy.tofu.SoyTofu;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import pl.matisoft.soy.SoyView;
import pl.matisoft.soy.data.ToSoyDataConverter;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* Created with IntelliJ IDEA.
* User: mszczap
* Date: 18.10.13
* Time: 19:30
*/
public class DefaultTemplateRendererTest {
@InjectMocks
private DefaultTemplateRenderer defaultTemplateRenderer = new DefaultTemplateRenderer();
@Mock
private ToSoyDataConverter toSoyDataConverter;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDefaultDebug() throws Exception {
Assert.assertFalse("debug is off by default", defaultTemplateRenderer.isHotReloadMode());
}
@Test
public void testSetDebug() throws Exception {
defaultTemplateRenderer.setHotReloadMode(true);
Assert.assertTrue("setting debug flag works", defaultTemplateRenderer.isHotReloadMode());
}
@Test
public void testThrowsNPE() throws Exception {
try {
defaultTemplateRenderer.render(null);
fail("should throw NPE");
} catch (NullPointerException ex) {
}
}
@Test
public void testDontRenderWithoutCompiledTemplates() throws Exception {
final RenderRequest renderRequest = mock(RenderRequest.class);
final HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);
when(renderRequest.getCompiledTemplates()).thenReturn(Optional.<SoyTofu>absent());
when(renderRequest.getResponse()).thenReturn(httpServletResponse);
defaultTemplateRenderer.render(renderRequest);
Mockito.verifyZeroInteractions(httpServletResponse);
}
@Test
public void testRenderWithoutAnyDataWithoutDebug() throws Exception {
final Object domainMock = new Object();
final RenderRequest renderRequest = mock(RenderRequest.class);
final SoyTofu soyTofu = mock(SoyTofu.class);
final PrintWriter printWriter = mock(PrintWriter.class);
final HttpServletResponse response = mock(HttpServletResponse.class);
final HttpServletRequest request = mock(HttpServletRequest.class);
final String templateName = "soy.example.clientWords";
final SoyTofu.Renderer renderer = mock(SoyTofu.Renderer.class);
final SoyMapData modelData = new SoyMapData();
final SoyView soyView = mock(SoyView.class);
when(renderRequest.getCompiledTemplates()).thenReturn(Optional.of(soyTofu));
when(toSoyDataConverter.toSoyMap(domainMock)).thenReturn(Optional.<SoyMapData>absent());
when(renderRequest.getModel()).thenReturn(domainMock);
when(renderRequest.getRequest()).thenReturn(request);
when(renderRequest.getResponse()).thenReturn(response);
when(renderRequest.getTemplateName()).thenReturn(templateName);
when(soyTofu.newRenderer(templateName)).thenReturn(renderer);
when(renderRequest.getGlobalRuntimeModel()).thenReturn(Optional.<SoyMapData>absent());
when(renderRequest.getSoyMsgBundle()).thenReturn(Optional.<SoyMsgBundle>absent());
when(renderRequest.getSoyView()).thenReturn(soyView);
when(response.getWriter()).thenReturn(printWriter);
defaultTemplateRenderer.render(renderRequest);
Mockito.verify(renderer, never()).setDontAddToCache(anyBoolean());
Mockito.verify(renderer, never()).setData(modelData);
Mockito.verify(renderer, never()).setIjData(any(SoyMapData.class));
Mockito.verify(renderer, never()).setMsgBundle(any(SoyMsgBundle.class));
Mockito.verify(renderer).render();
Mockito.verify(printWriter).write(anyString());
Mockito.verify(printWriter).flush();
Mockito.verify(response).flushBuffer();
}
@Test
public void testRenderWithAllDataWithDebugOn() throws Exception {
defaultTemplateRenderer.setHotReloadMode(true);
final Object domainMock = new Object();
final RenderRequest renderRequest = mock(RenderRequest.class);
final SoyTofu soyTofu = mock(SoyTofu.class);
final PrintWriter printWriter = mock(PrintWriter.class);
final HttpServletResponse response = mock(HttpServletResponse.class);
final HttpServletRequest request = mock(HttpServletRequest.class);
final String templateName = "soy.example.clientWords";
final SoyTofu.Renderer renderer = mock(SoyTofu.Renderer.class);
final SoyMapData modelData = new SoyMapData();
final SoyMsgBundle soyMsgBundle = mock(SoyMsgBundle.class);
final SoyMapData runtimeModel = new SoyMapData();
final SoyView soyView = mock(SoyView.class);
when(renderRequest.getCompiledTemplates()).thenReturn(Optional.of(soyTofu));
when(toSoyDataConverter.toSoyMap(domainMock)).thenReturn(Optional.of(modelData));
when(renderRequest.getModel()).thenReturn(domainMock);
when(renderRequest.getRequest()).thenReturn(request);
when(renderRequest.getResponse()).thenReturn(response);
when(renderRequest.getTemplateName()).thenReturn(templateName);
when(soyTofu.newRenderer(templateName)).thenReturn(renderer);
when(renderRequest.getGlobalRuntimeModel()).thenReturn(Optional.of(runtimeModel));
when(renderRequest.getSoyMsgBundle()).thenReturn(Optional.of(soyMsgBundle));
when(response.getWriter()).thenReturn(printWriter);
when(renderRequest.getSoyView()).thenReturn(soyView);
defaultTemplateRenderer.render(renderRequest);
Mockito.verify(renderer).setDontAddToCache(anyBoolean());
Mockito.verify(renderer).setData(modelData);
Mockito.verify(renderer).setIjData(runtimeModel);
Mockito.verify(renderer).setMsgBundle(soyMsgBundle);
Mockito.verify(renderer).render();
Mockito.verify(printWriter).write(anyString());
Mockito.verify(printWriter).flush();
Mockito.verify(response).flushBuffer();
}
}