/*
* Copyright (c) 2001-2016, Inversoft Inc., All Rights Reserved
*
* 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.primeframework.mvc.action;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.example.action.ComplexRest;
import org.example.action.user.Edit;
import org.example.action.user.RESTEdit;
import org.primeframework.mvc.PrimeBaseTest;
import org.primeframework.mvc.action.config.ActionConfiguration;
import org.primeframework.mvc.action.config.ActionConfigurationProvider;
import org.primeframework.mvc.servlet.HTTPMethod;
import org.primeframework.mvc.workflow.WorkflowChain;
import org.testng.annotations.Test;
import com.google.inject.Injector;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.easymock.EasyMock.capture;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
/**
* This class tests the default action mapping workflow.
*
* @author Brian Pontarelli
*/
public class DefaultActionMappingWorkflowTest extends PrimeBaseTest {
@Test
public void differentButtonClick() throws Exception {
request.setUri("/admin/user/edit");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "/admin/user/cancel");
request.setParameter("cancel", "Cancel");
run("/admin/user/cancel", null);
}
@Test
public void differentButtonClickRelativeURI() throws Exception {
request.setUri("/admin/user/edit");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("cancel", "Cancel");
run("/admin/user/cancel", null);
}
@Test
public void extension() throws Exception {
request.setUri("/admin/user/edit.xml");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("submit", "Submit");
run("/admin/user/edit", "xml");
}
@Test
public void redirectToIndex() throws Exception {
request.setUri("/foo");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("submit", "Submit");
ActionConfigurationProvider provider = EasyMock.createStrictMock(ActionConfigurationProvider.class);
EasyMock.expect(provider.lookup("/foo")).andReturn(null);
EasyMock.expect(provider.lookup("/foo/index")).andReturn(
new ActionConfiguration(ComplexRest.class, new HashMap<>(),
new HashMap<>(), new ArrayList<>(), null, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new HashMap<>(),
new HashMap<>(), new HashMap<>(), new HashSet<>(), new ArrayList<>(), new HashMap<>(), "/foo/index", new ArrayList<>()
));
EasyMock.replay(provider);
ActionInvocationStore store = EasyMock.createStrictMock(ActionInvocationStore.class);
EasyMock.replay(store);
Injector injector = EasyMock.createStrictMock(Injector.class);
EasyMock.replay(injector);
WorkflowChain chain = EasyMock.createStrictMock(WorkflowChain.class);
EasyMock.replay(chain);
DefaultActionMappingWorkflow workflow = new DefaultActionMappingWorkflow(request, response, store, new DefaultActionMapper(provider, injector));
workflow.perform(chain);
assertEquals(response.getRedirect(), "/foo/");
EasyMock.verify(provider, store, injector, chain);
}
@Test
public void requestURI() throws Exception {
request.setUri("/admin/user/edit");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("submit", "Submit");
run("/admin/user/edit", null);
}
@Test
public void requestURIContext() throws Exception {
request.setUri("/context-path/admin/user/edit");
request.setContextPath("/context-path");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("submit", "Submit");
run("/admin/user/edit", null);
}
@Test
public void uirParametersComplexWithWildcard() throws Exception {
request.setUri("/complex-rest/brian/static/pontarelli/then/a/bunch/of/stuff");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("submit", "Submit");
Map<HTTPMethod, ExecuteMethodConfiguration> executeMethods = new HashMap<>();
executeMethods.put(HTTPMethod.POST, new ExecuteMethodConfiguration(HTTPMethod.POST, Edit.class.getMethod("execute"), null));
ActionConfigurationProvider provider = EasyMock.createStrictMock(ActionConfigurationProvider.class);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli/then/a/bunch/of/stuff")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli/then/a/bunch/of/stuff/index")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli/then/a/bunch/of")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli/then/a/bunch")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli/then/a")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli/then")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static/pontarelli")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian/static")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest/brian")).andReturn(null);
EasyMock.expect(provider.lookup("/complex-rest")).andReturn(
new ActionConfiguration(ComplexRest.class, executeMethods,
new HashMap<>(), new ArrayList<>(), null, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new HashMap<>(),
new HashMap<>(), new HashMap<>(), new HashSet<>(), new ArrayList<>(), new HashMap<>(), "/complex-rest", new ArrayList<>()
));
EasyMock.replay(provider);
Capture<ActionInvocation> capture = new Capture<>();
ActionInvocationStore store = EasyMock.createStrictMock(ActionInvocationStore.class);
store.setCurrent(capture(capture));
store.removeCurrent();
EasyMock.replay(store);
Injector injector = EasyMock.createStrictMock(Injector.class);
EasyMock.expect(injector.getInstance(ComplexRest.class)).andReturn(new ComplexRest());
EasyMock.replay(injector);
WorkflowChain chain = EasyMock.createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
EasyMock.replay(chain);
DefaultActionMappingWorkflow workflow = new DefaultActionMappingWorkflow(request, response, store, new DefaultActionMapper(provider, injector));
workflow.perform(chain);
ActionInvocation ai = capture.getValue();
assertEquals(ai.actionURI, "/complex-rest");
assertCollections(asList("brian", "static", "pontarelli", "then", "a", "bunch", "of", "stuff"), ai.uriParameters);
assertNull(ai.extension);
assertNotNull(ai.configuration);
assertTrue(ai.executeResult);
EasyMock.verify(provider, store, injector, chain);
}
@Test
public void uriParameters() throws Exception {
request.setUri("/admin/user/rest-edit/12");
request.setPost(true);
request.setParameter("__a_submit", "");
request.setParameter("__a_cancel", "cancel");
request.setParameter("submit", "Submit");
Map<HTTPMethod, ExecuteMethodConfiguration> executeMethods = new HashMap<>();
executeMethods.put(HTTPMethod.POST, new ExecuteMethodConfiguration(HTTPMethod.POST, Edit.class.getMethod("execute"), null));
ActionConfigurationProvider provider = EasyMock.createStrictMock(ActionConfigurationProvider.class);
EasyMock.expect(provider.lookup("/admin/user/rest-edit/12")).andReturn(null);
EasyMock.expect(provider.lookup("/admin/user/rest-edit/12/index")).andReturn(null);
EasyMock.expect(provider.lookup("/admin/user/rest-edit")).andReturn(new ActionConfiguration(RESTEdit.class, executeMethods,
new HashMap<>(), new ArrayList<>(), null, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new HashMap<>(),
new HashMap<>(), new HashMap<>(), new HashSet<>(), new ArrayList<>(), new HashMap<>(), "/admin/user/rest-edit", new ArrayList<>()
));
EasyMock.replay(provider);
Capture<ActionInvocation> capture = new Capture<>();
ActionInvocationStore store = EasyMock.createStrictMock(ActionInvocationStore.class);
store.setCurrent(capture(capture));
store.removeCurrent();
EasyMock.replay(store);
Injector injector = EasyMock.createStrictMock(Injector.class);
EasyMock.expect(injector.getInstance(RESTEdit.class)).andReturn(new RESTEdit());
EasyMock.replay(injector);
WorkflowChain chain = EasyMock.createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
EasyMock.replay(chain);
DefaultActionMappingWorkflow workflow = new DefaultActionMappingWorkflow(request, response, store, new DefaultActionMapper(provider, injector));
workflow.perform(chain);
ActionInvocation ai = capture.getValue();
assertEquals(ai.actionURI, "/admin/user/rest-edit");
assertCollections(singletonList("12"), ai.uriParameters);
assertNull(ai.extension);
assertNotNull(ai.configuration);
assertTrue(ai.executeResult);
EasyMock.verify(provider, store, injector, chain);
}
private void assertCollections(Collection<String> strings, Collection<String> strings1) {
if (strings1.size() != strings.size()) {
fail(strings + " not equal to " + strings1);
}
Iterator<String> i1 = strings.iterator();
Iterator<String> i2 = strings1.iterator();
while (i1.hasNext()) {
if (!i1.next().equals(i2.next())) {
fail(strings + " not equal to " + strings1);
}
}
}
private void run(String uri, String extension) throws Exception {
Map<HTTPMethod, ExecuteMethodConfiguration> executeMethods = new HashMap<>();
executeMethods.put(HTTPMethod.POST, new ExecuteMethodConfiguration(HTTPMethod.POST, Edit.class.getMethod("post"), null));
ActionConfigurationProvider provider = EasyMock.createStrictMock(ActionConfigurationProvider.class);
EasyMock.expect(provider.lookup(uri)).andReturn(
new ActionConfiguration(Edit.class, executeMethods,
new HashMap<>(), new ArrayList<>(), null, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new HashMap<>(), new HashMap<>(),
new HashMap<>(), new HashSet<>(), new ArrayList<>(), new HashMap<>(), uri, new ArrayList<>()
));
EasyMock.replay(provider);
Capture<ActionInvocation> capture = new Capture<>();
ActionInvocationStore store = EasyMock.createStrictMock(ActionInvocationStore.class);
store.setCurrent(capture(capture));
store.removeCurrent();
EasyMock.replay(store);
Injector injector = EasyMock.createStrictMock(Injector.class);
EasyMock.expect(injector.getInstance(Edit.class)).andReturn(new Edit());
EasyMock.replay(injector);
WorkflowChain chain = EasyMock.createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
EasyMock.replay(chain);
DefaultActionMappingWorkflow workflow = new DefaultActionMappingWorkflow(request, response, store, new DefaultActionMapper(provider, injector));
workflow.perform(chain);
ActionInvocation ai = capture.getValue();
assertEquals(ai.actionURI, uri);
assertEquals(ai.extension, extension);
assertNotNull(ai.configuration);
assertTrue(ai.executeResult);
EasyMock.verify(provider, store, injector, chain);
}
}