blob: 887d554645690d641dc20ec94c7ecd8bcf9c6e8f [file] [log] [blame]
/*
* $Id$
*
* Copyright 2006 The Apache Software Foundation.
*
* Licensed 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.views.jsp;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.jsp.JspWriter;
import org.apache.struts2.components.URL;
/**
* Unit test for {@link URLTag}.
*
*/
public class URLTagTest extends AbstractUITagTest {
private URLTag tag;
/**
* To test priority of parameter passed in to url component though
* various way
* - current request url
* - tag's value attribute
* - tag's nested param tag
*
* id1
* ===
* - found in current request url
* - found in tag's value attribute
* - found in tag's param tag
* CONCLUSION: tag's param tag takes precedence (paramId1)
*
* id2
* ===
* - found in current request url
* - found in tag's value attribute
* CONCLUSION: tag's value attribute take precedence (tagId2)
*
* urlParam1
* =========
* - found in current request url
* CONCLUSION: param in current request url will be used (urlValue1)
*
* urlParam2
* =========
* - found in current request url
* CONCLUSION: param in current request url will be used. (urlValue2)
*
* tagId
* =====
* - found in tag's value attribute
* CONCLUSION: param in tag's value attribute wil; be used. (tagValue)
*
* param1
* ======
* - found in nested param tag
* CONCLUSION: param in nested param tag will be used. (param1value)
*
* param2
* ======
* - found in nested param tag
* CONCLUSION: param in nested param tag will be used. (param2value)
*/
public void testParametersPriority() throws Exception {
request.setQueryString("id1=urlId1&id2=urlId2&urlParam1=urlValue1&urlParam2=urlValue2");
tag.setValue("testAction.action?id1=tagId1&id2=tagId2&tagId=tagValue");
ParamTag param1 = new ParamTag();
param1.setPageContext(pageContext);
param1.setName("param1");
param1.setValue("%{'param1value'}");
ParamTag param2 = new ParamTag();
param2.setPageContext(pageContext);
param2.setName("param2");
param2.setValue("%{'param2value'}");
ParamTag param3 = new ParamTag();
param3.setPageContext(pageContext);
param3.setName("id1");
param3.setValue("%{'paramId1'}");
tag.doStartTag();
param1.doStartTag();
param1.doEndTag();
param2.doStartTag();
param2.doEndTag();
param3.doStartTag();
param3.doEndTag();
URL url = (URL) tag.getComponent();
Map parameters = url.getParameters();
assertNotNull(parameters);
assertEquals(parameters.size(), 7);
assertEquals(parameters.get("id1"), "paramId1");
assertEquals(parameters.get("id2"), "tagId2");
assertEquals(parameters.get("urlParam1"), "urlValue1");
assertEquals(parameters.get("urlParam2"), "urlValue2");
assertEquals(parameters.get("tagId"), "tagValue");
assertEquals(parameters.get("param1"), "param1value");
assertEquals(parameters.get("param2"), "param2value");
}
/**
* To test priority of parameter passed in to url component though
* various way, with includeParams="NONE"
* - current request url
* - tag's value attribute
* - tag's nested param tag
*
* In this case only parameters from the tag itself is taken into account.
* Those from request will not count, only those in tag's value attribute
* and nested param tag.
*
* @throws Exception
*/
public void testParametersPriorityWithIncludeParamsAsNONE() throws Exception {
request.setQueryString("id1=urlId1&id2=urlId2&urlParam1=urlValue1&urlParam2=urlValue2");
tag.setValue("testAction.action?id1=tagId1&id2=tagId2&tagId=tagValue");
tag.setIncludeParams("NONE");
ParamTag param1 = new ParamTag();
param1.setPageContext(pageContext);
param1.setName("param1");
param1.setValue("%{'param1value'}");
ParamTag param2 = new ParamTag();
param2.setPageContext(pageContext);
param2.setName("param2");
param2.setValue("%{'param2value'}");
ParamTag param3 = new ParamTag();
param3.setPageContext(pageContext);
param3.setName("id1");
param3.setValue("%{'paramId1'}");
tag.doStartTag();
param1.doStartTag();
param1.doEndTag();
param2.doStartTag();
param2.doEndTag();
param3.doStartTag();
param3.doEndTag();
URL url = (URL) tag.getComponent();
Map parameters = url.getParameters();
assertEquals(parameters.size(), 5);
assertEquals(parameters.get("id1"), "paramId1");
assertEquals(parameters.get("id2"), "tagId2");
assertEquals(parameters.get("tagId"), "tagValue");
assertEquals(parameters.get("param1"), "param1value");
assertEquals(parameters.get("param2"), "param2value");
}
public void testIncludeParamsDefaultToGET() throws Exception {
request.setQueryString("one=oneVal&two=twoVal&three=threeVal");
// request parameter map should not have any effect, as includeParams
// default to GET, which get its param from request.getQueryString()
Map tmp = new HashMap();
tmp.put("one", "aaa");
tmp.put("two", "bbb");
tmp.put("three", "ccc");
request.setParameterMap(tmp);
tag.setValue("TestAction.acton");
tag.doStartTag();
URL url = (URL) tag.getComponent();
Map parameters = url.getParameters();
tag.doEndTag();
assertEquals(parameters.get("one"), "oneVal");
assertEquals(parameters.get("two"), "twoVal");
assertEquals(parameters.get("three"), "threeVal");
}
public void testActionURL() throws Exception {
tag.setValue("TestAction.action");
tag.doStartTag();
tag.doEndTag();
assertEquals("TestAction.action", writer.toString());
}
public void testAddParameters() throws Exception {
request.setAttribute("struts.request_uri", "/Test.action");
request.setAttribute("struts.request_uri", "/TestAction.action");
request.setQueryString("param0=value0");
tag.doStartTag();
tag.component.addParameter("param1", "value1");
tag.component.addParameter("param2", "value2");
tag.doEndTag();
assertEquals("/TestAction.action?param2=value2&param0=value0&param1=value1", writer.toString());
}
public void testEvaluateValue() throws Exception {
Foo foo = new Foo();
foo.setTitle("test");
stack.push(foo);
tag.setValue("%{title}");
tag.doStartTag();
tag.doEndTag();
assertEquals("test", writer.toString());
}
public void testHttps() throws Exception {
request.setScheme("https");
request.setServerName("localhost");
request.setServerPort(443);
tag.setValue("list-members.action");
tag.doStartTag();
tag.doEndTag();
assertEquals("list-members.action", writer.toString());
}
public void testAnchor() throws Exception {
request.setScheme("https");
request.setServerName("localhost");
request.setServerPort(443);
tag.setValue("list-members.action");
tag.setAnchor("test");
tag.doStartTag();
tag.doEndTag();
assertEquals("list-members.action#test", writer.toString());
}
public void testParamPrecedence() throws Exception {
request.setRequestURI("/context/someAction.action");
request.setQueryString("id=22&name=John");
URLTag urlTag = new URLTag();
urlTag.setPageContext(pageContext);
urlTag.setIncludeParams("get");
urlTag.setEncode("%{false}");
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setName("id");
paramTag.setValue("%{'33'}");
urlTag.doStartTag();
paramTag.doStartTag();
paramTag.doEndTag();
urlTag.doEndTag();
assertEquals(writer.getBuffer().toString(), "/context/someAction.action?name=John&id=33");
}
public void testParamPrecedenceWithAnchor() throws Exception {
request.setRequestURI("/context/someAction.action");
request.setQueryString("id=22&name=John");
URLTag urlTag = new URLTag();
urlTag.setPageContext(pageContext);
urlTag.setIncludeParams("get");
urlTag.setEncode("%{false}");
urlTag.setAnchor("testAnchor");
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setName("id");
paramTag.setValue("%{'33'}");
urlTag.doStartTag();
paramTag.doStartTag();
paramTag.doEndTag();
urlTag.doEndTag();
assertEquals(writer.getBuffer().toString(), "/context/someAction.action?name=John&id=33#testAnchor");
}
public void testPutId() throws Exception {
tag.setValue("/public/about");
assertEquals(null, stack.findString("myId")); // nothing in stack
tag.setId("myId");
tag.doStartTag();
tag.doEndTag();
assertEquals("", writer.toString());
assertEquals("/public/about", stack.findString("myId")); // is in stack now
}
public void testUsingValueOnly() throws Exception {
tag.setValue("/public/about/team.jsp");
tag.doStartTag();
tag.doEndTag();
assertEquals("/public/about/team.jsp", writer.toString());
}
public void testRequestURIActionIncludeNone() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team&company=acme inc");
tag.setAction("team");
tag.setIncludeParams("none");
tag.doStartTag();
tag.doEndTag();
assertEquals("/team.action", writer.toString());
}
public void testRequestURIActionIncludeGet() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team&company=acme inc");
tag.setAction("team");
tag.setIncludeParams("get");
tag.doStartTag();
tag.doEndTag();
assertEquals("/team.action?section=team&company=acme+inc", writer.toString());
}
public void testRequestURINoActionIncludeNone() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team&company=acme inc");
tag.setAction(null);
tag.setIncludeParams("none");
tag.doStartTag();
tag.doEndTag();
assertEquals("/public/about", writer.toString());
}
public void testNoActionIncludeGet() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team&company=acme inc");
tag.setAction(null);
tag.setIncludeParams("get");
tag.doStartTag();
tag.doEndTag();
assertEquals("/public/about?section=team&company=acme+inc", writer.toString());
}
public void testRequestURIActionIncludeAll() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team&company=acme inc");
tag.setAction("team");
tag.setIncludeParams("all");
tag.doStartTag();
// include nested param tag
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setName("year");
paramTag.setValue("2006");
paramTag.doStartTag();
paramTag.doEndTag();
tag.doEndTag();
assertEquals("/team.action?section=team&year=2006&company=acme+inc", writer.toString());
}
public void testRequestURINoActionIncludeAll() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team&company=acme inc");
tag.setAction(null);
tag.setIncludeParams("all");
tag.doStartTag();
// include nested param tag
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setName("year");
paramTag.setValue("2006");
paramTag.doStartTag();
paramTag.doEndTag();
tag.doEndTag();
assertEquals("/public/about?section=team&year=2006&company=acme+inc", writer.toString());
}
public void testUnknownIncludeParam() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("section=team");
tag.setIncludeParams("unknown"); // will log at WARN level
tag.doStartTag();
tag.doEndTag();
assertEquals("/public/about", writer.toString()); // should not add any request parameters
}
public void testRequestURIWithAnchor() throws Exception {
request.setRequestURI("/public/about");
request.setQueryString("company=acme inc#canada");
tag.setAction("company");
tag.setIncludeParams("get");
tag.doStartTag();
tag.doEndTag();
assertEquals("/company.action?company=acme+inc", writer.toString()); // will always chop anchor if using requestURI
}
public void testIncludeContext() throws Exception {
request.setupGetContext("/myapp");
tag.setIncludeContext("true");
tag.setAction("company");
tag.doStartTag();
tag.doEndTag();
assertEquals("/myapp/company.action", writer.toString());
}
protected void setUp() throws Exception {
super.setUp();
request.setScheme("http");
request.setServerName("localhost");
request.setServerPort(80);
tag = new URLTag();
tag.setPageContext(pageContext);
JspWriter jspWriter = new StrutsMockJspWriter(writer);
pageContext.setJspWriter(jspWriter);
}
public class Foo {
private String title;
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public String toString() {
return "Foo is: " + title;
}
}
}