/* * $Id: Jsr168DispatcherTest.java 602665 2007-12-09 12:11:25Z mrdon $ * * 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.portlet.dispatcher; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.StrutsConstants; import org.apache.struts2.dispatcher.mapper.ActionMapping; import static org.apache.struts2.portlet.PortletConstants.*; import org.easymock.EasyMock; import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; import org.jmock.core.Constraint; import org.springframework.mock.web.portlet.MockPortletConfig; import org.springframework.mock.web.portlet.MockPortletContext; import javax.portlet.*; import java.util.*; /** * Test portlet actions for porlet 2.0 specification. * */ public class Jsr286DispatcherTest extends MockObjectTestCase { Jsr286Dispatcher dispatcher = null; Mock mockConfig = null; Mock mockCtx = null; Mock mockRequest = null; Mock mockSession = null; Mock mockActionFactory = null; Mock mockActionProxy = null; Mock mockAction = null; Mock mockInvocation = null; public void testRender_ok() { final Mock mockResponse = mock(RenderResponse.class); mockResponse.stubs().method(ANYTHING); PortletMode mode = PortletMode.VIEW; Map<String, String[]> requestParams = new HashMap<String, String[]>(); requestParams.put(ACTION_PARAM, new String[] { "/view/testAction" }); requestParams.put(EVENT_ACTION, new String[] { "true" }); requestParams.put(MODE_PARAM, new String[] { mode.toString() }); Map<String, Object> sessionMap = new HashMap<String, Object>(); Map<String, String> initParams = new HashMap<String, String>(); initParams.put("viewNamespace", "/view"); initParams.put(StrutsConstants.STRUTS_ALWAYS_SELECT_FULL_NAMESPACE, "true"); initPortletConfig(initParams, new HashMap<String, Object>()); initRequest(requestParams, new HashMap<String, Object>(), sessionMap, PortletMode.VIEW, WindowState.NORMAL, false, null); setupActionFactory("/view", "testAction", "success", EasyMock.createNiceMock(ValueStack.class)); mockInvocation.expects(once()).method("getStack") .will(returnValue(null)); try { dispatcher .setActionProxyFactory((ActionProxyFactory) mockActionFactory .proxy()); dispatcher.init((PortletConfig) mockConfig.proxy()); dispatcher.render((RenderRequest) mockRequest.proxy(), (RenderResponse) mockResponse.proxy()); } catch (Exception e) { e.printStackTrace(); fail("Error occured"); } } public void testProcessAction_ok() { final Mock mockResponse = mock(ActionResponse.class); PortletMode mode = PortletMode.VIEW; Map<String, String> initParams = new HashMap<String, String>(); initParams.put("viewNamespace", "/view"); Map<String, String[]> requestParams = new HashMap<String, String[]>(); requestParams.put(ACTION_PARAM, new String[] { "/view/testAction" }); requestParams.put(MODE_PARAM, new String[] { mode.toString() }); initParams.put(StrutsConstants.STRUTS_ALWAYS_SELECT_FULL_NAMESPACE, "true"); initPortletConfig(initParams, new HashMap<String, Object>()); initRequest(requestParams, new HashMap<String, Object>(), new HashMap<String, Object>(), PortletMode.VIEW, WindowState.NORMAL, true, null); setupActionFactory("/view", "testAction", "success", EasyMock.createNiceMock(ValueStack.class)); try { dispatcher .setActionProxyFactory((ActionProxyFactory) mockActionFactory .proxy()); dispatcher.init((PortletConfig) mockConfig.proxy()); dispatcher.processAction((ActionRequest) mockRequest.proxy(), (ActionResponse) mockResponse.proxy()); } catch (Exception e) { e.printStackTrace(); fail("Error occured"); } } public void testModeChangeUsingPortletWidgets() { final Mock mockResponse = mock(RenderResponse.class); mockResponse.stubs().method(ANYTHING); PortletMode mode = PortletMode.EDIT; Map<String, String[]> requestParams = new HashMap<String, String[]>(); requestParams.put(ACTION_PARAM, new String[] { "/view/testAction" }); requestParams.put(EVENT_ACTION, new String[] { "false" }); requestParams.put(MODE_PARAM, new String[] { PortletMode.VIEW.toString() }); Map<String, Object> sessionMap = new HashMap<String, Object>(); Map<String, String> initParams = new HashMap<String, String>(); initParams.put("viewNamespace", "/view"); initParams.put("editNamespace", "/edit"); initPortletConfig(initParams, new HashMap<String, Object>()); initRequest(requestParams, new HashMap<String, Object>(), sessionMap, mode, WindowState.NORMAL, false, null); setupActionFactory("/edit", "default", "success", EasyMock.createNiceMock(ValueStack.class)); mockInvocation.expects(once()).method("getStack") .will(returnValue(null)); try { dispatcher .setActionProxyFactory((ActionProxyFactory) mockActionFactory .proxy()); dispatcher.init((PortletConfig) mockConfig.proxy()); dispatcher.render((RenderRequest) mockRequest.proxy(), (RenderResponse) mockResponse.proxy()); } catch (Exception e) { e.printStackTrace(); fail("Error occured"); } } public void testParseConfigWithBang() { MockPortletContext portletContext = new MockPortletContext(); MockPortletConfig portletConfig = new MockPortletConfig(portletContext); portletConfig.addInitParameter("viewNamespace", "/view"); portletConfig.addInitParameter("defaultViewAction", "index!input"); Map<PortletMode, ActionMapping> actionMap = new HashMap<PortletMode, ActionMapping>(); dispatcher.parseModeConfig(actionMap, portletConfig, PortletMode.VIEW, "viewNamespace", "defaultViewAction"); ActionMapping mapping = actionMap.get(PortletMode.VIEW); assertEquals("index", mapping.getName()); assertEquals("/view", mapping.getNamespace()); assertEquals("input", mapping.getMethod()); } public void setUp() { dispatcher = new Jsr286Dispatcher(); } private void initPortletConfig(final Map<String, String> initParams, final Map<String, Object> attributes) { mockConfig = mock(PortletConfig.class); mockCtx = mock(PortletContext.class); mockConfig.stubs().method(ANYTHING); mockCtx.stubs().method(ANYTHING); setupStub(initParams, mockConfig, "getInitParameter"); mockCtx.stubs() .method("getAttributeNames") .will(returnValue(Collections.enumeration(attributes.keySet()))); setupStub(attributes, mockCtx, "getAttribute"); mockConfig.stubs().method("getPortletContext") .will(returnValue(mockCtx.proxy())); mockCtx.stubs() .method("getInitParameterNames") .will(returnValue(Collections.enumeration(initParams.keySet()))); setupStub(initParams, mockCtx, "getInitParameter"); mockConfig .stubs() .method("getInitParameterNames") .will(returnValue(Collections.enumeration(initParams.keySet()))); setupStub(initParams, mockConfig, "getInitParameter"); mockConfig.stubs().method("getResourceBundle") .will(returnValue(new ListResourceBundle() { protected Object[][] getContents() { return new String[][] { { "javax.portlet.title", "MyTitle" } }; } })); } private void setupActionFactory(String namespace, String actionName, String result, ValueStack stack) { if (mockActionFactory == null) { mockActionFactory = mock(ActionProxyFactory.class); } mockAction = mock(Action.class); mockActionProxy = mock(ActionProxy.class); mockInvocation = mock(ActionInvocation.class); mockActionFactory .expects(once()) .method("createActionProxy") .with(new Constraint[] { eq(namespace), eq(actionName), NULL, isA(Map.class) }) .will(returnValue(mockActionProxy.proxy())); mockActionProxy.stubs().method("getAction") .will(returnValue(mockAction.proxy())); mockActionProxy.expects(once()).method("execute") .will(returnValue(result)); mockActionProxy.expects(once()).method("getInvocation") .will(returnValue(mockInvocation.proxy())); mockInvocation.stubs().method("getStack").will(returnValue(stack)); } /** * Initialize the mock request (and as a result, the mock session) * * @param requestParams * The request parameters * @param requestAttributes * The request attributes * @param sessionParams * The session attributes * @param mode * The portlet mode * @param state * The portlet window state * @param isEvent * <code>true</code> when the request is an ActionRequest. * @param locale * The locale. If <code>null</code>, the request will return * <code>Locale.getDefault()</code> */ private void initRequest(Map<String, String[]> requestParams, Map<String, Object> requestAttributes, Map<String, Object> sessionParams, PortletMode mode, WindowState state, boolean isEvent, Locale locale) { mockRequest = isEvent ? mock(ActionRequest.class) : mock(RenderRequest.class); mockSession = mock(PortletSession.class); mockSession.stubs().method(ANYTHING); mockRequest.stubs().method(ANYTHING); setupStub(sessionParams, mockSession, "getAttribute"); mockSession .stubs() .method("getAttributeNames") .will(returnValue(Collections.enumeration(sessionParams .keySet()))); setupParamStub(requestParams, mockRequest, "getParameter"); setupStub(requestAttributes, mockRequest, "getAttribute"); mockRequest .stubs() .method("getAttributeNames") .will(returnValue(Collections.enumeration(requestAttributes .keySet()))); mockRequest.stubs().method("getParameterMap") .will(returnValue(requestParams)); mockRequest .stubs() .method("getParameterNames") .will(returnValue(Collections.enumeration(requestParams .keySet()))); mockRequest.stubs().method("getPortletSession") .will(returnValue(mockSession.proxy())); if (locale != null) { mockRequest.stubs().method("getLocale").will(returnValue(locale)); } else { mockRequest.stubs().method("getLocale") .will(returnValue(Locale.getDefault())); } mockRequest.stubs().method("getPortletMode").will(returnValue(mode)); mockRequest.stubs().method("getWindowState").will(returnValue(state)); } private void setupParamStub(Map<String, String[]> requestParams, Mock mockRequest, String method) { Map<String, String> newMap = new HashMap<String, String>(); for (String key : requestParams.keySet()) { String[] val = requestParams.get(key); newMap.put(key, val[0]); } setupStub(newMap, mockRequest, method); } /** * Set up stubs for the mock. * * @param map * The map containing the <code>key</code> and * <code>values</code>. The key is the expected parameter to * <code>method</code>, and value is the value that should be * returned from the stub. * @param mock * The mock to initialize. * @param method * The name of the method to stub. */ private void setupStub(Map map, Mock mock, String method) { for (Object key : map.keySet()) { Object val = map.get(key); mock.stubs().method(method).with(eq(key)).will(returnValue(val)); } } }