/* * 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.validation; import java.beans.PropertyEditorSupport; import java.util.Map; import junit.framework.TestCase; import org.springframework.beans.FieldAccessBean; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.NotWritablePropertyException; import org.springframework.beans.PropertyValue; import org.springframework.beans.TestBean; /** * @author Juergen Hoeller * @since 07.03.2006 */ public class DataBinderFieldAccessTests extends TestCase { public void testBindingNoErrors() throws Exception { FieldAccessBean rod = new FieldAccessBean(); DataBinder binder = new DataBinder(rod, "person"); assertTrue(binder.isIgnoreUnknownFields()); binder.initDirectFieldAccess(); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue(new PropertyValue("name", "Rod")); pvs.addPropertyValue(new PropertyValue("age", new Integer(32))); pvs.addPropertyValue(new PropertyValue("nonExisting", "someValue")); binder.bind(pvs); binder.close(); assertTrue("changed name correctly", rod.getName().equals("Rod")); assertTrue("changed age correctly", rod.getAge() == 32); Map m = binder.getBindingResult().getModel(); assertTrue("There is one element in map", m.size() == 2); FieldAccessBean tb = (FieldAccessBean) m.get("person"); assertTrue("Same object", tb.equals(rod)); } public void testBindingNoErrorsNotIgnoreUnknown() throws Exception { FieldAccessBean rod = new FieldAccessBean(); DataBinder binder = new DataBinder(rod, "person"); binder.initDirectFieldAccess(); binder.setIgnoreUnknownFields(false); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue(new PropertyValue("name", "Rod")); pvs.addPropertyValue(new PropertyValue("age", new Integer(32))); pvs.addPropertyValue(new PropertyValue("nonExisting", "someValue")); try { binder.bind(pvs); fail("Should have thrown NotWritablePropertyException"); } catch (NotWritablePropertyException ex) { // expected } } public void testBindingWithErrors() throws Exception { FieldAccessBean rod = new FieldAccessBean(); DataBinder binder = new DataBinder(rod, "person"); binder.initDirectFieldAccess(); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue(new PropertyValue("name", "Rod")); pvs.addPropertyValue(new PropertyValue("age", "32x")); binder.bind(pvs); try { binder.close(); fail("Should have thrown BindException"); } catch (BindException ex) { assertTrue("changed name correctly", rod.getName().equals("Rod")); //assertTrue("changed age correctly", rod.getAge() == 32); Map map = binder.getBindingResult().getModel(); //assertTrue("There are 3 element in map", m.size() == 1); FieldAccessBean tb = (FieldAccessBean) map.get("person"); assertTrue("Same object", tb.equals(rod)); BindingResult br = (BindingResult) map.get(BindingResult.MODEL_KEY_PREFIX + "person"); assertTrue("Added itself to map", br == binder.getBindingResult()); assertTrue(br.hasErrors()); assertTrue("Correct number of errors", br.getErrorCount() == 1); assertTrue("Has age errors", br.hasFieldErrors("age")); assertTrue("Correct number of age errors", br.getFieldErrorCount("age") == 1); assertEquals("32x", binder.getBindingResult().getFieldValue("age")); assertEquals("32x", binder.getBindingResult().getFieldError("age").getRejectedValue()); assertEquals(0, tb.getAge()); } } public void testBindingWithErrorsAndCustomEditors() throws Exception { FieldAccessBean rod = new FieldAccessBean(); DataBinder binder = new DataBinder(rod, "person"); binder.initDirectFieldAccess(); binder.registerCustomEditor(TestBean.class, "spouse", new PropertyEditorSupport() { public void setAsText(String text) throws IllegalArgumentException { setValue(new TestBean(text, 0)); } public String getAsText() { return ((TestBean) getValue()).getName(); } }); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue(new PropertyValue("name", "Rod")); pvs.addPropertyValue(new PropertyValue("age", "32x")); pvs.addPropertyValue(new PropertyValue("spouse", "Kerry")); binder.bind(pvs); try { binder.close(); fail("Should have thrown BindException"); } catch (BindException ex) { assertTrue("changed name correctly", rod.getName().equals("Rod")); //assertTrue("changed age correctly", rod.getAge() == 32); Map model = binder.getBindingResult().getModel(); //assertTrue("There are 3 element in map", m.size() == 1); FieldAccessBean tb = (FieldAccessBean) model.get("person"); assertTrue("Same object", tb.equals(rod)); BindingResult br = (BindingResult) model.get(BindingResult.MODEL_KEY_PREFIX + "person"); assertTrue("Added itself to map", br == binder.getBindingResult()); assertTrue(br.hasErrors()); assertTrue("Correct number of errors", br.getErrorCount() == 1); assertTrue("Has age errors", br.hasFieldErrors("age")); assertTrue("Correct number of age errors", br.getFieldErrorCount("age") == 1); assertEquals("32x", binder.getBindingResult().getFieldValue("age")); assertEquals("32x", binder.getBindingResult().getFieldError("age").getRejectedValue()); assertEquals(0, tb.getAge()); assertTrue("Does not have spouse errors", !br.hasFieldErrors("spouse")); assertEquals("Kerry", binder.getBindingResult().getFieldValue("spouse")); assertNotNull(tb.getSpouse()); } } }