Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions jooby-pebble/src/main/java/org/jooby/pebble/PebbleRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package org.jooby.pebble;

import java.io.FileNotFoundException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
Expand All @@ -28,6 +29,7 @@
import org.jooby.View;

import com.mitchellbosecke.pebble.PebbleEngine;
import com.mitchellbosecke.pebble.error.LoaderException;
import com.mitchellbosecke.pebble.template.PebbleTemplate;;

class PebbleRenderer implements View.Engine {
Expand All @@ -41,20 +43,24 @@ public PebbleRenderer(final PebbleEngine pebble) {
@Override
public void render(final View view, final Renderer.Context ctx) throws Exception {
String vname = view.name();
PebbleTemplate template = pebble.getTemplate(vname);
Writer writer = new StringWriter();
Map<String, Object> model = new HashMap<>();
// push locals
model.putAll(ctx.locals());
model.putIfAbsent("_vname", vname);
try {
PebbleTemplate template = pebble.getTemplate(vname);
Writer writer = new StringWriter();
Map<String, Object> model = new HashMap<>();
// push locals
model.putAll(ctx.locals());
model.putIfAbsent("_vname", vname);

// put model
model.putAll(view.model());
// put model
model.putAll(view.model());

// render and send
template.evaluate(writer, model);
ctx.type(MediaType.html)
.send(writer.toString());
// render and send
template.evaluate(writer, model);
ctx.type(MediaType.html)
.send(writer.toString());
} catch (LoaderException x) {
throw new FileNotFoundException(vname);
}
}

@Override
Expand Down
67 changes: 67 additions & 0 deletions jooby-pebble/src/test/java/org/jooby/pebble/Issue725.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package org.jooby.pebble;

import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.junit.Assert.assertEquals;

import java.io.FileNotFoundException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.jooby.MediaType;
import org.jooby.Renderer;
import org.jooby.View;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import com.mitchellbosecke.pebble.PebbleEngine;
import com.mitchellbosecke.pebble.error.LoaderException;
import com.mitchellbosecke.pebble.template.PebbleTemplate;

@RunWith(PowerMockRunner.class)
@PrepareForTest({PebbleRenderer.class, HashMap.class })
public class Issue725 {

@SuppressWarnings({"rawtypes", "unchecked" })
@Test(expected = FileNotFoundException.class)
public void templateNotFound() throws Exception {
new MockUnit(PebbleEngine.class, View.class, Renderer.Context.class)
.expect(unit -> {
Map vmodel = unit.mock(Map.class);
Map<String, Object> locals = unit.mock(Map.class);

Map model = unit.constructor(HashMap.class).build();
model.putAll(locals);
expect(model.putIfAbsent("_vname", "vname")).andReturn(null);
model.putAll(vmodel);

View view = unit.get(View.class);
expect(view.name()).andReturn("vname");
expect(view.model()).andReturn(vmodel);

StringWriter writer = unit.constructor(StringWriter.class).build();

Renderer.Context ctx = unit.get(Renderer.Context.class);
expect(ctx.locals()).andReturn(locals);
expect(ctx.type(MediaType.html)).andReturn(ctx);
ctx.send(writer.toString());

PebbleTemplate template = unit.mock(PebbleTemplate.class);
template.evaluate(writer, model);
LoaderException x = new LoaderException(null, "template not found");
expectLastCall().andThrow(x);

PebbleEngine pebble = unit.get(PebbleEngine.class);
expect(pebble.getTemplate("vname")).andReturn(template);
})
.run(unit -> {
PebbleRenderer engine = new PebbleRenderer(unit.get(PebbleEngine.class));
engine.render(unit.get(View.class), unit.get(Renderer.Context.class));
assertEquals("pebble", engine.toString());
});
}
}