/** * Test for the SE friendly handler adapter */ package org.springmodules.web.servlet.mvc; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import junit.framework.TestCase; /** * @author janm * */ public class SearchEngineFriendlyHandlerAdapterTest extends TestCase { private static final Log logger = LogFactory.getLog(SearchEngineFriendlyHandlerAdapterTest.class); private static final String GET = "get"; private List suffixes; private String queryStringSeparator = "~"; private String parameterSeparator = "_"; private String nameValueSeparator = "-"; private SearchEngineFriendlyHandlerAdapter adapter = new SearchEngineFriendlyHandlerAdapter(); /** * .ctor */ public SearchEngineFriendlyHandlerAdapterTest() { super(); suffixes = new ArrayList(); suffixes.add(".html"); } /** * Sets up adapter properties */ private void setAdapterProperties() { adapter.setQueryStringSeparator(queryStringSeparator); adapter.setNameValueSeparator(nameValueSeparator); adapter.setParameterSeparator(parameterSeparator); adapter.setSuffixes(suffixes); } /** * Tests simple request; the request should be equivalent to /foo.html?a=1&b=2 * @throws Exception */ public void testSimpleRequest() throws Exception { queryStringSeparator = "~"; parameterSeparator = "_"; nameValueSeparator = "-"; setAdapterProperties(); HttpServletRequest request = new MockHttpServletRequest(GET, "/foo~a-1_b-2.html"); adapter.handle(request, new MockHttpServletResponse(), new Controller() { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { assertEquals("a is not 1", "1", request.getParameter("a")); assertEquals("b is not 2", "2", request.getParameter("b")); assertEquals("not two parameters", 2, request.getParameterMap().size()); assertEquals("The uri should be /foo.html", "/foo.html", request.getRequestURI()); return null; } }); } /** * Tests simple request; the request should be equivalent to /foo.html?a=1&b=2 * @throws Exception */ public void testSimpleRequestMulticharSeparators() throws Exception { queryStringSeparator = ".qm."; parameterSeparator = ".am."; nameValueSeparator = ".eq."; setAdapterProperties(); HttpServletRequest request = new MockHttpServletRequest(GET, "/foo.qm.a.eq.1.am.b.eq.2.html"); adapter.handle(request, new MockHttpServletResponse(), new Controller() { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { assertEquals("a is not 1", "1", request.getParameter("a")); assertEquals("b is not 2", "2", request.getParameter("b")); assertEquals("not two parameters", 2, request.getParameterMap().size()); assertEquals("The uri should be /foo.html", "/foo.html", request.getRequestURI()); return null; } }); queryStringSeparator = "~"; parameterSeparator = "_"; nameValueSeparator = "-"; } /** * Tests that request with suffix not listed in the suffixes list will not get * processed * @throws Exception */ public void testOtherSuffix() throws Exception { setAdapterProperties(); HttpServletRequest request = new MockHttpServletRequest(GET, "/foo~a-1_b-2.gif"); adapter.handle(request, new MockHttpServletResponse(), new Controller() { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { assertEquals("The uri should be /foo~a-1_b-2.gif", "/foo~a-1_b-2.gif", request.getRequestURI()); assertEquals("there are parameters", 0, request.getParameterMap().size()); return null; } }); } /** * Tests multiple attributes with the same name in the request. This is equivalent * to foo.html?a=1&a=2...&a=n * @throws Exception */ public void testMultipleValues() throws Exception { setAdapterProperties(); HttpServletRequest request = new MockHttpServletRequest(GET, "/foo~a-1_a-2_b-3.html"); adapter.handle(request, new MockHttpServletResponse(), new Controller() { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String[] values = request.getParameterValues("a"); assertEquals("Should have two values", 2, values.length); // there is no guarantee that the values will be in order; we must sort the names boolean foundOne = false, foundTwo = false; for (int i = 0; i < values.length; i++) { foundOne = foundOne || values[i].equals("1"); foundTwo = foundTwo || values[i].equals("2"); } // check that we have found the values assertTrue("Value 1 not found in a", foundOne); assertTrue("Value 2 not found in a", foundTwo); // check that b has the value set to 3 assertEquals("b was not set to 3", "3", request.getParameter("b")); return null; } }); } }