/*
* Copyright (c) 2014-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.parameter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.easymock.IArgumentMatcher;
import org.example.action.user.Edit;
import org.example.domain.Action;
import org.example.domain.ActionField;
import org.example.domain.PreAndPostAction;
import org.primeframework.mvc.PrimeBaseTest;
import org.primeframework.mvc.action.ActionInvocation;
import org.primeframework.mvc.action.ActionInvocationStore;
import org.primeframework.mvc.config.AbstractMVCConfiguration;
import org.primeframework.mvc.config.MVCConfiguration;
import org.primeframework.mvc.message.FieldMessage;
import org.primeframework.mvc.message.MessageStore;
import org.primeframework.mvc.message.MessageType;
import org.primeframework.mvc.message.SimpleFieldMessage;
import org.primeframework.mvc.message.l10n.MessageProvider;
import org.primeframework.mvc.parameter.convert.ConversionException;
import org.primeframework.mvc.parameter.el.ExpressionEvaluator;
import org.primeframework.mvc.parameter.el.ExpressionException;
import org.primeframework.mvc.parameter.fileupload.FileInfo;
import org.primeframework.mvc.parameter.fileupload.annotation.FileUpload;
import org.primeframework.mvc.servlet.HTTPMethod;
import org.primeframework.mvc.util.MapBuilder;
import org.primeframework.mvc.util.RequestKeys;
import org.primeframework.mvc.workflow.WorkflowChain;
import org.testng.annotations.Test;
import com.google.inject.Inject;
import static java.util.Arrays.asList;
import static org.easymock.EasyMock.aryEq;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reportMatcher;
import static org.easymock.EasyMock.same;
import static org.easymock.EasyMock.verify;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
/**
* This tests the default parameters workflow.
*
* @author Brian Pontarelli
*/
public class DefaultParameterWorkflowTest extends PrimeBaseTest {
@Inject public ExpressionEvaluator expressionEvaluator;
@Test
public void simpleParameters() throws Exception {
Action action = new Action();
Map<String, String[]> values = new LinkedHashMap<>();
values.put("user.addresses['home'].city", ArrayUtils.toArray("Boulder"));
values.put("user.age", ArrayUtils.toArray("32"));
values.put("user.age@dateFormat", ArrayUtils.toArray("MM/dd/yyyy"));
values.put("user.inches", ArrayUtils.toArray("tall"));
values.put("user.name", ArrayUtils.toArray(""));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("user.addresses['home'].city"), same(action), aryEq(ArrayUtils.toArray("Boulder")), eq(new HashMap<>()));
expressionEvaluator.setValue(eq("user.age"), same(action), aryEq(ArrayUtils.toArray("32")), eq(MapBuilder.asMap("dateFormat", "MM/dd/yyyy")));
expressionEvaluator.setValue(eq("user.inches"), same(action), aryEq(ArrayUtils.toArray("tall")), eq(new HashMap<>()));
expectLastCall().andThrow(new ConversionException());
expressionEvaluator.setValue(eq("user.name"), same(action), aryEq(ArrayUtils.toArray("")), eq(new HashMap<>()));
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false).times(4);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
expect(provider.getMessage("[couldNotConvert]user.inches", "user.inches", "tall")).andReturn("bar");
replay(provider);
FieldMessage message = new SimpleFieldMessage(MessageType.ERROR, "user.inches", "[couldNotConvert]user.inches", "bar");
MessageStore messageStore = createStrictMock(MessageStore.class);
messageStore.add(message);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, expressionEvaluator, actionInvocationStore, messageStore, config, chain, provider);
}
@Test
public void simpleParameter_boolean_in_baseClass() throws Exception {
ActionField action = new ActionField();
Map<String, String[]> values = new LinkedHashMap<>();
values.put("superFoo", ArrayUtils.toArray("true"));
values.put("superBar", ArrayUtils.toArray("false"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false).times(2);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, actionInvocationStore, messageStore, config, chain, provider);
assertTrue(action.superFoo);
assertFalse(action.superBar);
}
@Test
public void simpleParameter_boolean() throws Exception {
ActionField action = new ActionField();
Map<String, String[]> values = new LinkedHashMap<>();
values.put("foo", ArrayUtils.toArray("true"));
values.put("bar", ArrayUtils.toArray("false"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false).times(2);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, actionInvocationStore, messageStore, config, chain, provider);
assertTrue(action.foo);
assertFalse(action.bar);
}
@Test
public void simpleParameter_boolean_model_object() throws Exception {
ActionField action = new ActionField();
Map<String, String[]> values = new LinkedHashMap<>();
values.put("user.active", ArrayUtils.toArray("true"));
values.put("user.bar", ArrayUtils.toArray("false"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false).times(2);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, actionInvocationStore, messageStore, config, chain, provider);
assertTrue(action.user.active);
assertFalse(action.user.bar);
}
@Test
public void simpleParameter_boolean_default() throws Exception {
ActionField action = new ActionField();
Map<String, String[]> values = new LinkedHashMap<>();
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, actionInvocationStore, messageStore, config, chain, provider);
assertFalse(action.foo);
assertFalse(action.bar);
}
@Test
public void invalidParametersDev() throws Exception {
Action action = new Action();
Map<String, String[]> values = new LinkedHashMap<>();
values.put("user.age", ArrayUtils.toArray("32"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("user.age"), same(action), aryEq(ArrayUtils.toArray("32")), eq(new HashMap<>()));
expectLastCall().andThrow(new ExpressionException());
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
try {
workflow.perform(chain);
fail("Should have thrown an exception");
} catch (ExpressionException ee) {
// Expected
}
verify(request, expressionEvaluator, actionInvocationStore, messageStore, config, chain, provider);
}
@Test
public void invalidParametersProduction() throws Exception {
Action action = new Action();
Map<String, String[]> values = new LinkedHashMap<>();
values.put("user.age", ArrayUtils.toArray("32"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("user.age"), same(action), aryEq(ArrayUtils.toArray("32")), eq(new HashMap<>()));
expectLastCall().andThrow(new ExpressionException());
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false);
expect(config.allowUnknownParameters()).andReturn(true);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, expressionEvaluator, actionInvocationStore, messageStore, config, chain, provider);
}
@Test
public void radioButtonsCheckBoxes() throws Exception {
Action action = new Action();
Map<String, String[]> values = new HashMap<>();
values.put("__cb_user.checkbox['null']", ArrayUtils.toArray(""));
values.put("__cb_user.checkbox['default']", ArrayUtils.toArray("false"));
values.put("__rb_user.radio['null']", ArrayUtils.toArray(""));
values.put("__rb_user.radio['default']", ArrayUtils.toArray("false"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ExpressionEvaluator expressionEvaluator = createNiceMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("user.checkbox['default']"), same(action), aryEq(ArrayUtils.toArray("false")), eq(new HashMap<>()));
expressionEvaluator.setValue(eq("user.radio['default']"), same(action), aryEq(ArrayUtils.toArray("false")), eq(new HashMap<>()));
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, expressionEvaluator, actionInvocationStore, messageStore, config, chain, provider);
}
@Test
public void imageSubmitButton() throws Exception {
Action action = new Action();
Map<String, String[]> values = new HashMap<>();
values.put("submit.x", ArrayUtils.toArray("1"));
values.put("submit.y", ArrayUtils.toArray("2"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ExpressionEvaluator expressionEvaluator = createNiceMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("submit.x"), same(action), aryEq(ArrayUtils.toArray("1")), eq(new HashMap<>()));
expectLastCall().andThrow(new ExpressionException("Not property x"));
expressionEvaluator.setValue(eq("submit.y"), same(action), aryEq(ArrayUtils.toArray("2")), eq(new HashMap<>()));
expectLastCall().andThrow(new ExpressionException("Not property y"));
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false).times(2);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, expressionEvaluator, actionInvocationStore, messageStore, config, chain, provider);
}
/*
* Tests that all of the pre and post handling works correctly.
*/
@Test
public void preAndPost() throws Exception {
PreAndPostAction action = new PreAndPostAction();
Map<String, String[]> values = new HashMap<>();
values.put("preField", ArrayUtils.toArray("1"));
values.put("preProperty", ArrayUtils.toArray("Pre property"));
values.put("notPre", ArrayUtils.toArray("Not pre"));
final HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(values);
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(null);
replay(request);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
expectLastCall().times(2);
replay(chain);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.ignoreEmptyParameters()).andReturn(false).times(3);
expect(config.allowUnknownParameters()).andReturn(false);
replay(config);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
assertTrue(action.preCalled);
assertFalse(action.postCalled);
PostParameterWorkflow postParameterWorkflow = new DefaultPostParameterWorkflow(actionInvocationStore);
postParameterWorkflow.perform(chain);
assertTrue(action.postCalled);
verify(request, actionInvocationStore, messageStore, config, chain, provider);
}
@Test
public void filesNoAnnotation() throws Exception {
Map<String, List<FileInfo>> files = new HashMap<>();
files.put("userfile", asList(new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload.txt", "text/plain")));
HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(new HashMap<>());
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(files);
replay(request);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
expect(config.fileUploadMaxSize()).andReturn(1024000l);
expect(config.fileUploadAllowedTypes()).andReturn(new String[]{"text/plain"});
replay(config);
Edit action = new Edit();
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("userfile"), same(action), assertFile());
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, config, chain, actionInvocationStore, expressionEvaluator, messageStore, provider);
}
@Test
public void multipleFilesNoAnnotation() throws Exception {
Map<String, List<FileInfo>> files = new HashMap<>();
files.put("userfiles", asList(
new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload.txt", "text/plain"),
new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload2.txt", "text/plain")));
HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(new HashMap<>());
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(files);
replay(request);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
expect(config.fileUploadMaxSize()).andReturn(1024000l);
expect(config.fileUploadAllowedTypes()).andReturn(new String[]{"text/plain"});
replay(config);
Edit action = new Edit();
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
expressionEvaluator.setValue(eq("userfiles"), same(action), captureMultiple());
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MessageStore messageStore = createStrictMock(MessageStore.class);
replay(messageStore);
MessageProvider provider = createStrictMock(MessageProvider.class);
replay(provider);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, config, chain, actionInvocationStore, expressionEvaluator, messageStore, provider);
}
@Test
public void filesNoAnnotationSizeError() throws Exception {
Map<String, List<FileInfo>> files = new HashMap<>();
files.put("userfile", new ArrayList<>(asList(new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload.txt", "text/plain"))));
HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(new HashMap<>());
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(files);
replay(request);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
expect(config.fileUploadMaxSize()).andReturn(1l);
expect(config.fileUploadAllowedTypes()).andReturn(AbstractMVCConfiguration.ALLOWED_TYPES);
replay(config);
Edit action = new Edit();
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MessageProvider provider = createStrictMock(MessageProvider.class);
expect(provider.getMessage("[fileUploadTooBig]userfile", "userfile", 5l, 1l)).andReturn("bar");
replay(provider);
FieldMessage message = new SimpleFieldMessage(MessageType.ERROR, "userfile", "[fileUploadTooBig]userfile", "bar");
MessageStore messageStore = createStrictMock(MessageStore.class);
messageStore.add(message);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, config, chain, actionInvocationStore, expressionEvaluator, messageStore, provider);
}
@Test
public void filesNoAnnotationContentTypeError() throws Exception {
Map<String, List<FileInfo>> files = new HashMap<>();
files.put("userfile", new ArrayList<>(asList(new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload.txt", "text/plain"))));
HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(new HashMap<>());
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(files);
replay(request);
String[] contentTypes = new String[]{"test/xml"};
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
expect(config.fileUploadMaxSize()).andReturn(10l);
expect(config.fileUploadAllowedTypes()).andReturn(contentTypes);
replay(config);
Edit action = new Edit();
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MessageProvider provider = createStrictMock(MessageProvider.class);
expect(provider.getMessage("[fileUploadBadContentType]userfile", "userfile", "text/plain", contentTypes)).andReturn("bar");
replay(provider);
FieldMessage message = new SimpleFieldMessage(MessageType.ERROR, "userfile", "[fileUploadBadContentType]userfile", "bar");
MessageStore messageStore = createStrictMock(MessageStore.class);
messageStore.add(message);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, config, chain, actionInvocationStore, expressionEvaluator, messageStore, provider);
}
@Test
public void filesAnnotationSizeError() throws Exception {
Map<String, List<FileInfo>> files = new HashMap<>();
files.put("userfile", new ArrayList<>(asList(new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload.txt", "text/plain"))));
HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(new HashMap<>());
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(files);
replay(request);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
expect(config.fileUploadMaxSize()).andReturn(AbstractMVCConfiguration.MAX_SIZE);
expect(config.fileUploadAllowedTypes()).andReturn(AbstractMVCConfiguration.ALLOWED_TYPES);
replay(config);
Edit action = new Edit();
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ai.configuration.fileUploadMembers.put("userfile", new FileUpload() {
public long maxSize() {
return 1;
}
public String[] contentTypes() {
return new String[0];
}
public Class<? extends Annotation> annotationType() {
return FileUpload.class;
}
});
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MessageProvider provider = createStrictMock(MessageProvider.class);
expect(provider.getMessage("[fileUploadTooBig]userfile", "userfile", 5l, 1l)).andReturn("bar");
replay(provider);
FieldMessage message = new SimpleFieldMessage(MessageType.ERROR, "userfile", "[fileUploadTooBig]userfile", "bar");
MessageStore messageStore = createStrictMock(MessageStore.class);
messageStore.add(message);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, config, chain, actionInvocationStore, expressionEvaluator, messageStore, provider);
}
@Test
public void filesAnnotationContentTypeError() throws Exception {
Map<String, List<FileInfo>> files = new HashMap<>();
files.put("userfile", new ArrayList<>(asList(new FileInfo(new java.io.File("src/test/java/org/primeframework/mvc/parameter/test-file-upload.txt"), "test-file-upload.txt", "text/plain"))));
HttpServletRequest request = createStrictMock(HttpServletRequest.class);
expect(request.getParameterMap()).andReturn(new HashMap<>());
expect(request.getAttribute(RequestKeys.FILE_ATTRIBUTE)).andReturn(files);
replay(request);
MVCConfiguration config = createStrictMock(MVCConfiguration.class);
expect(config.allowUnknownParameters()).andReturn(false);
expect(config.fileUploadMaxSize()).andReturn(AbstractMVCConfiguration.MAX_SIZE);
expect(config.fileUploadAllowedTypes()).andReturn(AbstractMVCConfiguration.ALLOWED_TYPES);
replay(config);
final String[] annotationTypes = new String[]{"text/xml"};
Edit action = new Edit();
ExpressionEvaluator expressionEvaluator = createStrictMock(ExpressionEvaluator.class);
replay(expressionEvaluator);
ActionInvocation ai = makeActionInvocation(action, HTTPMethod.POST, "");
ai.configuration.fileUploadMembers.put("userfile", new FileUpload() {
public long maxSize() {
return 10;
}
public String[] contentTypes() {
return annotationTypes;
}
public Class<? extends Annotation> annotationType() {
return FileUpload.class;
}
});
ActionInvocationStore actionInvocationStore = createStrictMock(ActionInvocationStore.class);
expect(actionInvocationStore.getCurrent()).andReturn(ai).anyTimes();
replay(actionInvocationStore);
WorkflowChain chain = createStrictMock(WorkflowChain.class);
chain.continueWorkflow();
replay(chain);
MessageProvider provider = createStrictMock(MessageProvider.class);
expect(provider.getMessage("[fileUploadBadContentType]userfile", "userfile", "text/plain", annotationTypes)).andReturn("bar");
replay(provider);
FieldMessage message = new SimpleFieldMessage(MessageType.ERROR, "userfile", "[fileUploadBadContentType]userfile", "bar");
MessageStore messageStore = createStrictMock(MessageStore.class);
messageStore.add(message);
replay(messageStore);
DefaultParameterWorkflow workflow = new DefaultParameterWorkflow(
actionInvocationStore, new DefaultParameterParser(config, actionInvocationStore, request),
new DefaultParameterHandler(config, actionInvocationStore, expressionEvaluator, provider, messageStore));
workflow.perform(chain);
verify(request, config, chain, actionInvocationStore, expressionEvaluator, messageStore, provider);
}
@SuppressWarnings("unchecked")
public <T> T assertFile() {
reportMatcher(new IArgumentMatcher() {
public boolean matches(Object argument) {
List<FileInfo> list = (List<FileInfo>) argument;
assertNotNull(list);
assertEquals(list.size(), 1);
assertNotNull(list.get(0));
assertEquals(list.get(0).contentType, "text/plain");
assertEquals(list.get(0).name, "test-file-upload.txt");
try {
assertEquals(FileUtils.readFileToString(list.get(0).file), "1234\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
}
public void appendTo(StringBuffer buffer) {
}
});
return null;
}
@SuppressWarnings("unchecked")
public <T> T captureMultiple() {
reportMatcher(new IArgumentMatcher() {
public boolean matches(Object argument) {
List<FileInfo> list = (List<FileInfo>) argument;
assertNotNull(list);
assertEquals(list.size(), 2);
assertNotNull(list.get(0));
assertNotNull(list.get(1));
assertEquals(list.get(0).contentType, "text/plain");
assertEquals(list.get(1).contentType, "text/plain");
assertEquals(list.get(0).name, "test-file-upload.txt");
assertEquals(list.get(1).name, "test-file-upload2.txt");
try {
assertEquals(FileUtils.readFileToString(list.get(0).file), "1234\n");
assertEquals(FileUtils.readFileToString(list.get(1).file), "1234\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
}
public void appendTo(StringBuffer buffer) {
}
});
return null;
}
}