You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ie...@apache.org on 2013/08/15 19:56:28 UTC

svn commit: r1514410 - in /sling/whiteboard/ieb/handlebars: ./ src/main/java/org/apache/sling/scripting/handlebars/ src/test/ src/test/java/ src/test/java/org/ src/test/java/org/apache/ src/test/java/org/apache/sling/ src/test/java/org/apache/sling/scr...

Author: ieb
Date: Thu Aug 15 17:56:28 2013
New Revision: 1514410

URL: http://svn.apache.org/r1514410
Log:
Added test classes to check template processing and variable binding.

Added:
    sling/whiteboard/ieb/handlebars/src/test/
    sling/whiteboard/ieb/handlebars/src/test/java/
    sling/whiteboard/ieb/handlebars/src/test/java/org/
    sling/whiteboard/ieb/handlebars/src/test/java/org/apache/
    sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/
    sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/
    sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/
    sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngineFactoryTest.java   (with props)
Modified:
    sling/whiteboard/ieb/handlebars/pom.xml
    sling/whiteboard/ieb/handlebars/src/main/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngine.java

Modified: sling/whiteboard/ieb/handlebars/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/ieb/handlebars/pom.xml?rev=1514410&r1=1514409&r2=1514410&view=diff
==============================================================================
--- sling/whiteboard/ieb/handlebars/pom.xml (original)
+++ sling/whiteboard/ieb/handlebars/pom.xml Thu Aug 15 17:56:28 2013
@@ -134,6 +134,17 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>1.9.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.scr.annotations</artifactId>
         </dependency>

Modified: sling/whiteboard/ieb/handlebars/src/main/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngine.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/ieb/handlebars/src/main/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngine.java?rev=1514410&r1=1514409&r2=1514410&view=diff
==============================================================================
--- sling/whiteboard/ieb/handlebars/src/main/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngine.java (original)
+++ sling/whiteboard/ieb/handlebars/src/main/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngine.java Thu Aug 15 17:56:28 2013
@@ -19,6 +19,7 @@ package org.apache.sling.scripting.handl
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.StringWriter;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -55,7 +56,7 @@ public class HandlebarsScriptEngine exte
                 model.put((String) entry.getKey(), entry.getValue());
             }
             Context hbContext = Context.newContext(model);
-            template.apply(hbContext, context.getWriter());
+            template.apply(hbContext, scriptContext.getWriter());
         } catch (IOException e) {
             LOGGER.error(e.getMessage(), e);
         }

Added: sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngineFactoryTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngineFactoryTest.java?rev=1514410&view=auto
==============================================================================
--- sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngineFactoryTest.java (added)
+++ sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngineFactoryTest.java Thu Aug 15 17:56:28 2013
@@ -0,0 +1,259 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.scripting.handlebars;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import javax.script.SimpleScriptContext;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HandlebarsScriptEngineFactoryTest {
+
+    public class Person {
+
+        private Name firstName;
+
+        private Name lastName;
+
+        public Person(String firstName, String lastName) {
+            this.firstName = new Name(firstName);
+            this.lastName = new Name(lastName);
+        }
+
+        public Name getFirstName() {
+            return firstName;
+        }
+
+        public Name getLastName() {
+            return lastName;
+        }
+    }
+
+    public class Name {
+
+        private String _name;
+
+        public Name(String name) {
+            this._name = name;
+        }
+
+        public String getName() {
+            return _name;
+        }
+
+    }
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(HandlebarsScriptEngineFactoryTest.class);
+
+    private HandlebarsScriptEngineFactory scriptEngineFactory;
+
+    @Before
+    public void before() {
+        scriptEngineFactory = new HandlebarsScriptEngineFactory();
+    }
+
+    @Test
+    public void testProperties() {
+        Assert.assertEquals("HandlebarsScriptEngineFactory",
+            scriptEngineFactory.getEngineName());
+        Assert.assertEquals("0", scriptEngineFactory.getEngineVersion());
+        Assert.assertArrayEquals(new String[] { "hbss" },
+            scriptEngineFactory.getExtensions().toArray());
+        Assert.assertEquals("handlebars", scriptEngineFactory.getLanguageName());
+        Assert.assertEquals("1.0", scriptEngineFactory.getLanguageVersion());
+        Assert.assertArrayEquals(new String[] { "text/x-handlebars" },
+            scriptEngineFactory.getMimeTypes().toArray());
+    }
+
+    @Test
+    public void testScriptEngine() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(" Something really Simple");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(" Something really Simple", writer.toString());
+    }
+
+    /**
+     * Test a simple binding.
+     * @throws ScriptException
+     */
+    @Test
+    public void testTemplateSimpleBinding() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(
+            " Something really Simple with {{ replace_me }}");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        bindings.put("replace_me", "Hello World!");
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(" Something really Simple with Hello World!",
+            writer.toString());
+    }
+
+    /**
+     * Test a simple map binding.
+     * @throws ScriptException
+     */
+    @Test
+    public void testTemplateMapBinding() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(
+            " Something really Simple with {{ replace_me.name }}");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        Map<String, Object> replace_me = new HashMap<String, Object>();
+        replace_me.put("name", "ieb");
+        bindings.put("replace_me", replace_me);
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(" Something really Simple with ieb",
+            writer.toString());
+    }
+
+    /**
+     * Tests that its possible to access bean getters by name using dotted
+     * annotation.
+     * 
+     * @throws ScriptException
+     */
+    @Test
+    public void testTemplateMethodBinding() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(
+            " Something really Simple with {{ replace_me.name }}");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        bindings.put("replace_me", new Name("ian"));
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(" Something really Simple with ian",
+            writer.toString());
+    }
+
+    /**
+     * Tests value binding through multiple beans.
+     * @throws ScriptException
+     */
+    @Test
+    public void testTemplateDeepMethodBinding() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(
+            " Something really Simple with {{ replace_me.firstName.name }} {{ replace_me.lastName.name }}");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        bindings.put("replace_me", new Person("ian", "boston"));
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(" Something really Simple with ian boston",
+            writer.toString());
+    }
+
+    /**
+     * Test for safe defaults to XXS strings.
+     * @throws ScriptException
+     */
+    @Test
+    public void testTemplateDeepMethodBindingXSS() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(
+            " Something really Simple with {{ replace_me.firstName.name }} {{ replace_me.lastName.name }}");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        bindings.put("replace_me", new Person(
+            "ian<script type=\"text/javascript",
+            "\">alert('GotYa!');</script>boston"));
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(
+            " Something really Simple with ian&lt;script type=&quot;text/javascript &quot;&gt;alert(&#x27;GotYa!&#x27;);&lt;/script&gt;boston",
+            writer.toString());
+    }
+
+    /**
+     * Tests ability to escape to raw output when required.
+     * @throws ScriptException
+     */
+    @Test
+    public void testTemplateDeepMethodBindingRaw() throws ScriptException {
+        ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine();
+        LOGGER.info("Script engine is {} ", scriptEngine);
+        StringReader reader = new StringReader(
+            " Something really Simple with {{{ replace_me.firstName.name }}} {{{ replace_me.lastName.name }}}");
+        StringWriter writer = new StringWriter();
+        SimpleScriptContext scriptContext = new SimpleScriptContext();
+        Bindings bindings = scriptEngine.createBindings();
+        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setWriter(writer);
+        bindings.put("replace_me", new Person(
+            "ian<script type=\"text/javascript",
+            "\">alert('GotYa!');</script>boston"));
+        LOGGER.info("Calling with {} ", scriptContext);
+        Object o = scriptEngine.eval(reader, scriptContext);
+        Assert.assertNull(o);
+        Assert.assertEquals(
+            " Something really Simple with ian<script type=\"text/javascript \">alert('GotYa!');</script>boston",
+            writer.toString());
+    }
+
+}

Propchange: sling/whiteboard/ieb/handlebars/src/test/java/org/apache/sling/scripting/handlebars/HandlebarsScriptEngineFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native