Author: bphillips
Date: Tue Jul 16 16:33:51 2013
New Revision: 1503787
URL: http://svn.apache.org/r1503787
Log:
NOJIRA - Added unit test for Jsr286Dispatcher class based on the
JSR168DispatcherTest class - trying to learn more about how this plugin works
to hopefully improve it.
Added:
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr286DispatcherTest.java
Added:
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr286DispatcherTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr286DispatcherTest.java?rev=1503787&view=auto
==============================================================================
---
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr286DispatcherTest.java
(added)
+++
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr286DispatcherTest.java
Tue Jul 16 16:33:51 2013
@@ -0,0 +1,340 @@
+/*
+ * $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));
+ }
+ }
+
+}