package org.jtwig.render.node.renderer;
import org.jtwig.environment.Environment;
import org.jtwig.model.expression.Expression;
import org.jtwig.model.tree.EmbedNode;
import org.jtwig.model.tree.OverrideBlockNode;
import org.jtwig.render.RenderRequest;
import org.jtwig.render.RenderResourceRequest;
import org.jtwig.render.expression.CalculateExpressionService;
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 java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.jtwig.support.MatcherUtils.theSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
public class EmbedNodeRenderTest {
private EmbedNodeRender underTest = new EmbedNodeRender();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void renderIfNotFoundNotIgnoring() throws Exception {
String pathExpressionValueAsString = "path";
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
EmbedNode node = mock(EmbedNode.class);
Expression pathExpression = mock(Expression.class);
ResourceReference resource = mock(ResourceReference.class);
ResourceReference newReference = mock(ResourceReference.class);
CalculateExpressionService calculateExpressionService = mock(CalculateExpressionService.class);
Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
Object pathExpressionValue = "path";
when(node.getResourceExpression()).thenReturn(pathExpression);
when(node.isIgnoreMissing()).thenReturn(false);
when(request.getEnvironment()).thenReturn(environment);
when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(resource);
when(environment.getRenderEnvironment().getCalculateExpressionService()).thenReturn(calculateExpressionService);
when(environment.getResourceEnvironment().getResourceService().resolve(resource, pathExpressionValueAsString)).thenReturn(newReference);
when(calculateExpressionService.calculate(request, pathExpression)).thenReturn(pathExpressionValue);
when(environment.getValueEnvironment().getStringConverter().convert(pathExpressionValue)).thenReturn(pathExpressionValueAsString);
expectedException.expect(ResourceNotFoundException.class);
expectedException.expectMessage(containsString("Resource 'path' not found"));
underTest.render(request, node);
}
@Test
public void renderIfNotFoundIgnoringMissing() throws Exception {
String pathExpressionValueAsString = "pathExpressionValueAsString";
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
EmbedNode node = mock(EmbedNode.class);
Expression pathExpression = mock(Expression.class);
ResourceReference resource = mock(ResourceReference.class);
ResourceReference newReference = mock(ResourceReference.class);
CalculateExpressionService calculateExpressionService = mock(CalculateExpressionService.class);
Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
Object pathExpressionValue = new Object();
when(node.getResourceExpression()).thenReturn(pathExpression);
when(node.isIgnoreMissing()).thenReturn(true);
when(request.getEnvironment()).thenReturn(environment);
when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(resource);
when(environment.getValueEnvironment().getStringConverter().convert(pathExpressionValue)).thenReturn(pathExpressionValueAsString);
when(environment.getRenderEnvironment().getCalculateExpressionService()).thenReturn(calculateExpressionService);
when(environment.getResourceEnvironment().getResourceService().resolve(resource, pathExpressionValueAsString)).thenReturn(newReference);
when(calculateExpressionService.calculate(request, pathExpression)).thenReturn(pathExpressionValue);
Renderable result = underTest.render(request, node);
assertThat(result, is((Renderable) EmptyRenderable.instance()));
}
@Test
public void renderIfFoundInheritModel() throws Exception {
String pathExpressionValueAsString = "pathExpressionValueAsString";
boolean inheritModel = true;
Renderable renderable = mock(Renderable.class, "expected");
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
EmbedNode node = mock(EmbedNode.class);
Expression pathExpression = mock(Expression.class, "pathExpression");
ResourceReference resource = mock(ResourceReference.class, "parentResource");
CalculateExpressionService calculateExpressionService = mock(CalculateExpressionService.class);
Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
Object pathExpressionValue = new Object();
ResourceReference newResource = mock(ResourceReference.class, "new");
ResourceMetadata resourceMetadata = mock(ResourceMetadata.class);
Expression mapExpression = mock(Expression.class, "map");
WrappedCollection wrappedCollection = mock(WrappedCollection.class, "collection");
OverrideBlockNode node1 = mock(OverrideBlockNode.class, "node1");
OverrideBlockNode node2 = mock(OverrideBlockNode.class, "node2");
Object mapExpressionValue = new Object();
when(node.getResourceExpression()).thenReturn(pathExpression);
when(node.isIgnoreMissing()).thenReturn(true);
when(node.isInheritModel()).thenReturn(inheritModel);
when(node.getMapExpression()).thenReturn(mapExpression);
when(node.getNodes()).thenReturn(asList(node1, node2));
when(request.getEnvironment()).thenReturn(environment);
when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(resource);
when(environment.getValueEnvironment().getStringConverter().convert(pathExpressionValue)).thenReturn(pathExpressionValueAsString);
when(environment.getRenderEnvironment().getCalculateExpressionService()).thenReturn(calculateExpressionService);
when(environment.getResourceEnvironment().getResourceService().resolve(resource, pathExpressionValueAsString)).thenReturn(newResource);
when(calculateExpressionService.calculate(request, pathExpression)).thenReturn(pathExpressionValue);
when(calculateExpressionService.calculate(request, mapExpression)).thenReturn(mapExpressionValue);
when(environment.getValueEnvironment().getCollectionConverter().convert(mapExpressionValue)).thenReturn(Converter.Result.defined(wrappedCollection));
when(environment.getRenderEnvironment().getRenderResourceService().render(eq(request), argThat(theSame(new RenderResourceRequest(newResource, false, !inheritModel, wrappedCollection)))))
.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);
}
@Test
public void renderIfFoundDoNotInheritModel() throws Exception {
String pathExpressionValueAsString = "pathExpressionValueAsString";
boolean inheritModel = false;
Renderable renderable = mock(Renderable.class, "expected");
RenderRequest request = mock(RenderRequest.class, RETURNS_DEEP_STUBS);
EmbedNode node = mock(EmbedNode.class);
Expression pathExpression = mock(Expression.class, "pathExpression");
ResourceReference resource = mock(ResourceReference.class, "parentResource");
CalculateExpressionService calculateExpressionService = mock(CalculateExpressionService.class);
Environment environment = mock(Environment.class, RETURNS_DEEP_STUBS);
Object pathExpressionValue = new Object();
ResourceReference newResource = mock(ResourceReference.class, "new");
Expression mapExpression = mock(Expression.class, "map");
WrappedCollection wrappedCollection = mock(WrappedCollection.class, "collection");
OverrideBlockNode node1 = mock(OverrideBlockNode.class, "node1");
OverrideBlockNode node2 = mock(OverrideBlockNode.class, "node2");
ResourceMetadata resourceMetadata = mock(ResourceMetadata.class);
Object mapExpressionValue = new Object();
when(node.getResourceExpression()).thenReturn(pathExpression);
when(node.isIgnoreMissing()).thenReturn(true);
when(node.isInheritModel()).thenReturn(inheritModel);
when(node.getMapExpression()).thenReturn(mapExpression);
when(node.getNodes()).thenReturn(asList(node1, node2));
when(request.getEnvironment()).thenReturn(environment);
when(request.getRenderContext().getCurrent(ResourceReference.class)).thenReturn(resource);
when(environment.getValueEnvironment().getStringConverter().convert(pathExpressionValue)).thenReturn(pathExpressionValueAsString);
when(environment.getRenderEnvironment().getCalculateExpressionService()).thenReturn(calculateExpressionService);
when(environment.getResourceEnvironment().getResourceService().resolve(resource, pathExpressionValueAsString)).thenReturn(newResource);
when(calculateExpressionService.calculate(request, pathExpression)).thenReturn(pathExpressionValue);
when(calculateExpressionService.calculate(request, mapExpression)).thenReturn(mapExpressionValue);
when(environment.getValueEnvironment().getCollectionConverter().convert(mapExpressionValue)).thenReturn(Converter.Result.defined(wrappedCollection));
when(environment.getRenderEnvironment().getRenderResourceService().render(eq(request), argThat(theSame(new RenderResourceRequest(newResource, false, !inheritModel, wrappedCollection)))))
.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);
}
}