/* * Copyright 2002-2006 the original author or authors. * * 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.springframework.web.portlet.bind; import java.beans.PropertyEditorSupport; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.Set; import junit.framework.TestCase; import org.springframework.beans.ITestBean; import org.springframework.beans.TestBean; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.StringArrayPropertyEditor; import org.springframework.core.CollectionFactory; import org.springframework.mock.web.portlet.MockPortletRequest; import org.springframework.validation.BindingResult; /** * @author Mark Fisher */ public class PortletRequestDataBinderTests extends TestCase { public void testSimpleBind() { TestBean bean = new TestBean(); MockPortletRequest request = new MockPortletRequest(); request.addParameter("age", "35"); request.addParameter("name", "test"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); assertEquals(35, bean.getAge()); assertEquals("test", bean.getName()); } public void testNestedBind() { TestBean bean = new TestBean(); bean.setSpouse(new TestBean()); MockPortletRequest request = new MockPortletRequest(); request.addParameter("spouse.name", "test"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); assertNotNull(bean.getSpouse()); assertEquals("test", bean.getSpouse().getName()); } public void testNestedBindWithPropertyEditor() { TestBean bean = new TestBean(); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.registerCustomEditor(ITestBean.class, new PropertyEditorSupport() { public void setAsText(String text) throws IllegalArgumentException { setValue(new TestBean(text)); } }); MockPortletRequest request = new MockPortletRequest(); request.addParameter("spouse", "test"); request.addParameter("spouse.age", "32"); binder.bind(request); assertNotNull(bean.getSpouse()); assertEquals("test", bean.getSpouse().getName()); assertEquals(32, bean.getSpouse().getAge()); } public void testBindingMismatch() { TestBean bean = new TestBean(); bean.setAge(30); MockPortletRequest request = new MockPortletRequest(); request.addParameter("age", "zzz"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); BindingResult error = binder.getBindingResult(); assertNotNull(error.getFieldError("age")); assertEquals("typeMismatch", error.getFieldError("age").getCode()); assertEquals(30, bean.getAge()); } public void testBindingStringWithCommaSeparatedValue() throws Exception { TestBean bean = new TestBean(); MockPortletRequest request = new MockPortletRequest(); request.addParameter("stringArray", "test1,test2"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); assertNotNull(bean.getStringArray()); assertEquals(1, bean.getStringArray().length); assertEquals("test1,test2", bean.getStringArray()[0]); } public void testBindingStringArrayWithSplitting() { TestBean bean = new TestBean(); MockPortletRequest request = new MockPortletRequest(); request.addParameter("stringArray", "test1,test2"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor()); binder.bind(request); assertNotNull(bean.getStringArray()); assertEquals(2, bean.getStringArray().length); assertEquals("test1", bean.getStringArray()[0]); assertEquals("test2", bean.getStringArray()[1]); } public void testBindingList() { TestBean bean = new TestBean(); MockPortletRequest request = new MockPortletRequest(); request.addParameter("someList[0]", "test1"); request.addParameter("someList[1]", "test2"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); assertNotNull(bean.getSomeList()); assertEquals(2, bean.getSomeList().size()); assertEquals("test1", bean.getSomeList().get(0)); assertEquals("test2", bean.getSomeList().get(1)); } public void testBindingMap() { TestBean bean = new TestBean(); MockPortletRequest request = new MockPortletRequest(); request.addParameter("someMap['key1']", "val1"); request.addParameter("someMap['key2']", "val2"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); assertNotNull(bean.getSomeMap()); assertEquals(2, bean.getSomeMap().size()); assertEquals("val1", bean.getSomeMap().get("key1")); assertEquals("val2", bean.getSomeMap().get("key2")); } public void testBindingSet() { TestBean bean = new TestBean(); Set set = CollectionFactory.createLinkedSetIfPossible(2); set.add(new TestBean("test1")); set.add(new TestBean("test2")); bean.setSomeSet(set); MockPortletRequest request = new MockPortletRequest(); request.addParameter("someSet[0].age", "35"); request.addParameter("someSet[1].age", "36"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.bind(request); assertNotNull(bean.getSomeSet()); assertEquals(2, bean.getSomeSet().size()); Iterator iter = bean.getSomeSet().iterator(); TestBean bean1 = (TestBean) iter.next(); assertEquals("test1", bean1.getName()); assertEquals(35, bean1.getAge()); TestBean bean2 = (TestBean) iter.next(); assertEquals("test2", bean2.getName()); assertEquals(36, bean2.getAge()); } public void testBindingDate() throws Exception { TestBean bean = new TestBean(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); Date expected = dateFormat.parse("06-03-2006"); MockPortletRequest request = new MockPortletRequest(); request.addParameter("date", "06-03-2006"); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); binder.bind(request); assertEquals(expected, bean.getDate()); } public void testBindingFailsWhenMissingRequiredParam() { TestBean bean = new TestBean(); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.setRequiredFields(new String[] {"age", "name"}); MockPortletRequest request = new MockPortletRequest(); request.addParameter("age", "35"); binder.bind(request); BindingResult error = binder.getBindingResult(); assertNotNull(error.getFieldError("name")); assertEquals("required", error.getFieldError("name").getCode()); } public void testBindingExcludesDisallowedParam() { TestBean bean = new TestBean(); PortletRequestDataBinder binder = new PortletRequestDataBinder(bean); binder.setAllowedFields(new String[] {"age"}); MockPortletRequest request = new MockPortletRequest(); request.addParameter("age", "35"); request.addParameter("name", "test"); binder.bind(request); assertEquals(35, bean.getAge()); assertNull(bean.getName()); } }