/* * $Id$ * * 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.struts2.rest; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import junit.framework.TestCase; import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.springframework.mock.web.MockHttpServletRequest; public class RestActionMapperTest extends TestCase { private RestActionMapper mapper; private ConfigurationManager configManager; private Configuration config; private MockHttpServletRequest req; private String allowDynamicMethodInvocation = "true"; protected void setUp() throws Exception { super.setUp(); req = new MockHttpServletRequest(); req.setContextPath("/myapp"); req.setMethod("GET"); mapper = new RestActionMapper(); config = new DefaultConfiguration(); PackageConfig pkg = new PackageConfig.Builder("myns").namespace("/animals").build(); PackageConfig pkg2 = new PackageConfig.Builder("my").namespace("/my").build(); config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); configManager = new ConfigurationManager() { public Configuration getConfiguration() { return config; } }; } public void testRootMapping() throws Exception { req.setRequestURI("/myapp/"); req.setServletPath("/"); ActionMapping mapping = mapper.getMapping(req, configManager); assertNull(mapping); } public void testGetMapping() throws Exception { req.setRequestURI("/myapp/animals/dog"); req.setServletPath("/animals/dog"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("index", mapping.getMethod()); } public void testPostMapping() throws Exception { req.setRequestURI("/myapp/animals/dog"); req.setServletPath("/animals/dog"); req.setMethod("POST"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("create", mapping.getMethod()); } public void testDeleteMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido"); req.setServletPath("/animals/dog/fido"); req.setMethod("DELETE"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("destroy", mapping.getMethod()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); } public void testPutMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido"); req.setServletPath("/animals/dog/fido"); req.setMethod("PUT"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("update", mapping.getMethod()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); } public void testGetIdMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido"); req.setServletPath("/animals/dog/fido"); req.setMethod("GET"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("show", mapping.getMethod()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); } public void testNewMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/new"); req.setServletPath("/animals/dog/new"); req.setMethod("GET"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("editNew", mapping.getMethod()); } public void testEditMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido/edit"); req.setServletPath("/animals/dog/fido/edit"); req.setMethod("GET"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); assertEquals("edit", mapping.getMethod()); } public void testEditSemicolonMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido;edit"); req.setServletPath("/animals/dog/fido;edit"); req.setMethod("GET"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); assertEquals("edit", mapping.getMethod()); } public void testGetJsessionIdSemicolonMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido;jsessionid=29fefpv23do1g"); req.setServletPath("/animals/dog/fido"); req.setMethod("GET"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); assertEquals("show", mapping.getMethod()); } public void testParseNameAndNamespace() { tryUri("/foo/23", "", "foo/23"); tryUri("/foo/", "", "foo/"); tryUri("foo", "", "foo"); tryUri("/", "/", ""); } public void testParseNameAndNamespaceWithNamespaces() { tryUri("/my/foo/23", "/my", "foo/23"); tryUri("/my/foo/", "/my", "foo/"); } public void testParseNameAndNamespaceWithEdit() { tryUri("/my/foo/23;edit", "/my", "foo/23;edit"); } public void testShouldAllowExclamation() throws Exception { req.setRequestURI("/myapp/animals/dog/fido!edit"); req.setServletPath("/animals/dog/fido!edit"); req.setMethod("GET"); mapper.setAllowDynamicMethodCalls("true"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); assertEquals("edit", mapping.getMethod()); } public void testShouldBlockDynamicMethodInvocationAnsUseShow() throws Exception { req.setRequestURI("/myapp/animals/dog/fido!edit"); req.setServletPath("/animals/dog/fido!edit"); req.setMethod("GET"); mapper.setAllowDynamicMethodCalls("false"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); assertEquals("show", mapping.getMethod()); } public void testShouldBlockDynamicMethodInvocationAnsUseDestroy() throws Exception { req.setRequestURI("/myapp/animals/dog/fido!destroy"); req.setServletPath("/animals/dog/fido!destroy"); req.setMethod("DELETE"); mapper.setAllowDynamicMethodCalls("false"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); assertEquals("destroy", mapping.getMethod()); } public void testShouldBlockDynamicMethodInvocationAndUseUpdate() throws Exception { req.setRequestURI("/myapp/animals/dog/fido!update"); req.setServletPath("/animals/dog/fido!update"); req.setMethod("PUT"); mapper.setAllowDynamicMethodCalls("false"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("fido", ((String[])mapping.getParams().get("id"))[0]); assertEquals("update", mapping.getMethod()); } private void tryUri(String uri, String expectedNamespace, String expectedName) { ActionMapping mapping = new ActionMapping(); mapper.setAllowDynamicMethodCalls(allowDynamicMethodInvocation); mapper.parseNameAndNamespace(uri, mapping, configManager); assertEquals(expectedName, mapping.getName()); assertEquals(expectedNamespace, mapping.getNamespace()); } public void testOptionsMapping() throws Exception { req.setRequestURI("/myapp/animals/dog"); req.setServletPath("/animals/dog"); req.setMethod("OPTIONS"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("options", mapping.getMethod()); } public void testPostContinueMapping() throws Exception { req.setRequestURI("/myapp/animals/dog"); req.setServletPath("/animals/dog"); req.setMethod("POST"); req.addHeader("Expect", "100-continue"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("createContinue", mapping.getMethod()); } public void testPutContinueMapping() throws Exception { req.setRequestURI("/myapp/animals/dog/fido"); req.setServletPath("/animals/dog/fido"); req.setMethod("PUT"); req.addHeader("Expect", "100-continue"); ActionMapping mapping = mapper.getMapping(req, configManager); assertEquals("/animals", mapping.getNamespace()); assertEquals("dog", mapping.getName()); assertEquals("updateContinue", mapping.getMethod()); assertEquals("fido", ((String[]) mapping.getParams().get("id"))[0]); } public void testDynamicMethodInvocation() throws Exception { // given req.setRemoteAddr("/myapp/animals/dog/23!edit"); req.setServletPath("/animals/dog/23!edit"); req.setMethod("GET"); mapper.setAllowDynamicMethodCalls("true"); // when ActionMapping actionMapping = mapper.getMapping(req, configManager); // then assertEquals("dog", actionMapping.getName()); assertEquals("edit", actionMapping.getMethod()); assertEquals("/animals", actionMapping.getNamespace()); assertEquals("23", ((String[]) actionMapping.getParams().get("id"))[0]); } }