blob: 6487bcc0cd0a00b1a465d434ce5ea57ef5c73776 [file] [log] [blame]
/*
* $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.views.jsp;
import java.util.HashMap;
import java.util.Map;
import javax.portlet.PortletContext;
import javax.portlet.PortletMode;
import javax.portlet.PortletModeException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.WindowState;
import javax.portlet.WindowStateException;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.StrutsTestCase;
import org.apache.struts2.portlet.PortletActionConstants;
import org.apache.struts2.portlet.servlet.PortletServletRequest;
import org.apache.struts2.portlet.util.PortletUrlHelper;
import org.springframework.mock.web.portlet.MockPortalContext;
import org.springframework.mock.web.portlet.MockPortletContext;
import org.springframework.mock.web.portlet.MockPortletURL;
import org.springframework.mock.web.portlet.MockRenderRequest;
import org.springframework.mock.web.portlet.MockRenderResponse;
import com.mockobjects.servlet.MockJspWriter;
import com.mockobjects.servlet.MockPageContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.mock.MockActionInvocation;
import com.opensymphony.xwork2.mock.MockActionProxy;
import com.opensymphony.xwork2.util.ValueStack;
/**
*/
@SuppressWarnings("unchecked")
public class PortletUrlTagTest extends StrutsTestCase {
private URLTag tag = new URLTag();
private ValueStack stack = null;
private ActionContext context = null;
private MockRenderRequest renderRequest;
private MockPortletUrl renderUrl;
private MockPortletUrl actionUrl;
private MockRenderResponse renderResponse;
private MockPageContext pageContext;
private MockActionInvocation actionInvocation;
private MockActionProxy actionProxy;
private MockJspWriter jspWriter;
private MockPortletContext portletContext;
public void setUp() throws Exception {
super.setUp();
context = ActionContext.getContext();
stack = context.getValueStack();
portletContext = new MockPortletContext();
renderRequest = new MockRenderRequest();
renderRequest.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
renderUrl = new MockPortletUrl("render");
actionUrl = new MockPortletUrl("action");
renderResponse = new MockRenderResponse() {
@Override
public PortletURL createRenderURL() {
return renderUrl;
}
@Override
public PortletURL createActionURL() {
return actionUrl;
}
};
Map modeMap = new HashMap();
modeMap.put(PortletMode.VIEW, "/view");
modeMap.put(PortletMode.HELP, "/help");
modeMap.put(PortletMode.EDIT, "/edit");
context.put(PortletActionConstants.REQUEST, renderRequest);
context.put(PortletActionConstants.RESPONSE, renderResponse);
context.put(PortletActionConstants.PHASE, PortletActionConstants.RENDER_PHASE);
context.put(PortletActionConstants.MODE_NAMESPACE_MAP, modeMap);
context.put(StrutsStatics.STRUTS_PORTLET_CONTEXT, portletContext);
actionInvocation = new MockActionInvocation();
actionProxy = new MockActionProxy();
actionInvocation.setAction(new Object());
actionInvocation.setProxy(actionProxy);
actionInvocation.setStack(stack);
context.setActionInvocation(actionInvocation);
pageContext = new MockPageContext();
pageContext.setRequest(new PortletServletRequest(renderRequest, null));
jspWriter = new MockJspWriter();
pageContext.setJspWriter(jspWriter);
tag.setPageContext(pageContext);
}
public void testEnsureParamsAreStringArrays() {
Map params = new HashMap();
params.put("param1", "Test1");
params.put("param2", new String[] { "Test2" });
Map result = PortletUrlHelper.ensureParamsAreStringArrays(params);
assertEquals(2, result.size());
assertTrue(result.get("param1") instanceof String[]);
}
public void testSetWindowState() throws Exception {
tag.setAction("testAction");
tag.setWindowState("maximized");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/testAction", renderUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals(PortletMode.VIEW.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.VIEW, renderUrl.getPortletMode());
assertEquals(WindowState.MAXIMIZED, renderUrl.getWindowState());
}
public void testSetPortletMode() throws Exception {
tag.setAction("testAction");
tag.setPortletMode("help");
tag.doStartTag();
tag.doEndTag();
assertEquals("/help/testAction", renderUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals(PortletMode.HELP.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.HELP, renderUrl.getPortletMode());
assertEquals(WindowState.NORMAL, renderUrl.getWindowState());
}
public void testUrlWithQueryParams() throws Exception {
tag.setAction("testAction?testParam1=testValue1");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/testAction", renderUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals("testValue1", renderUrl.getParameter("testParam1"));
assertEquals(PortletMode.VIEW.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.VIEW, renderUrl.getPortletMode());
assertEquals(WindowState.NORMAL, renderUrl.getWindowState());
}
public void testActionUrl() throws Exception {
tag.setAction("testAction");
tag.setPortletUrlType("action");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/testAction", actionUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals(PortletMode.VIEW, actionUrl.getPortletMode());
assertEquals(WindowState.NORMAL, actionUrl.getWindowState());
}
public void testResourceUrl() throws Exception {
renderRequest.setContextPath("/myPortlet");
jspWriter.setExpectedData("/myPortlet/image.gif");
tag.setValue("image.gif");
tag.doStartTag();
tag.doEndTag();
jspWriter.verify();
}
public void testResourceUrlWithNestedParam() throws Exception {
renderRequest.setContextPath("/myPortlet");
jspWriter.setExpectedData("/myPortlet/image.gif?testParam1=testValue1");
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setParent(tag);
paramTag.setName("testParam1");
paramTag.setValue("'testValue1'");
tag.setValue("image.gif");
tag.doStartTag();
paramTag.doStartTag();
paramTag.doEndTag();
tag.doEndTag();
jspWriter.verify();
}
public void testResourceUrlWithTwoNestedParam() throws Exception {
renderRequest.setContextPath("/myPortlet");
jspWriter.setExpectedData("/myPortlet/image.gif?testParam1=testValue1&testParam2=testValue2");
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setParent(tag);
paramTag.setName("testParam1");
paramTag.setValue("'testValue1'");
ParamTag paramTag2 = new ParamTag();
paramTag2.setPageContext(pageContext);
paramTag2.setParent(tag);
paramTag2.setName("testParam2");
paramTag2.setValue("'testValue2'");
tag.setValue("image.gif");
tag.doStartTag();
paramTag.doStartTag();
paramTag.doEndTag();
paramTag2.doStartTag();
paramTag2.doEndTag();
tag.doEndTag();
jspWriter.verify();
}
public void testResourceUrlWithNestedParamThatIsNotString() throws Exception {
renderRequest.setContextPath("/myPortlet");
jspWriter.setExpectedData("/myPortlet/image.gif?id=5");
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setParent(tag);
paramTag.setName("id");
paramTag.setValue("5");
tag.setValue("image.gif");
tag.doStartTag();
paramTag.doStartTag();
paramTag.doEndTag();
tag.doEndTag();
jspWriter.verify();
}
public void testResourceUrlWithNestedOgnlExpressionParamThatIsNotString() throws Exception {
renderRequest.setContextPath("/myPortlet");
jspWriter.setExpectedData("/myPortlet/image.gif?id=5");
Object o = new Object() {
public Integer getId() {
return 5;
}
};
tag.getStack().push(o);
ParamTag paramTag = new ParamTag();
paramTag.setPageContext(pageContext);
paramTag.setParent(tag);
paramTag.setName("id");
paramTag.setValue("id");
tag.setValue("image.gif");
tag.doStartTag();
paramTag.doStartTag();
paramTag.doEndTag();
tag.doEndTag();
jspWriter.verify();
}
public void testUrlWithMethod() throws Exception {
tag.setAction("testAction");
tag.setMethod("input");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/testAction!input", renderUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals(PortletMode.VIEW.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.VIEW, renderUrl.getPortletMode());
assertEquals(WindowState.NORMAL, renderUrl.getWindowState());
}
public void testUrlWithNoActionOrMethod() throws Exception {
actionProxy.setActionName("currentExecutingAction");
actionProxy.setNamespace("/currentNamespace");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/currentNamespace/currentExecutingAction", renderUrl
.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals(PortletMode.VIEW.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.VIEW, renderUrl.getPortletMode());
assertEquals(WindowState.NORMAL, renderUrl.getWindowState());
}
public void testUrlShouldNotIncludeParamsFromHttpQueryString() throws Exception {
PortletServletRequestWithQueryString req = new PortletServletRequestWithQueryString(renderRequest, null);
req.setQueryString("thisParamShouldNotBeIncluded=thisValueShouldNotBeIncluded");
pageContext.setRequest(req);
tag.setAction("testAction?testParam1=testValue1");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/testAction", renderUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals("testValue1", renderUrl.getParameter("testParam1"));
assertNull(renderUrl.getParameter("thisParamShouldNotBeIncluded"));
assertEquals(PortletMode.VIEW.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.VIEW, renderUrl.getPortletMode());
assertEquals(WindowState.NORMAL, renderUrl.getWindowState());
}
public void testUrlShouldIgnoreIncludeParams() throws Exception {
PortletServletRequestWithQueryString req = new PortletServletRequestWithQueryString(renderRequest, null);
req.setQueryString("thisParamShouldNotBeIncluded=thisValueShouldNotBeIncluded");
pageContext.setRequest(req);
tag.setAction("testAction?testParam1=testValue1");
tag.setIncludeParams("GET");
tag.doStartTag();
tag.doEndTag();
assertEquals("/view/testAction", renderUrl.getParameter(PortletActionConstants.ACTION_PARAM));
assertEquals("testValue1", renderUrl.getParameter("testParam1"));
assertNull(renderUrl.getParameter("thisParamShouldNotBeIncluded"));
assertEquals(PortletMode.VIEW.toString(), renderUrl.getParameter(PortletActionConstants.MODE_PARAM));
assertEquals(PortletMode.VIEW, renderUrl.getPortletMode());
assertEquals(WindowState.NORMAL, renderUrl.getWindowState());
}
private static class PortletServletRequestWithQueryString extends PortletServletRequest {
private String queryString;
public PortletServletRequestWithQueryString(PortletRequest portletRequest, PortletContext portletContext) {
super(portletRequest, portletContext);
}
public void setQueryString(String queryString) {
this.queryString = queryString;
}
@Override
public String getQueryString() {
return queryString;
}
}
private static class MockPortletUrl extends MockPortletURL {
private PortletMode portletMode;
private WindowState windowState;
public MockPortletUrl(String urlType) {
super(new MockPortalContext(), urlType);
}
@Override
public void setPortletMode(PortletMode portletMode) throws PortletModeException {
super.setPortletMode(portletMode);
this.portletMode = portletMode;
}
public PortletMode getPortletMode() {
return portletMode;
}
@Override
public void setWindowState(WindowState windowState) throws WindowStateException {
super.setWindowState(windowState);
this.windowState = windowState;
}
public WindowState getWindowState() {
return windowState;
}
}
}