You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by wo...@apache.org on 2018/01/04 19:49:25 UTC

[02/13] incubator-freemarker git commit: FREEMARKER-55: skeletal unit test for input tag

FREEMARKER-55: skeletal unit test for input tag


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/fb2ae5cc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/fb2ae5cc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/fb2ae5cc

Branch: refs/heads/3
Commit: fb2ae5cc81c4160c7bc694e0d85b8d979a61db49
Parents: 150ad7f
Author: Woonsan Ko <wo...@apache.org>
Authored: Sat Dec 23 17:43:33 2017 -0500
Committer: Woonsan Ko <wo...@apache.org>
Committed: Sat Dec 23 17:43:33 2017 -0500

----------------------------------------------------------------------
 .../model/SpringTemplateCallableHashModel.java  |  3 +
 ...stractHtmlElementTemplateDirectiveModel.java | 21 ++++++
 .../model/form/InputTemplateDirectiveModel.java | 19 +-----
 .../SpringFormTemplateCallableHashModel.java    | 57 ++++++++++++++++
 .../form/InputTemplateDirectiveModelTest.java   | 71 ++++++++++++++++++++
 .../test/model/form/input-directive-usages.ftlh | 27 ++++++++
 6 files changed, 180 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
index eb17233..762222c 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
@@ -30,6 +30,7 @@ import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.spring.model.form.SpringFormTemplateCallableHashModel;
 
 /**
  * TemplateHashModel wrapper for templates using Spring directives, functions and internal models.
@@ -67,6 +68,8 @@ public final class SpringTemplateCallableHashModel implements TemplateHashModel,
         modelsMap.put(TransformFunction.NAME, new TransformFunction(request, response));
         modelsMap.put(UrlFunction.NAME, new UrlFunction(request, response));
         modelsMap.put(EvalFunction.NAME, new EvalFunction(request, response));
+
+        modelsMap.put(SpringFormTemplateCallableHashModel.NAME, new SpringFormTemplateCallableHashModel(request, response));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
index a0766f8..23b3d43 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
@@ -11,6 +11,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
@@ -53,6 +54,16 @@ public abstract class AbstractHtmlElementTemplateDirectiveModel
                     "onkeydown")
             );
 
+    private static final int PATH_PARAM_IDX = 0;
+
+    private static final ArgumentArrayLayout ARGS_LAYOUT =
+            ArgumentArrayLayout.create(
+                    1,
+                    false,
+                    null,
+                    true
+                    );
+
     private Map<String, Object> attributes;
     private Map<String, Object> unmodifiableAttributes = Collections.emptyMap();
 
@@ -60,6 +71,11 @@ public abstract class AbstractHtmlElementTemplateDirectiveModel
         super(request, response);
     }
 
+    @Override
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
+        return ARGS_LAYOUT;
+    }
+
     public Map<String, Object> getAttributes() {
         return unmodifiableAttributes;
     }
@@ -81,6 +97,11 @@ public abstract class AbstractHtmlElementTemplateDirectiveModel
         attributes.put(localName, value);
     }
 
+    protected String getPathArgument(TemplateModel[] args) throws TemplateException {
+        final String path = CallableUtils.getStringArgument(args, PATH_PARAM_IDX, this);
+        return path;
+    }
+
     protected boolean isAllowedAttribute(String localName, Object value) {
         return ALLOWED_ATTRIBUTES.containsKey(localName.toUpperCase());
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
index 293da38..60dbe6a 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
@@ -11,10 +11,8 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.util.CallableUtils;
 import org.springframework.web.servlet.support.RequestContext;
 
 public class InputTemplateDirectiveModel extends AbstractHtmlElementTemplateDirectiveModel {
@@ -32,16 +30,6 @@ public class InputTemplateDirectiveModel extends AbstractHtmlElementTemplateDire
                     )
             );
 
-    private static final int PATH_PARAM_IDX = 0;
-
-    private static final ArgumentArrayLayout ARGS_LAYOUT =
-            ArgumentArrayLayout.create(
-                    1,
-                    false,
-                    null,
-                    true
-                    );
-
     protected InputTemplateDirectiveModel(HttpServletRequest request, HttpServletResponse response) {
         super(request, response);
     }
@@ -52,16 +40,11 @@ public class InputTemplateDirectiveModel extends AbstractHtmlElementTemplateDire
     }
 
     @Override
-    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
-        return ARGS_LAYOUT;
-    }
-
-    @Override
     protected void executeInternal(TemplateModel[] args, CallPlace callPlace, Writer out, Environment env,
             ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper, RequestContext requestContext)
             throws TemplateException, IOException {
 
-        final String path = CallableUtils.getStringArgument(args, PATH_PARAM_IDX, this);
+        final String path = getPathArgument(args);
         setAttributes(args);
 
         // TODO: convert value properly and write tag and attributes properly.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
new file mode 100644
index 0000000..aeec2bb
--- /dev/null
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
@@ -0,0 +1,57 @@
+/*
+ * 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 ASF 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.freemarker.spring.model.form;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.TemplateHashModel;
+import org.apache.freemarker.core.model.TemplateModel;
+
+/**
+ * TemplateHashModel wrapper for templates using Spring directives, functions and internal models.
+ */
+//TODO [FM3] Shouldn't this be a TemplateHashModelEx?
+public final class SpringFormTemplateCallableHashModel implements TemplateHashModel, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Spring form namespace model name.
+     */
+    public static final String NAME = "form";
+
+    private final Map<String, TemplateModel> modelsMap = new HashMap<>();
+
+    public SpringFormTemplateCallableHashModel(final HttpServletRequest request, final HttpServletResponse response) {
+        modelsMap.put(InputTemplateDirectiveModel.NAME, new InputTemplateDirectiveModel(request, response));
+    }
+
+    @Override
+    public TemplateModel get(String key) throws TemplateException {
+        return modelsMap.get(key);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java
new file mode 100644
index 0000000..048d935
--- /dev/null
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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 ASF 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.freemarker.spring.model.form;
+
+import org.apache.freemarker.spring.example.mvc.users.User;
+import org.apache.freemarker.spring.example.mvc.users.UserRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration("classpath:META-INF/web-resources")
+@ContextConfiguration(locations = { "classpath:org/apache/freemarker/spring/example/mvc/users/users-mvc-context.xml" })
+public class InputTemplateDirectiveModelTest {
+
+    @Autowired
+    private WebApplicationContext wac;
+
+    @Autowired
+    private UserRepository userRepository;
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUp() {
+        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
+    }
+
+    @Test
+    public void testBasicUsages() throws Exception {
+        final Long userId = userRepository.getUserIds().iterator().next();
+        final User user = userRepository.getUser(userId);
+        mockMvc.perform(get("/users/{userId}/", userId).param("viewName", "test/model/form/input-directive-usages")
+                .accept(MediaType.parseMediaType("text/html"))).andExpect(status().isOk())
+                .andExpect(content().contentTypeCompatibleWith("text/html")).andDo(print())
+                .andExpect(xpath("//div[@id='userEmail']/input/@type").string("text"))
+                .andExpect(xpath("//div[@id='userEmail']/input/@value").string(user.getEmail()));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh b/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh
new file mode 100644
index 0000000..801b234
--- /dev/null
+++ b/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh
@@ -0,0 +1,27 @@
+<#--
+  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 ASF 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.
+-->
+<html>
+<body>
+
+  <div id="userEmail">
+    <@spring.form.input 'user.email' type='text' value='${user.email!}' />
+  </div>
+
+</body>
+</html>