package org.jtwig.render.node.renderer;
import org.jtwig.environment.Environment;
import org.jtwig.model.expression.Expression;
import org.jtwig.model.tree.ExtendsNode;
import org.jtwig.model.tree.Node;
import org.jtwig.render.RenderRequest;
import org.jtwig.render.RenderResourceRequest;
import org.jtwig.renderable.Renderable;
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.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static java.util.Arrays.asList;
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 ExtendsNodeRenderTest {
private final ExtendsNodeRender underTest = new ExtendsNodeRender();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void renderIfNotFound() throws Exception {
String path = "path";
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
ExtendsNode node = mock(ExtendsNode.class);
Expression expression = mock(Expression.class);
Object pathValue = mock(Object.class);
Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
ResourceReference parentResource = mock(ResourceReference.class);
ResourceReference newResource = mock(ResourceReference.class, "reference");
ResourceMetadata resourceMetadata = mock(ResourceMetadata.class);
when(request.getEnvironment()).thenReturn(environment);
when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(parentResource);
when(node.getExtendsExpression()).thenReturn(expression);
when(environment.getRenderEnvironment().getCalculateExpressionService().calculate(request, expression)).thenReturn(pathValue);
when(environment.getValueEnvironment().getStringConverter().convert(pathValue)).thenReturn(path);
when(environment.getResourceEnvironment().getResourceService().resolve(parentResource, path)).thenReturn(newResource);
when(environment.getResourceEnvironment().getResourceService().loadMetadata(newResource)).thenReturn(resourceMetadata);
when(resourceMetadata.exists()).thenReturn(false);
when(newResource.getPath()).thenReturn("path");
expectedException.expect(ResourceNotFoundException.class);
expectedException.expectMessage(containsString("Resource 'path' not found"));
underTest.render(request, node);
}
@Test
public void renderIfFound() throws Exception {
String path = "path";
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
ExtendsNode node = mock(ExtendsNode.class);
Expression expression = mock(Expression.class);
Object pathValue = new Object();
Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
ResourceReference parentResource = mock(ResourceReference.class);
ResourceReference newResource = mock(ResourceReference.class);
ResourceMetadata resourceMetadata = mock(ResourceMetadata.class);
Renderable renderable = mock(Renderable.class);
Node node1 = mock(Node.class);
Node node2 = mock(Node.class);
when(request.getEnvironment()).thenReturn(environment);
when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(parentResource);
when(node.getExtendsExpression()).thenReturn(expression);
when(node.getNodes()).thenReturn(asList(node1, node2));
when(environment.getRenderEnvironment().getCalculateExpressionService().calculate(request, expression)).thenReturn(pathValue);
when(environment.getValueEnvironment().getStringConverter().convert(pathValue)).thenReturn(path);
when(environment.getResourceEnvironment().getResourceService().resolve(parentResource, path)).thenReturn(newResource);
when(environment.getRenderEnvironment().getRenderResourceService().render(eq(request), argThat(theSame(new RenderResourceRequest(newResource, false, false, WrappedCollection.empty()))))).thenReturn(renderable);
when(environment.getResourceEnvironment().getResourceService().loadMetadata(newResource)).thenReturn(resourceMetadata);
when(resourceMetadata.exists()).thenReturn(true);
Renderable result = underTest.render(request, node);
assertSame(renderable, result);
verify(environment.getRenderEnvironment().getRenderNodeService()).render(request, node1);
verify(environment.getRenderEnvironment().getRenderNodeService()).render(request, node2);
}
}