/* | |
* $Id: PortletUrlTagTest.java 609901 2008-01-08 08:18:23Z nilsga $ | |
* | |
* 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.Arrays; | |
import java.util.HashMap; | |
import java.util.Iterator; | |
import java.util.Map; | |
import javax.portlet.*; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletResponse; | |
import javax.servlet.jsp.PageContext; | |
import junit.textui.TestRunner; | |
import org.apache.struts2.dispatcher.Dispatcher; | |
import org.apache.struts2.portlet.PortletActionConstants; | |
import org.apache.struts2.portlet.util.PortletUrlHelper; | |
import org.apache.struts2.StrutsStatics; | |
import static org.apache.struts2.StrutsStatics.*; | |
import org.jmock.Mock; | |
import org.jmock.cglib.MockObjectTestCase; | |
import org.jmock.core.Constraint; | |
import com.mockobjects.servlet.MockJspWriter; | |
import com.opensymphony.xwork2.ActionContext; | |
import com.opensymphony.xwork2.ActionInvocation; | |
import com.opensymphony.xwork2.ActionProxy; | |
import static com.opensymphony.xwork2.ActionContext.SESSION; | |
import static com.opensymphony.xwork2.ActionContext.PARAMETERS; | |
import com.opensymphony.xwork2.util.ValueStack; | |
import com.opensymphony.xwork2.util.ValueStackFactory; | |
/** | |
*/ | |
@SuppressWarnings("unchecked") | |
public class PortletUrlTagTest extends MockObjectTestCase { | |
URLTag tag = new URLTag(); | |
Mock mockHttpReq = null; | |
Mock mockHttpRes = null; | |
Mock mockPortletReq = null; | |
Mock mockPortletRes = null; | |
Mock mockPageCtx = null; | |
Mock mockPortletUrl = null; | |
MockJspWriter mockJspWriter = null; | |
Mock mockCtx = null; | |
ValueStack stack = null; | |
public static void main(String[] args) { | |
TestRunner.run(PortletUrlTagTest.class); | |
} | |
public void setUp() throws Exception { | |
super.setUp(); | |
Dispatcher du = new Dispatcher(null, new HashMap()); | |
du.init(); | |
Dispatcher.setInstance(du); | |
stack = du.getContainer().getInstance(ValueStackFactory.class).createValueStack(); | |
stack.getContext().put(ActionContext.CONTAINER, du.getContainer()); | |
ActionContext.setContext(new ActionContext(stack.getContext())); | |
mockHttpReq = mock(HttpServletRequest.class); | |
mockHttpRes = mock(HttpServletResponse.class); | |
mockPortletReq = mock(RenderRequest.class); | |
mockPortletRes = mock(RenderResponse.class); | |
mockPageCtx = mock(PageContext.class); | |
mockPortletUrl = mock(PortletURL.class); | |
mockJspWriter = new MockJspWriter(); | |
mockCtx = mock(PortletContext.class); | |
mockPageCtx.stubs().method("getRequest").will( | |
returnValue((HttpServletRequest) mockHttpReq.proxy())); | |
mockPageCtx.stubs().method("getResponse").will( | |
returnValue((HttpServletResponse) mockHttpRes.proxy())); | |
mockPageCtx.stubs().method("getOut").will(returnValue(mockJspWriter)); | |
mockHttpReq.stubs().method("getScheme").will(returnValue("http")); | |
mockHttpReq.stubs().method("getAttribute").with( | |
eq("struts.valueStack")).will(returnValue(stack)); | |
mockHttpReq.stubs().method("getAttribute").with( | |
eq("javax.portlet.response")).will( | |
returnValue((PortletResponse) mockPortletRes.proxy())); | |
mockHttpReq.stubs().method("getAttribute").with( | |
eq("javax.portlet.request")).will( | |
returnValue((PortletRequest) mockPortletReq.proxy())); | |
mockPortletReq.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW)); | |
mockPortletReq.stubs().method("getWindowState").will(returnValue(WindowState.NORMAL)); | |
mockPortletReq.stubs().method("getContextPath").will(returnValue("/contextPath")); | |
tag.setPageContext((PageContext) mockPageCtx.proxy()); | |
Map modeMap = new HashMap(); | |
modeMap.put(PortletMode.VIEW, "/view"); | |
modeMap.put(PortletMode.HELP, "/help"); | |
modeMap.put(PortletMode.EDIT, "/edit"); | |
Map sessionMap = new HashMap(); | |
Map contextMap = new HashMap(); | |
contextMap.put(ActionContext.SESSION, sessionMap); | |
contextMap.put(PortletActionConstants.REQUEST, mockPortletReq.proxy()); | |
contextMap.put(PortletActionConstants.RESPONSE, mockPortletRes.proxy()); | |
contextMap.put(PortletActionConstants.PHASE, PortletActionConstants.RENDER_PHASE); | |
contextMap.put(PortletActionConstants.MODE_NAMESPACE_MAP, modeMap); | |
contextMap.put(STRUTS_PORTLET_CONTEXT, mockCtx.proxy()); | |
ActionContext ctx = new ActionContext(contextMap); | |
ctx.setValueStack(stack); | |
ActionContext.setContext(ctx); | |
} | |
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 { | |
PortletMode mode = PortletMode.VIEW; | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("createRenderURL").will( | |
returnValue((PortletURL) mockPortletUrl.proxy())); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
Map paramMap = new HashMap(); | |
paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction"}); | |
paramMap.put(PortletActionConstants.MODE_PARAM, new String[]{mode.toString()}); | |
mockPortletUrl.expects(once()).method("setParameters").with(new ParamMapConstraint(paramMap)); | |
mockPortletUrl.expects(once()).method("setWindowState").with(eq(WindowState.MAXIMIZED)); | |
mockPortletUrl.expects(once()).method("setPortletMode").with(eq(PortletMode.VIEW)); | |
tag.setAction("testAction"); | |
tag.setWindowState("maximized"); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
} | |
public void testSetPortletMode() throws Exception { | |
PortletMode mode = PortletMode.HELP; | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("createRenderURL").will( | |
returnValue((PortletURL) mockPortletUrl.proxy())); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
Map paramMap = new HashMap(); | |
paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/help/testAction"}); | |
paramMap.put(PortletActionConstants.MODE_PARAM, new String[]{mode.toString()}); | |
mockPortletUrl.expects(once()).method("setParameters").with(new ParamMapConstraint(paramMap)); | |
mockPortletUrl.expects(once()).method("setPortletMode").with(eq(PortletMode.HELP)); | |
mockPortletUrl.expects(once()).method("setWindowState").with(eq(WindowState.NORMAL)); | |
tag.setAction("testAction"); | |
tag.setPortletMode("help"); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
} | |
public void testUrlWithQueryParams() throws Exception { | |
PortletMode mode = PortletMode.VIEW; | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("createRenderURL").will( | |
returnValue((PortletURL) mockPortletUrl.proxy())); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
Map paramMap = new HashMap(); | |
paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction"}); | |
paramMap.put("testParam1", new String[]{"testValue1"}); | |
paramMap.put(PortletActionConstants.MODE_PARAM, new String[]{mode.toString()}); | |
mockPortletUrl.expects(once()).method("setParameters").with(new ParamMapConstraint(paramMap)); | |
mockPortletUrl.expects(once()).method("setPortletMode").with(eq(PortletMode.VIEW)); | |
mockPortletUrl.expects(once()).method("setWindowState").with(eq(WindowState.NORMAL)); | |
tag.setAction("testAction?testParam1=testValue1"); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
} | |
public void testActionUrl() throws Exception { | |
PortletMode mode = PortletMode.VIEW; | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("createActionURL").will( | |
returnValue((PortletURL) mockPortletUrl.proxy())); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
Map paramMap = new HashMap(); | |
paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction"}); | |
paramMap.put(PortletActionConstants.MODE_PARAM, new String[]{mode.toString()}); | |
mockPortletUrl.expects(once()).method("setParameters").with(new ParamMapConstraint(paramMap)); | |
mockPortletUrl.expects(once()).method("setPortletMode").with(eq(PortletMode.VIEW)); | |
mockPortletUrl.expects(once()).method("setWindowState").with(eq(WindowState.NORMAL)); | |
tag.setAction("testAction"); | |
tag.setPortletUrlType("action"); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
} | |
public void testResourceUrl() throws Exception { | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("encodeURL").will(returnValue("/contextPath/image.gif")); | |
mockJspWriter.setExpectedData("/contextPath/image.gif"); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
tag.setValue("image.gif"); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
mockJspWriter.verify(); | |
} | |
public void testResourceUrlWithNestedParam() throws Exception { | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("encodeURL").with(eq("/contextPath/image.gif?testParam1=testValue1")).will(returnValue("/contextPath/image.gif?testParam1=testValue1")); | |
mockJspWriter.setExpectedData("/contextPath/image.gif?testParam1=testValue1"); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
ParamTag paramTag = new ParamTag(); | |
paramTag.setPageContext((PageContext)mockPageCtx.proxy()); | |
paramTag.setParent(tag); | |
paramTag.setName("testParam1"); | |
paramTag.setValue("'testValue1'"); | |
tag.setValue("image.gif"); | |
tag.doStartTag(); | |
paramTag.doStartTag(); | |
paramTag.doEndTag(); | |
tag.doEndTag(); | |
mockJspWriter.verify(); | |
} | |
public void testResourceUrlWithTwoNestedParam() throws Exception { | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("encodeURL").with(eq("/contextPath/image.gif?testParam1=testValue1&testParam2=testValue2")).will(returnValue("/contextPath/image.gif?testParam1=testValue1&testParam2=testValue2")); | |
mockJspWriter.setExpectedData("/contextPath/image.gif?testParam1=testValue1&testParam2=testValue2"); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
ParamTag paramTag = new ParamTag(); | |
paramTag.setPageContext((PageContext)mockPageCtx.proxy()); | |
paramTag.setParent(tag); | |
paramTag.setName("testParam1"); | |
paramTag.setValue("'testValue1'"); | |
ParamTag paramTag2 = new ParamTag(); | |
paramTag2.setPageContext((PageContext)mockPageCtx.proxy()); | |
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(); | |
mockJspWriter.verify(); | |
} | |
public void testUrlWithMethod() throws Exception { | |
PortletMode mode = PortletMode.VIEW; | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("createRenderURL").will( | |
returnValue((PortletURL) mockPortletUrl.proxy())); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
tag.setAction("testAction"); | |
Map paramMap = new HashMap(); | |
paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction!input"}); | |
paramMap.put(PortletActionConstants.MODE_PARAM, new String[]{mode.toString()}); | |
mockPortletUrl.expects(once()).method("setParameters").with(new ParamMapConstraint(paramMap)); | |
mockPortletUrl.expects(once()).method("setPortletMode").with(eq(PortletMode.VIEW)); | |
mockPortletUrl.expects(once()).method("setWindowState").with(eq(WindowState.NORMAL)); | |
tag.setMethod("input"); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
} | |
public void testUrlWithNoActionOrMethod() throws Exception { | |
PortletMode mode = PortletMode.VIEW; | |
mockHttpReq.stubs().method("getQueryString").will(returnValue("")); | |
mockPortletRes.expects(once()).method("createRenderURL").will( | |
returnValue((PortletURL) mockPortletUrl.proxy())); | |
mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1)); | |
Map paramMap = new HashMap(); | |
Mock mockActionProxy = mock(ActionProxy.class); | |
mockActionProxy.stubs().method("getActionName").will(returnValue("currentExecutingAction")); | |
final ActionProxy proxy = (ActionProxy)mockActionProxy.proxy(); | |
Mock mockActionInvocation = mock(ActionInvocation.class); | |
mockActionInvocation.stubs().method("getProxy").will(returnValue(proxy)); | |
ActionInvocation ai = (ActionInvocation)mockActionInvocation.proxy(); | |
stack.getContext().put(ActionContext.ACTION_INVOCATION, ai); | |
paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/currentExecutingAction"}); | |
paramMap.put(PortletActionConstants.MODE_PARAM, new String[]{mode.toString()}); | |
mockPortletUrl.expects(once()).method("setParameters").with(new ParamMapConstraint(paramMap)); | |
mockPortletUrl.expects(once()).method("setPortletMode").with(eq(PortletMode.VIEW)); | |
mockPortletUrl.expects(once()).method("setWindowState").with(eq(WindowState.NORMAL)); | |
tag.doStartTag(); | |
tag.doEndTag(); | |
} | |
private static class ParamMapConstraint implements Constraint { | |
private Map myExpectedMap = null; | |
private Map myActualMap = null; | |
public ParamMapConstraint(Map expectedMap) { | |
if(expectedMap == null) { | |
throw new IllegalArgumentException("Use an isNull constraint instead!"); | |
} | |
myExpectedMap = expectedMap; | |
} | |
/* (non-Javadoc) | |
* @see org.jmock.core.Constraint#eval(java.lang.Object) | |
*/ | |
public boolean eval(Object val) { | |
myActualMap = (Map)val; | |
boolean result = false; | |
if(val != null) { | |
if(myExpectedMap.size() == myActualMap.size()) { | |
Iterator keys = myExpectedMap.keySet().iterator(); | |
boolean allSame = true; | |
while(keys.hasNext()) { | |
Object key = keys.next(); | |
if(!myActualMap.containsKey(key)) { | |
allSame = false; | |
break; | |
} | |
else { | |
String[] expected = (String[])myExpectedMap.get(key); | |
String[] actual = (String[])myActualMap.get(key); | |
if(!Arrays.equals(expected, actual)) { | |
allSame = false; | |
break; | |
} | |
} | |
} | |
result = allSame; | |
} | |
} | |
return result; | |
} | |
/* (non-Javadoc) | |
* @see org.jmock.core.SelfDescribing#describeTo(java.lang.StringBuffer) | |
*/ | |
public StringBuffer describeTo(StringBuffer sb) { | |
Iterator<String> it = myExpectedMap.keySet().iterator(); | |
while(it.hasNext()) { | |
String key = it.next(); | |
sb.append(key).append("="); | |
String[] value = (String[])myExpectedMap.get(key); | |
sb.append(value[0]); | |
if(it.hasNext()) { | |
sb.append(", "); | |
} | |
} | |
return sb; | |
} | |
} | |
} |