package org.jtwig.render.node.renderer; import org.jtwig.environment.Environment; import org.jtwig.model.expression.Expression; import org.jtwig.model.tree.IncludeNode; import org.jtwig.render.RenderRequest; import org.jtwig.render.RenderResourceRequest; import org.jtwig.renderable.Renderable; import org.jtwig.renderable.impl.EmptyRenderable; import org.jtwig.resource.exceptions.ResourceNotFoundException; import org.jtwig.resource.metadata.ResourceMetadata; import org.jtwig.resource.reference.ResourceReference; import org.jtwig.value.WrappedCollection; import org.jtwig.value.convert.Converter; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.hamcrest.Matchers.containsString; import static org.jtwig.support.MatcherUtils.theSame; import static org.junit.Assert.assertSame; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; public class IncludeNodeRenderTest { private IncludeNodeRender underTest = new IncludeNodeRender(); @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void renderPathNotFound() throws Exception { String path = "path"; IncludeNode includeNode = mock(IncludeNode.class); RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS); Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS); Expression resourceExpression = mock(Expression.class); ResourceReference currentResource = mock(ResourceReference.class); ResourceReference newResource = mock(ResourceReference.class); when(includeNode.isIgnoreMissing()).thenReturn(false); when(includeNode.getResourceExpression()).thenReturn(resourceExpression); when(request.getEnvironment()).thenReturn(environment); when(environment.getRenderEnvironment().getCalculateExpressionService().calculate(request, resourceExpression)).thenReturn(path); when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(currentResource); when(environment.getResourceEnvironment().getResourceService().resolve(currentResource, path)).thenReturn(newResource); expectedException.expect(ResourceNotFoundException.class); expectedException.expectMessage(containsString("Resource 'path' (resolved to 'null') not found")); underTest.render(request, includeNode); } @Test public void renderNotFoundIgnore() throws Exception { String path = "path"; IncludeNode includeNode = mock(IncludeNode.class); RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS); Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS); Expression resourceExpression = mock(Expression.class); ResourceReference currentResource = mock(ResourceReference.class); ResourceReference newResource = mock(ResourceReference.class); when(includeNode.isIgnoreMissing()).thenReturn(true); when(includeNode.getResourceExpression()).thenReturn(resourceExpression); when(request.getEnvironment()).thenReturn(environment); when(environment.getRenderEnvironment().getCalculateExpressionService().calculate(request, resourceExpression)).thenReturn(path); when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(currentResource); when(environment.getResourceEnvironment().getResourceService().resolve(currentResource, path)).thenReturn(newResource); Renderable result = underTest.render(request, includeNode); assertSame(EmptyRenderable.instance(), result); } @Test public void renderFound() throws Exception { String path = "path"; WrappedCollection empty = WrappedCollection.empty(); boolean inherit = true; IncludeNode includeNode = mock(IncludeNode.class); RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS); Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS); Expression resourceExpression = mock(Expression.class); ResourceReference currentResource = mock(ResourceReference.class); ResourceReference resource = mock(ResourceReference.class); Expression mapExpression = mock(Expression.class); Renderable renderable = mock(Renderable.class); ResourceMetadata resourceMetadata = mock(ResourceMetadata.class); Object mapValue = new Object(); String relativePath = "relativePath"; when(includeNode.isIgnoreMissing()).thenReturn(true); when(includeNode.isInheritModel()).thenReturn(inherit); when(includeNode.getResourceExpression()).thenReturn(resourceExpression); when(includeNode.getMapExpression()).thenReturn(mapExpression); when(request.getEnvironment()).thenReturn(environment); when(environment.getRenderEnvironment().getCalculateExpressionService().calculate(request, resourceExpression)).thenReturn(path); when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(currentResource); when(environment.getValueEnvironment().getStringConverter().convert(path)).thenReturn(relativePath); when(environment.getResourceEnvironment().getResourceService().resolve(currentResource, relativePath)).thenReturn(resource); when(environment.getRenderEnvironment().getCalculateExpressionService().calculate(request, mapExpression)).thenReturn(mapValue); when(environment.getValueEnvironment().getCollectionConverter().convert(mapValue)).thenReturn(Converter.Result.defined(empty)); when(environment.getRenderEnvironment().getRenderResourceService().render(eq(request), argThat(theSame(new RenderResourceRequest(resource, true, !inherit, empty))))).thenReturn(renderable); when(environment.getResourceEnvironment().getResourceService().loadMetadata(resource)).thenReturn(resourceMetadata); when(resourceMetadata.exists()).thenReturn(true); when(resource.getPath()).thenReturn("path"); Renderable result = underTest.render(request, includeNode); assertSame(renderable, result); } }