Author: seade Date: Tue May 15 19:46:01 2007 New Revision: 538410 URL: http://svn.apache.org/viewvc?view=rev&rev=538410 Log: Ensure that required fields that are not set are still validated. Added test case for this and a couple of other potential problems.
Added: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/RequiredFalseGroupTestObject.java Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/conf/test/intake.xml jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/IntakeServiceTest.java Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/conf/test/intake.xml URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/conf/test/intake.xml?view=diff&rev=538410&r1=538409&r2=538410 ============================================================================== --- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/conf/test/intake.xml (original) +++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/conf/test/intake.xml Tue May 15 19:46:01 2007 @@ -53,12 +53,20 @@ <rule value="IntMin" name="less-than-or-equal">Value must be less than or equal to IntMin</rule> </field> </group> - <group name="RequiredFalseTest" key="rft"> + <group name="RequiredFalseTest" key="rft" mapToObject="org.apache.turbine.services.intake.RequiredFalseGroupTestObject"> <field name="StringRF" key="stringrf" type="String"> <rule name="required" value="false">Please enter a value.</rule> <rule name="minLength" value="3">Please enter 3 characters only.</rule> <rule name="maxLength" value="3">Please enter 3 characters only.</rule> </field> + <!-- An Integer object --> + <field name="IntegerRF" key="integerrf" type="int"> + <rule name="required" value="false">Please enter the a value.</rule> + <rule name="minValue" value="1">The value for this field must be between 1 and 250 inclusive.</rule> + <rule name="maxValue" value="250">The value for this field must be between 1 and 250 inclusive.</rule> + <rule name="invalidNumber" value="true">The value entered must be a number.</rule> + </field> + <!-- An int primative --> <field name="IntRF" key="intrf" type="int"> <rule name="required" value="false">Please enter the a value.</rule> <rule name="minValue" value="1">The value for this field must be between 1 and 250 inclusive.</rule> @@ -69,6 +77,13 @@ <rule name="required" value="false">Please enter a value.</rule> <rule name="format" value="d/MM/yyyy">Please enter a sensible date ("dd/mm/yyyy").</rule> <rule name="format1" value="d/MM/yy">Please enter a sensible date ("dd/mm/yyyy").</rule> + </field> + </group> + <group name="RequiredTrueTest" key="rtt"> + <field name="StringRT" key="stringrt" type="String"> + <rule name="required" value="true">Please enter a value.</rule> + <rule name="minLength" value="3">Please enter 3 characters only.</rule> + <rule name="maxLength" value="3">Please enter 3 characters only.</rule> </field> </group> </input-data> Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java?view=diff&rev=538410&r1=538409&r2=538410 ============================================================================== --- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java (original) +++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java Tue May 15 19:46:01 2007 @@ -187,7 +187,8 @@ } for (int i = fieldsArray.length - 1; i >= 0; i--) { - if (fieldsArray[i].isSet() && !fieldsArray[i].isValidated()) + if ((fieldsArray[i].isSet() || fieldsArray[i].isRequired()) + && !fieldsArray[i].isValidated()) { fieldsArray[i].validate(); } Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/IntakeServiceTest.java URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/IntakeServiceTest.java?view=diff&rev=538410&r1=538409&r2=538410 ============================================================================== --- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/IntakeServiceTest.java (original) +++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/IntakeServiceTest.java Tue May 15 19:46:01 2007 @@ -19,6 +19,9 @@ * under the License. */ +import java.util.Calendar; +import java.util.Date; + import junit.framework.TestSuite; import org.apache.turbine.services.ServiceManager; @@ -40,6 +43,7 @@ Group rangeTestGroup = null; Group integerRangeTestGroup = null; Group requiredFalseTestGroup = null; + Group requiredTrueTestGroup = null; public IntakeServiceTest(String name) throws Exception { @@ -51,9 +55,9 @@ rangeTestGroup = intakeService.getGroup("DateRangeTest"); integerRangeTestGroup = intakeService.getGroup("IntRangeTest"); requiredFalseTestGroup = intakeService.getGroup("RequiredFalseTest"); + requiredTrueTestGroup = intakeService.getGroup("RequiredTrueTest"); } - public void testEmptyBooleanField() throws IntakeException { Field booleanField = booleanTestGroup.get("EmptyBooleanTestField"); @@ -107,29 +111,150 @@ assertFalse("The integer range should not be valid", imax2.isValid()); } + /** + * This test attempts to verify that an intake field returns false for + * isSet() when an empty field is submitted (IMHO this was a bug prior to + * revision 538232 (i.e. release 2.3.3). + * + * @throws IntakeException + */ public void testRequiredFalse() throws IntakeException { ParameterParser pp = new DefaultParameterParser(); pp.add("rft_0stringrf", ""); + pp.add("rft_0integerrf", ""); pp.add("rft_0intrf", ""); pp.add("rft_0daterf", ""); requiredFalseTestGroup.init(Group.NEW, pp); - + Field stringRF = requiredFalseTestGroup.get("StringRF"); + Field integerRF = requiredFalseTestGroup.get("IntegerRF"); Field intRF = requiredFalseTestGroup.get("IntRF"); Field dateRF = requiredFalseTestGroup.get("DateRF"); - + assertFalse("StringRF should not be set", stringRF.isSet()); assertTrue("StringRF should be valid", stringRF.isValid()); assertNull(stringRF.getValue()); + assertFalse("IntegerRF should not be set", integerRF.isSet()); + assertTrue("IntegerRF should be valid", integerRF.isValid()); + assertNull(integerRF.getValue()); assertFalse("IntRF should not be set", intRF.isSet()); assertTrue("IntRF should be valid", intRF.isValid()); - assertNull(intRF.getValue()); + assertNull(intRF.getValue()); // zero? assertFalse("DateRF should not be set", dateRF.isSet()); assertTrue("DateRF should be valid", dateRF.isValid()); assertNull(dateRF.getValue()); } - + + /** + * This test attempts to verify that with the isSet() fix applied to Field + * (see testRequiredFalse()) an empty field will still clear existing + * values. + * + * @throws IntakeException + */ + public void testClearValues() throws IntakeException + { + RequiredFalseGroupTestObject rfgto = new RequiredFalseGroupTestObject(); + rfgto.setStringRF("originalString"); + rfgto.setIntegerRF(new Integer(5)); + rfgto.setIntRF(6); + Date testDate = new Date(); + rfgto.setDateRF(testDate); + + ParameterParser pp = new DefaultParameterParser(); + pp.add("rft_0stringrf", ""); + pp.add("rft_0integerrf", ""); + pp.add("rft_0intrf", ""); + pp.add("rft_0daterf", ""); + requiredFalseTestGroup.init(Group.NEW, pp); + + requiredFalseTestGroup.setProperties(rfgto); + assertNull("String value should have been cleared.", rfgto.getStringRF()); + assertNull("Date value should have been cleared.", rfgto.getDateRF()); + assertEquals("int value should have been cleared to zero.", 0, rfgto.getIntRF()); + + // The following commented out test fails. + // The trouble is that the use of reflection forces Intake to use Integer rather than int + // when invoking the setter method on the object to which the group is being mapped. + + //assertNull("Integer value should have been cleared to null, but instead it is " + // + rfgto.getIntegerRF(), rfgto.getIntegerRF()); + + // The net result is that Intake is currently not well suited to validating + // Integer fields where a null value needs to be distinguished from a zero. + } + + /** + * This test attempts to verify that with that valid values coming from + * intake map through to an object correctly. + * + * @throws IntakeException + */ + public void testSetValues() throws IntakeException + { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + Date testDate = cal.getTime(); + // This is in dd/mm/yyyy format, as defined in the intake.xml for this group. + String testDateString = cal.get(Calendar.DAY_OF_MONTH) + "/" + + (cal.get(Calendar.MONTH) + 1) + "/" + (cal.get(Calendar.YEAR)); + + ParameterParser pp = new DefaultParameterParser(); + pp.add("rft_0stringrf", "ABC"); // rules require 3 characters. + pp.add("rft_0integerrf", new Integer(10)); + pp.add("rft_0intrf", 11); + pp.add("rft_0daterf", testDateString); + requiredFalseTestGroup.init(Group.NEW, pp); + + Field stringRF = requiredFalseTestGroup.get("StringRF"); + Field integerRF = requiredFalseTestGroup.get("IntegerRF"); + Field intRF = requiredFalseTestGroup.get("IntRF"); + Field dateRF = requiredFalseTestGroup.get("DateRF"); + + assertTrue("StringRF should be set", stringRF.isSet()); + assertTrue("StringRF should be valid", stringRF.isValid()); + assertEquals("ABC", stringRF.getValue()); + assertTrue("IntegerRF should be set", integerRF.isSet()); + assertTrue("IntegerRF should be valid", integerRF.isValid()); + assertEquals(new Integer(10), integerRF.getValue()); + assertTrue("IntRF should be set", intRF.isSet()); + assertTrue("IntRF should be valid", intRF.isValid()); + assertEquals(11, ((Integer) intRF.getValue()).intValue()); + assertTrue("DateRF should be set", dateRF.isSet()); + assertTrue("DateRF should be valid", dateRF.isValid()); + assertEquals(testDate, dateRF.getValue()); + + RequiredFalseGroupTestObject rfgto = new RequiredFalseGroupTestObject(); + requiredFalseTestGroup.setProperties(rfgto); + assertEquals("ABC", rfgto.getStringRF()); + assertEquals(new Integer(10), rfgto.getIntegerRF()); + assertEquals(11, rfgto.getIntRF()); + assertEquals(testDate, rfgto.getDateRF()); + } + + /** + * Test that a required field with no value assigned is invalid. + * + * @throws IntakeException + */ + public void testRequiredTrue() throws IntakeException + { + ParameterParser pp = new DefaultParameterParser(); + pp.add("rft_0stringrf", ""); + requiredTrueTestGroup.init(Group.NEW, pp); + + Field stringRT = requiredTrueTestGroup.get("StringRT"); + + assertFalse("StringRT should not be set", stringRT.isSet()); + assertFalse("StringRT should not be valid", stringRT.isValid()); + assertNull(stringRT.getValue()); + } + /** * Factory method for creating a TestSuite for this class. * Added: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/RequiredFalseGroupTestObject.java URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/RequiredFalseGroupTestObject.java?view=auto&rev=538410 ============================================================================== --- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/RequiredFalseGroupTestObject.java (added) +++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/test/org/apache/turbine/services/intake/RequiredFalseGroupTestObject.java Tue May 15 19:46:01 2007 @@ -0,0 +1,94 @@ +package org.apache.turbine.services.intake; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import java.util.Date; + +public class RequiredFalseGroupTestObject +{ + private String stringRF; + private Integer integerRF = null; + private int intRF; + private Date dateRF; + + /** + * @return the dateRF + */ + public Date getDateRF() + { + return dateRF; + } + + /** + * @param dateRF the dateRF to set + */ + public void setDateRF(Date dateRF) + { + this.dateRF = dateRF; + } + + /** + * @return the integerRF + */ + public Integer getIntegerRF() + { + return integerRF; + } + + /** + * @param integerRF the integerRF to set + */ + public void setIntegerRF(Integer integerRF) + { + this.integerRF = integerRF; + } + + /** + * @return the intRF + */ + public int getIntRF() + { + return intRF; + } + + /** + * @param intRF the intRF to set + */ + public void setIntRF(int intRF) + { + this.intRF = intRF; + } + + /** + * @return the stringRF + */ + public String getStringRF() + { + return stringRF; + } + + /** + * @param stringRF the stringRF to set + */ + public void setStringRF(String stringRF) + { + this.stringRF = stringRF; + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]