Package org.springframework.webflow.mvc.view

Source Code of org.springframework.webflow.mvc.view.MvcViewTests$TestModel$AllStates

package org.springframework.webflow.mvc.view;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Principal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import junit.framework.TestCase;

import org.springframework.binding.convert.converters.StringToDate;
import org.springframework.binding.convert.service.DefaultConversionService;
import org.springframework.binding.convert.service.GenericConversionService;
import org.springframework.binding.expression.EvaluationException;
import org.springframework.binding.expression.Expression;
import org.springframework.binding.expression.spel.SpringELExpressionParser;
import org.springframework.binding.expression.support.StaticExpression;
import org.springframework.binding.validation.ValidationContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.mock.web.MockServletContext;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.SmartValidator;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.View;
import org.springframework.webflow.action.ViewFactoryActionAdapter;
import org.springframework.webflow.engine.EndState;
import org.springframework.webflow.engine.StubViewFactory;
import org.springframework.webflow.engine.ViewState;
import org.springframework.webflow.engine.builder.BinderConfiguration;
import org.springframework.webflow.engine.builder.BinderConfiguration.Binding;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.expression.spel.WebFlowSpringELExpressionParser;
import org.springframework.webflow.test.MockFlowExecutionKey;
import org.springframework.webflow.test.MockRequestContext;
import org.springframework.webflow.test.MockRequestControlContext;
import org.springframework.webflow.validation.WebFlowMessageCodesResolver;

public class MvcViewTests extends TestCase {

  private boolean renderCalled;

  private Map<String, ?> model;

  public void testRender() throws Exception {
    MockRequestControlContext context = new MockRequestControlContext();
    context.setCurrentState(new ViewState(context.getRootFlow(), "test", new StubViewFactory()));
    context.getRequestScope().put("foo", "bar");
    context.getFlowScope().put("bar", "baz");
    context.getFlowScope().put("bindBean", new BindBean());
    context.getConversationScope().put("baz", "boop");
    context.getFlashScope().put("boop", "bing");
    context.getMockExternalContext().setCurrentUser("Keith");
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.render();
    assertTrue(renderCalled);
    assertEquals("bar", model.get("foo"));
    assertEquals("baz", model.get("bar"));
    assertEquals("boop", model.get("baz"));
    assertEquals("bing", model.get("boop"));
    assertEquals("c1v1", model.get("flowExecutionKey"));
    assertEquals("Keith", ((Principal) model.get("currentUser")).getName());
    assertEquals(context, model.get("flowRequestContext"));
    assertEquals("/mockFlow?execution=c1v1", model.get("flowExecutionUrl"));
    assertNull(model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean"));
  }

  public void testRenderNoKey() throws Exception {
    MockRequestControlContext context = new MockRequestControlContext();
    EndState endState = new EndState(context.getRootFlow(), "end");
    endState.setFinalResponseAction(new ViewFactoryActionAdapter(new StubViewFactory()));
    context.setCurrentState(endState);
    context.getRequestScope().put("foo", "bar");
    context.getFlowScope().put("bar", "baz");
    context.getFlowScope().put("bindBean", new BindBean());
    context.getConversationScope().put("baz", "boop");
    context.getFlashScope().put("boop", "bing");
    context.getMockExternalContext().setCurrentUser("Keith");
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.render();
    assertTrue(renderCalled);
    assertEquals("bar", model.get("foo"));
    assertEquals("baz", model.get("bar"));
    assertEquals("boop", model.get("baz"));
    assertEquals("bing", model.get("boop"));
    assertFalse(model.containsKey("flowExecutionKey"));
    assertFalse(model.containsKey("flowExecutionUrl"));
    assertEquals("Keith", ((Principal) model.get("currentUser")).getName());
    assertEquals(context, model.get("flowRequestContext"));
    assertNull(model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean"));
  }

  public void testRenderWithBindingModel() throws Exception {
    MockRequestControlContext context = new MockRequestControlContext();
    context.setCurrentState(new ViewState(context.getRootFlow(), "test", new StubViewFactory()));
    Object bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.setConversionService(new DefaultConversionService());
    view.render();
    assertEquals(context.getFlowScope().get("bindBean"), model.get("bindBean"));
    BindingModel bm = (BindingModel) model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean");
    assertNotNull(bm);
    assertEquals(null, bm.getFieldValue("stringProperty"));
    assertEquals("3", bm.getFieldValue("integerProperty"));
    assertEquals("2008-01-01", bm.getFieldValue("dateProperty"));
  }

  public void testResumeNoEvent() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    assertFalse(view.userEventQueued());
    view.processUserEvent();
    assertFalse(view.hasFlowEvent());
    assertNull(view.getFlowEvent());
  }

  public void testResumeEventNoModelBinding() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    assertTrue(view.userEventQueued());
    view.processUserEvent();
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
  }

  public void testResumeEventModelBinding() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "5");
    context.putRequestParameter("dateProperty", "2007-01-01");
    context.putRequestParameter("beanProperty.name", "foo");
    context.putRequestParameter("multipartFile", new MockMultipartFile("foo", new byte[0]));
    context.putRequestParameter("stringArrayProperty", new String[] { "foo", "bar", "baz" });
    context.putRequestParameter("integerArrayProperty", new String[] { "1", "2", "3" });
    context.putRequestParameter("primitiveArrayProperty", new String[] { "1", "2", "3" });
    context.putRequestParameter("listProperty", new String[] { "1", "2", "3" });
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.processUserEvent();
    assertTrue(view.hasFlowEvent());
    assertFalse(context.getFlashScope().contains(ViewActionStateHolder.KEY));
    assertEquals("submit", view.getFlowEvent().getId());
    assertEquals("foo", bindBean.getStringProperty());
    assertEquals(new Integer(5), bindBean.getIntegerProperty());
    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(Calendar.YEAR, 2007);
    assertEquals(cal.getTime(), bindBean.getDateProperty());
    assertEquals("foo", bindBean.getBeanProperty().getName());
    assertEquals("foo", bindBean.getMultipartFile().getName());
    assertEquals(3, bindBean.getStringArrayProperty().length);
    assertEquals("foo", bindBean.getStringArrayProperty()[0]);
    assertEquals("bar", bindBean.getStringArrayProperty()[1]);
    assertEquals("baz", bindBean.getStringArrayProperty()[2]);
    assertEquals(3, bindBean.getIntegerArrayProperty().length);
    assertEquals(new Integer(1), bindBean.getIntegerArrayProperty()[0]);
    assertEquals(new Integer(2), bindBean.getIntegerArrayProperty()[1]);
    assertEquals(new Integer(3), bindBean.getIntegerArrayProperty()[2]);
    assertEquals(3, bindBean.getPrimitiveArrayProperty().length);
    assertEquals(1, bindBean.getPrimitiveArrayProperty()[0]);
    assertEquals(2, bindBean.getPrimitiveArrayProperty()[1]);
    assertEquals(3, bindBean.getPrimitiveArrayProperty()[2]);
    assertEquals(3, bindBean.getListProperty().size());
    assertEquals("1", bindBean.getListProperty().get(0));
    assertEquals("2", bindBean.getListProperty().get(1));
    assertEquals("3", bindBean.getListProperty().get(2));
    assertFalse(bindBean.validationMethodInvoked);
  }

  public void testResumeEventBindingErrors() throws Exception {
    MockRequestControlContext context = new MockRequestControlContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("integerProperty", "bogus 1");
    context.putRequestParameter("dateProperty", "bogus 2");
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    context.setAlwaysRedirectOnPause(true);
    view.processUserEvent();
    assertFalse(view.hasFlowEvent());
    view.render();
    assertEquals(context.getFlowScope().get("bindBean"), model.get("bindBean"));
    BindingModel bm = (BindingModel) model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean");
    assertNotNull(bm);
    assertEquals("bogus 1", bm.getFieldValue("integerProperty"));
    assertEquals("bogus 2", bm.getFieldValue("dateProperty"));
  }

  public void testResumeEventNoModelInScope() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "5");
    context.putRequestParameter("dateProperty", "2007-01-01");
    context.putRequestParameter("beanProperty.name", "foo");
    context.putRequestParameter("multipartFile", new MockMultipartFile("foo", new byte[0]));
    context.putRequestParameter("stringArrayProperty", new String[] { "foo", "bar", "baz" });
    context.putRequestParameter("integerArrayProperty", new String[] { "1", "2", "3" });
    context.putRequestParameter("primitiveArrayProperty", new String[] { "1", "2", "3" });
    context.putRequestParameter("listProperty", new String[] { "1", "2", "3" });
    Expression modelObject = new Expression() {
      public String getExpressionString() {
        return "foo";
      }

      public Object getValue(Object context) throws EvaluationException {
        throw new EvaluationException(Object.class, "foo", "Model expression failed to evaluate");
      }

      public Class<?> getValueType(Object context) throws EvaluationException {
        return Object.class;
      }

      public void setValue(Object context, Object value) throws EvaluationException {
        throw new IllegalStateException("Should not be called");
      }
    };
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.processUserEvent();
    assertTrue(view.hasFlowEvent());
    assertFalse(context.getFlashScope().contains(ViewActionStateHolder.KEY));
    assertEquals("submit", view.getFlowEvent().getId());
  }

  public void testResumeEventBindingErrorsRedirectAfterPost() throws Exception {
    MockRequestControlContext context = new MockRequestControlContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("integerProperty", "bogus 1");
    context.putRequestParameter("dateProperty", "bogus 2");
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    context.setAlwaysRedirectOnPause(true);
    assertTrue(view.userEventQueued());
    view.processUserEvent();
    assertFalse(view.userEventQueued());
    assertFalse(view.hasFlowEvent());
    Object viewActionState = view.getUserEventState();
    assertNotNull(viewActionState);

    MockRequestControlContext context2 = new MockRequestControlContext();
    context2.getFlashScope().put(org.springframework.webflow.execution.View.USER_EVENT_STATE_ATTRIBUTE,
        viewActionState);
    BindBean bindBean2 = new BindBean();
    StaticExpression modelObject2 = new StaticExpression(bindBean2);
    modelObject2.setExpressionString("bindBean");
    context2.getCurrentState().getAttributes().put("model", modelObject);
    context2.getFlowScope().put("bindBean", bindBean);
    context2.getMockExternalContext().setNativeContext(new MockServletContext());
    context2.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context2.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context2.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    AbstractMvcView view2 = new MockMvcView(mvcView, context2);
    view2.setExpressionParser(createExpressionParser());
    view2.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    view2.restoreState((ViewActionStateHolder) viewActionState);
    assertFalse(view2.userEventQueued());
    view2.render();
    assertEquals(context2.getFlowScope().get("bindBean"), model.get("bindBean"));
    BindingModel bm = (BindingModel) model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean");
    assertNotNull(bm);
    assertEquals("bogus 1", bm.getFieldValue("integerProperty"));
    assertEquals("bogus 2", bm.getFieldValue("dateProperty"));
  }

  public void testResumeEventBindingErrorsRedirectToReplicatedSessionAfterPost() throws Exception {
    MockRequestControlContext context = new MockRequestControlContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("integerProperty", "bogus 1");
    context.putRequestParameter("dateProperty", "bogus 2");
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    context.setAlwaysRedirectOnPause(true);
    assertTrue(view.userEventQueued());
    view.processUserEvent();
    assertFalse(view.userEventQueued());
    assertFalse(view.hasFlowEvent());
    Object viewActionState = view.getUserEventState();
    assertNotNull(viewActionState);

    viewActionState = saveAndRestoreViewActionState(viewActionState);

    MockRequestControlContext context2 = new MockRequestControlContext();
    context2.getFlashScope().put(org.springframework.webflow.execution.View.USER_EVENT_STATE_ATTRIBUTE,
        viewActionState);
    BindBean bindBean2 = new BindBean();
    StaticExpression modelObject2 = new StaticExpression(bindBean2);
    modelObject2.setExpressionString("bindBean");
    context2.getCurrentState().getAttributes().put("model", modelObject);
    context2.getFlowScope().put("bindBean", bindBean);
    context2.getMockExternalContext().setNativeContext(new MockServletContext());
    context2.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context2.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context2.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    AbstractMvcView view2 = new MockMvcView(mvcView, context2);
    view2.setExpressionParser(createExpressionParser());
    view2.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    view2.restoreState((ViewActionStateHolder) viewActionState);
    assertFalse(view2.userEventQueued());
    view2.render();
    assertEquals(context2.getFlowScope().get("bindBean"), model.get("bindBean"));
    BindingModel bm = (BindingModel) model.get(BindingResult.MODEL_KEY_PREFIX + "bindBean");
    assertNotNull(bm);
    assertEquals("3", bm.getFieldValue("integerProperty"));
    assertEquals("2008-01-01", bm.getFieldValue("dateProperty"));
  }

  private Object saveAndRestoreViewActionState(Object viewActionState) throws Exception {
    File tempFile = new File("serializable.tmp");

    FileOutputStream fos = new FileOutputStream(tempFile);
    ObjectOutputStream objOut = new ObjectOutputStream(fos);
    objOut.writeObject(viewActionState);
    objOut.close();

    FileInputStream fis = new FileInputStream(tempFile);
    ObjectInputStream objIn = new ObjectInputStream(fis);
    Object restoredState = objIn.readObject();
    objIn.close();

    tempFile.delete();

    assertNotSame(viewActionState, restoredState);

    return restoredState;
  }

  public void testResumeEventModelBindingAllowedFields() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "5");
    context.putRequestParameter("dateProperty", "2007-01-01");
    context.putRequestParameter("beanProperty.name", "foo");
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    BinderConfiguration binderConfiguration = new BinderConfiguration();
    binderConfiguration.addBinding(new Binding("stringProperty", null, true));
    view.setBinderConfiguration(binderConfiguration);
    view.processUserEvent();
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
    assertEquals("foo", bindBean.getStringProperty());
    assertEquals(new Integer(3), bindBean.getIntegerProperty());
    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(Calendar.YEAR, 2008);
    assertEquals(cal.getTime(), bindBean.getDateProperty());
    assertEquals(null, bindBean.getBeanProperty().getName());
  }

  @SuppressWarnings("deprecation")
  public void testResumeEventModelBindingCustomConverter() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("dateProperty", "01-01-2007");
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    DefaultConversionService conversionService = new DefaultConversionService();
    StringToDate stringToDate = new StringToDate();
    stringToDate.setPattern("MM-dd-yyyy");
    conversionService.addConverter("customDateConverter", stringToDate);
    view.setConversionService(conversionService);
    BinderConfiguration binderConfiguration = new BinderConfiguration();
    binderConfiguration.addBinding(new Binding("dateProperty", "customDateConverter", true));
    view.setBinderConfiguration(binderConfiguration);
    view.processUserEvent();
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(Calendar.YEAR, 2007);
    assertEquals(cal.getTime(), bindBean.getDateProperty());
  }

  public void testResumeEventModelBindingFieldMarker() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("_booleanProperty", "whatever");
    BindBean bindBean = new BindBean();
    bindBean.setBooleanProperty(true);
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.processUserEvent();
    assertEquals(false, bindBean.getBooleanProperty());
  }

  public void testResumeEventModelBindingFieldMarkerFieldPresent() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("booleanProperty", "true");
    context.putRequestParameter("_booleanProperty", "whatever");
    BindBean bindBean = new BindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    assertTrue(view.userEventQueued());
    view.processUserEvent();
    assertFalse(view.userEventQueued());
    assertEquals(true, bindBean.getBooleanProperty());
  }

  public void testResumeEventModelBindAndValidate() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "5");
    context.putRequestParameter("dateProperty", "2007-01-01");
    BindBean bindBean = new ValidatingBindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    assertTrue(view.userEventQueued());
    view.processUserEvent();
    assertFalse(view.userEventQueued());
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
    assertTrue(bindBean.validationMethodInvoked);
  }

  public void testResumeEventModelBindAndValidateDefaultValidatorFallback() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "5");
    context.putRequestParameter("dateProperty", "2007-01-01");
    BindBean bindBean = new ValidatingBindBeanFallback();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    assertTrue(view.userEventQueued());
    view.processUserEvent();
    assertFalse(view.userEventQueued());
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
    assertTrue(bindBean.validationMethodInvoked);
  }

  public void testResumeEventModelValidateOnBindingErrors() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "bogus");
    context.putRequestParameter("dateProperty", "2007-01-01");
    BindBean bindBean = new ValidatingBindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    view.processUserEvent();
    assertFalse(view.hasFlowEvent());
    assertTrue(bindBean.validationMethodInvoked);
  }

  public void testResumeEventModelNoValidateOnBindingErrors() throws Exception {
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    context.putRequestParameter("stringProperty", "foo");
    context.putRequestParameter("integerProperty", "bogus");
    context.putRequestParameter("dateProperty", "2007-01-01");
    BindBean bindBean = new ValidatingBindBean();
    StaticExpression modelObject = new StaticExpression(bindBean);
    modelObject.setExpressionString("bindBean");
    context.getMockFlowExecutionContext().putAttribute("validateOnBindingErrors", false);
    context.getCurrentState().getAttributes().put("model", modelObject);
    context.getFlowScope().put("bindBean", bindBean);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setExpressionParser(createExpressionParser());
    view.setMessageCodesResolver(new WebFlowMessageCodesResolver());
    view.processUserEvent();
    assertFalse(view.hasFlowEvent());
    assertFalse(bindBean.validationMethodInvoked);
  }

  public void testResumeEventStringValidationHint() throws Exception {
    StubSmartValidator validator = new StubSmartValidator();
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    TestModel testModel = new TestModel();
    StaticExpression validationHintsExpression = new StaticExpression("State1,AllStates");
    context.getCurrentState().getAttributes().put("validationHints", validationHintsExpression);
    StaticExpression modelExpression = new StaticExpression(testModel);
    modelExpression.setExpressionString("testModel");
    context.getCurrentState().getAttributes().put("model", modelExpression);
    context.getFlowScope().put("testModel", testModel);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setValidator(validator);
    view.setExpressionParser(createExpressionParser());

    view.processUserEvent();

    assertFalse(view.userEventQueued());
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
    assertEquals(TestModel.State1.class, validator.hints[0]);
    assertEquals(TestModel.AllStates.class, validator.hints[1]);
    assertTrue(validator.invoked);
  }

  public void testResumeEventObjectArrayValidationHint() throws Exception {
    StubSmartValidator validator = new StubSmartValidator();
    MockRequestContext context = new MockRequestContext();
    context.putRequestParameter("_eventId", "submit");
    TestModel testModel = new TestModel();
    Object[] validationHints = new Object[] { TestModel.State1.class };
    StaticExpression validationHintsExpression = new StaticExpression(validationHints);
    context.getCurrentState().getAttributes().put("validationHints", validationHintsExpression);
    StaticExpression modelExpression = new StaticExpression(testModel);
    modelExpression.setExpressionString("testModel");
    context.getCurrentState().getAttributes().put("model", modelExpression);
    context.getFlowScope().put("testModel", testModel);
    context.getMockExternalContext().setNativeContext(new MockServletContext());
    context.getMockExternalContext().setNativeRequest(new MockHttpServletRequest());
    context.getMockExternalContext().setNativeResponse(new MockHttpServletResponse());
    context.getMockFlowExecutionContext().setKey(new MockFlowExecutionKey("c1v1"));
    org.springframework.web.servlet.View mvcView = new MockView();
    AbstractMvcView view = new MockMvcView(mvcView, context);
    view.setValidator(validator);
    view.setExpressionParser(createExpressionParser());

    view.processUserEvent();

    assertFalse(view.userEventQueued());
    assertTrue(view.hasFlowEvent());
    assertEquals("submit", view.getFlowEvent().getId());
    assertEquals(validationHints, validator.hints);
    assertTrue(validator.invoked);
  }

  private SpringELExpressionParser createExpressionParser() {
    StringToDate c = new StringToDate();
    c.setPattern("yyyy-MM-dd");
    SpringELExpressionParser parser = new WebFlowSpringELExpressionParser(new SpelExpressionParser());
    GenericConversionService cs = (GenericConversionService) parser.getConversionService();
    cs.addConverter(c);
    return parser;
  }

  private class MockMvcView extends AbstractMvcView {

    public MockMvcView(View view, RequestContext context) {
      super(view, context);
    }

    protected void doRender(Map<String, ?> model) throws Exception {
      getView().render(model, (HttpServletRequest) getRequestContext().getExternalContext().getNativeRequest(),
          (HttpServletResponse) getRequestContext().getExternalContext().getNativeResponse());
    }

  }

  private class MockView implements View {

    public String getContentType() {
      return "text/html";
    }

    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
        throws Exception {
      renderCalled = true;
      MvcViewTests.this.model = model;
    }

  }

  public static class BindBean {
    private String stringProperty;
    private Integer integerProperty = 3;
    private Date dateProperty;
    private boolean booleanProperty = true;
    private NestedBean beanProperty;
    private MultipartFile multipartFile;

    private String[] stringArrayProperty;
    private Integer[] integerArrayProperty;
    private int[] primitiveArrayProperty;
    private List<Object> listProperty;
    private Map<Object, Object> mapProperty;
    private boolean validationMethodInvoked;

    public BindBean() {
      Calendar cal = Calendar.getInstance();
      cal.clear();
      cal.set(Calendar.YEAR, 2008);
      dateProperty = cal.getTime();
      beanProperty = new NestedBean();
    }

    public String getStringProperty() {
      return stringProperty;
    }

    public void setStringProperty(String stringProperty) {
      this.stringProperty = stringProperty;
    }

    public Integer getIntegerProperty() {
      return integerProperty;
    }

    public void setIntegerProperty(Integer integerProperty) {
      this.integerProperty = integerProperty;
    }

    public boolean getBooleanProperty() {
      return booleanProperty;
    }

    public void setBooleanProperty(boolean booleanProperty) {
      this.booleanProperty = booleanProperty;
    }

    public Date getDateProperty() {
      return dateProperty;
    }

    public void setDateProperty(Date dateProperty) {
      this.dateProperty = dateProperty;
    }

    public NestedBean getBeanProperty() {
      return beanProperty;
    }

    public MultipartFile getMultipartFile() {
      return multipartFile;
    }

    public void setMultipartFile(MultipartFile multipartFile) {
      this.multipartFile = multipartFile;
    }

    public String[] getStringArrayProperty() {
      return stringArrayProperty;
    }

    public void setStringArrayProperty(String[] stringArrayProperty) {
      this.stringArrayProperty = stringArrayProperty;
    }

    public Integer[] getIntegerArrayProperty() {
      return integerArrayProperty;
    }

    public void setIntegerArrayProperty(Integer[] integerArrayProperty) {
      this.integerArrayProperty = integerArrayProperty;
    }

    public int[] getPrimitiveArrayProperty() {
      return primitiveArrayProperty;
    }

    public void setPrimitiveArrayProperty(int[] primitiveArrayProperty) {
      this.primitiveArrayProperty = primitiveArrayProperty;
    }

    public List<Object> getListProperty() {
      return listProperty;
    }

    public void setListProperty(List<Object> listProperty) {
      this.listProperty = listProperty;
    }

    public Map<Object, Object> getMapProperty() {
      return mapProperty;
    }

    public void setMapProperty(Map<Object, Object> mapProperty) {
      this.mapProperty = mapProperty;
    }

    public void setBeanProperty(NestedBean beanProperty) {
      this.beanProperty = beanProperty;
    }

  }

  public static class ValidatingBindBean extends BindBean {

    public void validateMockState(ValidationContext context) {
      super.validationMethodInvoked = true;
    }
  }

  public static class ValidatingBindBeanFallback extends BindBean {

    public void validate(ValidationContext context) {
      assertEquals("submit", context.getUserEvent());
      assertNull(context.getUserPrincipal());
      assertEquals("foo", context.getUserValue("stringProperty"));
      super.validationMethodInvoked = true;
    }
  }

  public static class NestedBean {
    private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }
  }

  public static class StubSmartValidator implements SmartValidator {
    private boolean invoked;
    private Object[] hints;

    public void validate(Object object, Errors errors) {
      invoked = true;
    }

    public void validate(Object object, Errors errors, Object... hints) {
      invoked = true;
      this.hints = hints;
    }

    public boolean supports(Class<?> clazz) {
      return true;
    }
  }

  private static class TestModel {

    public static class State1 {
    }

    public static class AllStates {
    }
  }

}
TOP

Related Classes of org.springframework.webflow.mvc.view.MvcViewTests$TestModel$AllStates

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.