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 <[email protected]> Authored: Sat Dec 23 17:43:33 2017 -0500 Committer: Woonsan Ko <[email protected]> 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>
