package org.jtwig.render.node.renderer; import com.google.common.base.Optional; import org.jtwig.escape.EscapeEngine; import org.jtwig.escape.HtmlEscapeEngine; import org.jtwig.escape.JavascriptEscapeEngine; import org.jtwig.model.tree.AutoEscapeNode; import org.jtwig.model.tree.Node; import org.jtwig.render.RenderRequest; import org.jtwig.renderable.RenderException; import org.jtwig.renderable.Renderable; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.junit.Assert.assertSame; import static org.mockito.Mockito.*; public class AutoEscapeNodeRenderTest { private AutoEscapeNodeRender underTest = new AutoEscapeNodeRender(); @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void renderWhenEscapeModeNotProvided() throws Exception { EscapeEngine escapeEngine = HtmlEscapeEngine.instance(); RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS); AutoEscapeNode node = mock(AutoEscapeNode.class); Node content = mock(Node.class); Renderable renderable = mock(Renderable.class); when(node.getContent()).thenReturn(content); when(node.getEscapeEngineName()).thenReturn(Optional.<String>absent()); when(request.getEnvironment().getEscapeEnvironment().getEscapeEngineSelector().escapeEngineFor("default")).thenReturn(Optional.of(escapeEngine)); when(request.getEnvironment().getEscapeEnvironment().getDefaultEscapeEngine()).thenReturn("default"); when(request.getEnvironment().getRenderEnvironment().getRenderNodeService().render(request, content)).thenReturn(renderable); Renderable result = underTest.render(request, node); assertSame(renderable, result); verify(request.getRenderContext()).set(EscapeEngine.class, escapeEngine); } @Test public void renderWhenEscapeModeProvided() throws Exception { EscapeEngine escapeMode = JavascriptEscapeEngine.instance(); RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS); AutoEscapeNode node = mock(AutoEscapeNode.class); Node content = mock(Node.class); Renderable renderable = mock(Renderable.class); when(node.getContent()).thenReturn(content); when(node.getEscapeEngineName()).thenReturn(Optional.of("js")); when(request.getEnvironment().getEscapeEnvironment().getEscapeEngineSelector().escapeEngineFor("js")).thenReturn(Optional.of(escapeMode)); when(request.getEnvironment().getEscapeEnvironment().getDefaultEscapeEngine()).thenReturn("default"); when(request.getEnvironment().getRenderEnvironment().getRenderNodeService().render(request, content)).thenReturn(renderable); Renderable result = underTest.render(request, node); assertSame(renderable, result); verify(request.getRenderContext()).set(EscapeEngine.class, escapeMode); } @Test public void noEscapeEngine() throws Exception { RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS); AutoEscapeNode node = mock(AutoEscapeNode.class); Node content = mock(Node.class); Renderable renderable = mock(Renderable.class); when(node.getContent()).thenReturn(content); when(node.getEscapeEngineName()).thenReturn(Optional.of("js")); when(request.getEnvironment().getEscapeEnvironment().getEscapeEngineSelector().escapeEngineFor("js")).thenReturn(Optional.<EscapeEngine>absent()); when(request.getEnvironment().getEscapeEnvironment().getDefaultEscapeEngine()).thenReturn("default"); when(request.getEnvironment().getRenderEnvironment().getRenderNodeService().render(request, content)).thenReturn(renderable); expectedException.expectMessage("Invalid escape engine requested"); expectedException.expect(RenderException.class); underTest.render(request, node); } }