@Test public void itTruncatesStringToConfigLimit() { jinjava = new Jinjava(JinjavaConfig.newBuilder() .withMaxStringLength(5) .build()); RenderResult result = jinjava.renderForResult("{{ [1, 2, 3, 4, 5]|join('|') }}", new HashMap<String, Object>()); assertThat(result.getOutput()).isEqualTo("1|2|3"); assertThat(result.getErrors().size()).isEqualTo(1); assertThat(result.getErrors().get(0).getMessage()).contains("filter has been truncated to the max String length"); }
@Test public void itLimitsOutputSize() { JinjavaConfig outputSizeLimitedConfig = JinjavaConfig.newBuilder().withMaxOutputSize(20).build(); String output = "123456789012345678901234567890"; RenderResult renderResult = new Jinjava().renderForResult(output, new HashMap<>()); assertThat(renderResult.getOutput()).isEqualTo(output); assertThat(renderResult.hasErrors()).isFalse(); renderResult = new Jinjava(outputSizeLimitedConfig).renderForResult(output, new HashMap<>()); assertThat(renderResult.getErrors().get(0).getMessage()).contains("OutputTooBigException"); }
@Test public void itStoresResolvedFunctions() { context.put("datetime", 12345); final JinjavaConfig config = JinjavaConfig.newBuilder().build(); String template = "{% for i in range(1, 5) %}{{i}} {% endfor %}\n{{ unixtimestamp(datetime) }}"; final RenderResult renderResult = jinjava.renderForResult(template, context, config); assertThat(renderResult.getOutput()).isEqualTo("1 2 3 4 \n12000"); assertThat(renderResult.getContext().getResolvedFunctions()).hasSameElementsAs(ImmutableSet.of(":range", ":unixtimestamp")); }
@Test public void itRendersNestedTags() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().build(); JinjavaInterpreter jinjava = new Jinjava(config).newInterpreter(); Context context = jinjava.getContext(); context.put("myvar", "hello {% if (true) %}nasty{% endif %}"); ExpressionNode node = fixture("simplevar"); assertThat(node.render(jinjava).toString()).isEqualTo("hello nasty"); }
@Test public void itFailsOnUnknownTokensOfLoops() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build(); JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); String jinja = "{% for v in values %} {{ v }} {% endfor %}"; Node node = new TreeParser(jinjavaInterpreter, jinja).buildTree(); assertThatThrownBy(() -> jinjavaInterpreter.render(node)) .isInstanceOf(UnknownTokenException.class) .hasMessage("Unknown token found: values"); }
@Test public void itFailsOnUnknownTokensOfLoops() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build(); JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); String jinja = "{% for v in values %} {{ v }} {% endfor %}"; Node node = new TreeParser(jinjavaInterpreter, jinja).buildTree(); assertThatThrownBy(() -> jinjavaInterpreter.render(node)) .isInstanceOf(UnknownTokenException.class) .hasMessage("Unknown token found: values"); }
@Test public void itFailsOnUnknownTokensOfIf() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build(); JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); String jinja = "{% if bad %} BAD {% endif %}"; Node node = new TreeParser(jinjavaInterpreter, jinja).buildTree(); assertThatThrownBy(() -> jinjavaInterpreter.render(node)) .isInstanceOf(UnknownTokenException.class) .hasMessage("Unknown token found: bad"); }
@Test public void itFailsOnUnknownTokensWithFilter() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build(); JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); String jinja = "{{ UnknownToken | default('abc') }}"; Node node = new TreeParser(jinjavaInterpreter, jinja).buildTree(); assertThatThrownBy(() -> jinjavaInterpreter.render(node)) .isInstanceOf(UnknownTokenException.class) .hasMessage("Unknown token found: UnknownToken"); }
@Test public void itRendersNestedTags() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().build(); JinjavaInterpreter jinjava = new Jinjava(config).newInterpreter(); Context context = jinjava.getContext(); context.put("myvar", "hello {% if (true) %}nasty{% endif %}"); ExpressionNode node = fixture("simplevar"); assertThat(node.render(jinjava).toString()).isEqualTo("hello nasty"); }
@Test public void itFailsOnUnknownTokensVariables() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build(); JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); String jinja = "{{ UnknownToken }}"; Node node = new TreeParser(jinjavaInterpreter, jinja).buildTree(); assertThatThrownBy(() -> jinjavaInterpreter.render(node)) .isInstanceOf(UnknownTokenException.class) .hasMessage("Unknown token found: UnknownToken"); }
@Test public void itFailsOnUnknownTokensOfIf() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build(); JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); String jinja = "{% if bad %} BAD {% endif %}"; Node node = new TreeParser(jinjavaInterpreter, jinja).buildTree(); assertThatThrownBy(() -> jinjavaInterpreter.render(node)) .isInstanceOf(UnknownTokenException.class) .hasMessage("Unknown token found: bad"); }
@Before public void setUp() { JinjavaConfig.Builder builder = JinjavaConfig.newBuilder(); builder.withFailOnUnknownTokens(true); JinjavaConfig config = builder.build(); jinjava = new Jinjava(config); }
@Test public void testLstripBlocks() { config = JinjavaConfig.newBuilder() .withLstripBlocks(true) .withTrimBlocks(true) .build(); List<Token> tokens = tokens("tag-with-trim-chars"); assertThat(tokens).isNotEmpty(); }
@Test public void itRendersWithNestedExpressionInterpretationByDefault() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().build(); JinjavaInterpreter noNestedInterpreter = new Jinjava(config).newInterpreter(); Context contextNoNestedInterpretation = noNestedInterpreter.getContext(); contextNoNestedInterpretation.put("myvar", "hello {{ place }}"); contextNoNestedInterpretation.put("place", "world"); ExpressionNode node = fixture("simplevar"); assertThat(node.render(noNestedInterpreter).toString()).isEqualTo("hello world"); }
@Test public void testLstripBlocks() { config = JinjavaConfig.newBuilder() .withLstripBlocks(true) .withTrimBlocks(true) .build(); List<Token> tokens = tokens("tag-with-trim-chars"); assertThat(tokens).isNotEmpty(); }
@Test public void trimAndLstripBlocks() { interpreter = new Jinjava(JinjavaConfig.newBuilder().withLstripBlocks(true).withTrimBlocks(true).build()).newInterpreter(); assertThat(interpreter.render(parse("parse/tokenizer/whitespace-tags.jinja"))) .isEqualTo("<div>\n" + " yay\n" + "</div>\n"); }
@Test public void trimAndLstripBlocks() { interpreter = new Jinjava(JinjavaConfig.newBuilder().withLstripBlocks(true).withTrimBlocks(true).build()).newInterpreter(); assertThat(interpreter.render(parse("parse/tokenizer/whitespace-tags.jinja"))) .isEqualTo("<div>\n" + " yay\n" + "</div>\n"); }
@Test public void itRendersResultWithoutNestedExpressionInterpretation() throws Exception { final JinjavaConfig config = JinjavaConfig.newBuilder().withNestedInterpretationEnabled(false).build(); JinjavaInterpreter noNestedInterpreter = new Jinjava(config).newInterpreter(); Context contextNoNestedInterpretation = noNestedInterpreter.getContext(); contextNoNestedInterpretation.put("myvar", "hello {{ place }}"); contextNoNestedInterpretation.put("place", "world"); ExpressionNode node = fixture("simplevar"); assertThat(node.render(noNestedInterpreter).toString()).isEqualTo("hello {{ place }}"); }
@Before public void setup() { validationFilter = new ValidationFilter(); ELFunctionDefinition validationFunction = new ELFunctionDefinition("", "validation_test", ValidationModeTest.class, "validationTestFunction"); jinjava = new Jinjava(); jinjava.getGlobalContext().registerFilter(validationFilter); jinjava.getGlobalContext().registerFunction(validationFunction); interpreter = jinjava.newInterpreter(); context = interpreter.getContext(); validatingInterpreter = new JinjavaInterpreter(jinjava, context, JinjavaConfig.newBuilder().withValidationMode(true).build()); JinjavaInterpreter.pushCurrent(interpreter); }
@Before public void setup() { validationFilter = new ValidationFilter(); ELFunctionDefinition validationFunction = new ELFunctionDefinition("", "validation_test", ValidationModeTest.class, "validationTestFunction"); jinjava = new Jinjava(); jinjava.getGlobalContext().registerFilter(validationFilter); jinjava.getGlobalContext().registerFunction(validationFunction); interpreter = jinjava.newInterpreter(); context = interpreter.getContext(); validatingInterpreter = new JinjavaInterpreter(jinjava, context, JinjavaConfig.newBuilder().withValidationMode(true).build()); JinjavaInterpreter.pushCurrent(interpreter); }