    1   /*
    2    * $Id: ExtensionTest.java 329871 2005-10-31 17:50:55Z niallp $
    3    * $Rev: 329871 $
    4    * $Date: 2005-10-31 17:50:55 +0000 (Mon, 31 Oct 2005) $
    5    *
    6    * ====================================================================
    7    * Copyright 2001-2005 The Apache Software Foundation
    8    *
    9    * Licensed under the Apache License, Version 2.0 (the "License");
    10   * you may not use this file except in compliance with the License.
    11   * You may obtain a copy of the License at
    12   *
    13   *     http://www.apache.org/licenses/LICENSE-2.0
    14   *
    15   * Unless required by applicable law or agreed to in writing, software
    16   * distributed under the License is distributed on an "AS IS" BASIS,
    17   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    18   * See the License for the specific language governing permissions and
    19   * limitations under the License.
    20   */
    21
    22  package org.apache.commons.validator;
    23
    24  import java.io.InputStream;
    25
    26  import junit.framework.Test;
    27  import junit.framework.TestCase;
    28  import junit.framework.TestSuite;
    29
    30  /***
    31   * <p>Performs tests for extension in form definitions. Performs the same tests
    32   * RequiredNameTest does but with an equivalent validation definition with extension
    33   * definitions (validator-extension.xml), plus an extra check on overriding rules and
    34   * another one checking it mantains correct order when extending.</p>
    35   */
    36  public class ExtensionTest extends TestCase {
    37
    38      /***
    39       * The key used to retrieve the set of validation
    40       * rules from the xml file.
    41      */
    42      protected static String FORM_KEY = "nameForm";
    43
    44      /***
    45       * The key used to retrieve the set of validation
    46       * rules from the xml file.
    47      */
    48      protected static String FORM_KEY2 = "nameForm2";
    49
    50      /***
    51       * The key used to retrieve the set of validation
    52       * rules from the xml file.
    53      */
    54      protected static String CHECK_MSG_KEY = "nameForm.lastname.displayname";
    55
    56      /***
    57       * The key used to retrieve the validator action.
    58      */
    59      protected static String ACTION = "required";
    60
    61      /***
    62       * Resources used for validation tests.
    63      */
    64      private ValidatorResources resources = null;
    65
    66      /***
    67       * Constructor de ExtensionTest.
    68       * @param arg0
    69       */
    70      public ExtensionTest(String arg0) {
    71          super(arg0);
    72      }
    73
    74      /***
    75       * Start the tests.
    76       *
    77       * @param theArgs the arguments. Not used
    78       */
    79      public static void main(String[] theArgs) {
    80          junit.awtui.TestRunner.main(new String[] {RequiredNameTest.class.getName()});
    81      }
    82
    83      /***
    84       * @return a test suite (<code>TestSuite</code>) that includes all methods
    85       *         starting with "test"
    86       */
    87      public static Test suite() {
    88          // All methods starting with "test" will be executed in the test suite.
    89          return new TestSuite(ExtensionTest.class);
    90      }
    91
    92      /***
    93       * Load <code>ValidatorResources</code> from
    94       * validator-extension.xml.
    95      */
    96      protected void setUp() throws Exception {
    97  		// Load resources
    98  		InputStream in = null;
    99
    100 		try {
    101 			in = this.getClass().getResourceAsStream("ExtensionTest-config.xml");
    102 			resources = new ValidatorResources(in);
    103 		} finally {
    104 			if (in != null) {
    105 				in.close();
    106 			}
    107 		}
    108 	}
    109
    110     protected void tearDown() {
    111     }
    112
    113     /***
    114      * Tests the required validation failure.
    115     */
    116     public void testRequired() throws ValidatorException {
    117        // Create bean to run test on.
    118        NameBean name = new NameBean();
    119
    120        // Construct validator based on the loaded resources
    121        // and the form key
    122        Validator validator = new Validator(resources, FORM_KEY);
    123        // add the name bean to the validator as a resource
    124        // for the validations to be performed on.
    125        validator.setParameter(Validator.BEAN_PARAM, name);
    126
    127        // Get results of the validation.
    128        ValidatorResults results = null;
    129
    130        // throws ValidatorException,
    131        // but we aren't catching for testing
    132        // since no validation methods we use
    133        // throw this
    134        results = validator.validate();
    135
    136        assertNotNull("Results are null.", results);
    137
    138        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    139        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    140
    141        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    142        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
    143        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have failed.", !firstNameResult.isValid(ACTION));
    144
    145        assertNotNull("First Name ValidatorResult should not be null.", lastNameResult);
    146        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
    147        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have failed.", !lastNameResult.isValid(ACTION));
    148     }
    149
    150     /***
    151      * Tests the required validation for first name if it is blank.
    152     */
    153     public void testRequiredFirstNameBlank() throws ValidatorException {
    154        // Create bean to run test on.
    155        NameBean name = new NameBean();
    156        name.setFirstName("");
    157
    158        // Construct validator based on the loaded resources
    159        // and the form key
    160        Validator validator = new Validator(resources, FORM_KEY);
    161        // add the name bean to the validator as a resource
    162        // for the validations to be performed on.
    163        validator.setParameter(Validator.BEAN_PARAM, name);
    164
    165        // Get results of the validation.
    166        ValidatorResults results = null;
    167
    168        results = validator.validate();
    169
    170        assertNotNull("Results are null.", results);
    171
    172        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    173        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    174
    175        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    176        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
    177        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have failed.", !firstNameResult.isValid(ACTION));
    178
    179        assertNotNull("First Name ValidatorResult should not be null.", lastNameResult);
    180        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
    181        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have failed.", !lastNameResult.isValid(ACTION));
    182     }
    183
    184     /***
    185      * Tests the required validation for first name.
    186     */
    187     public void testRequiredFirstName() throws ValidatorException {
    188        // Create bean to run test on.
    189        NameBean name = new NameBean();
    190        name.setFirstName("Joe");
    191
    192        // Construct validator based on the loaded resources
    193        // and the form key
    194        Validator validator = new Validator(resources, FORM_KEY);
    195        // add the name bean to the validator as a resource
    196        // for the validations to be performed on.
    197        validator.setParameter(Validator.BEAN_PARAM, name);
    198
    199        // Get results of the validation.
    200        ValidatorResults results = null;
    201
    202        results = validator.validate();
    203
    204        assertNotNull("Results are null.", results);
    205
    206        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    207        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    208
    209        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    210        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
    211        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have passed.", firstNameResult.isValid(ACTION));
    212
    213        assertNotNull("First Name ValidatorResult should not be null.", lastNameResult);
    214        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
    215        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have failed.", !lastNameResult.isValid(ACTION));
    216     }
    217
    218     /***
    219      * Tests the required validation for last name if it is blank.
    220     */
    221     public void testRequiredLastNameBlank() throws ValidatorException {
    222        // Create bean to run test on.
    223        NameBean name = new NameBean();
    224        name.setLastName("");
    225
    226        // Construct validator based on the loaded resources
    227        // and the form key
    228        Validator validator = new Validator(resources, FORM_KEY);
    229        // add the name bean to the validator as a resource
    230        // for the validations to be performed on.
    231        validator.setParameter(Validator.BEAN_PARAM, name);
    232
    233        // Get results of the validation.
    234        ValidatorResults results = null;
    235
    236        results = validator.validate();
    237
    238        assertNotNull("Results are null.", results);
    239
    240        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    241        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    242
    243        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    244        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
    245        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have failed.", !firstNameResult.isValid(ACTION));
    246
    247        assertNotNull("First Name ValidatorResult should not be null.", lastNameResult);
    248        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
    249        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have failed.", !lastNameResult.isValid(ACTION));
    250     }
    251
    252     /***
    253      * Tests the required validation for last name.
    254     */
    255     public void testRequiredLastName() throws ValidatorException {
    256        // Create bean to run test on.
    257        NameBean name = new NameBean();
    258        name.setLastName("Smith");
    259
    260        // Construct validator based on the loaded resources
    261        // and the form key
    262        Validator validator = new Validator(resources, FORM_KEY);
    263        // add the name bean to the validator as a resource
    264        // for the validations to be performed on.
    265        validator.setParameter(Validator.BEAN_PARAM, name);
    266
    267        // Get results of the validation.
    268        ValidatorResults results = null;
    269
    270        results = validator.validate();
    271
    272        assertNotNull("Results are null.", results);
    273
    274        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    275        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    276
    277        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    278        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
    279        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have failed.", !firstNameResult.isValid(ACTION));
    280
    281        assertNotNull("First Name ValidatorResult should not be null.", lastNameResult);
    282        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
    283        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have passed.", lastNameResult.isValid(ACTION));
    284
    285     }
    286
    287     /***
    288      * Tests the required validation for first and last name.
    289     */
    290     public void testRequiredName() throws ValidatorException {
    291        // Create bean to run test on.
    292        NameBean name = new NameBean();
    293        name.setFirstName("Joe");
    294        name.setLastName("Smith");
    295
    296        // Construct validator based on the loaded resources
    297        // and the form key
    298        Validator validator = new Validator(resources, FORM_KEY);
    299        // add the name bean to the validator as a resource
    300        // for the validations to be performed on.
    301        validator.setParameter(Validator.BEAN_PARAM, name);
    302
    303        // Get results of the validation.
    304        ValidatorResults results = null;
    305
    306        results = validator.validate();
    307
    308        assertNotNull("Results are null.", results);
    309
    310        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    311        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    312
    313        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    314        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
    315        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have passed.", firstNameResult.isValid(ACTION));
    316
    317        assertNotNull("Last Name ValidatorResult should not be null.", lastNameResult);
    318        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
    319        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have passed.", lastNameResult.isValid(ACTION));
    320     }
    321
    322
    323     /***
    324      * Tests if we can override a rule. We "can" override a rule if the message shown
    325      * when the firstName required test fails and the lastName test is null.
    326     */
    327     public void testOverrideRule() throws ValidatorException {
    328
    329        // Create bean to run test on.
    330        NameBean name = new NameBean();
    331        name.setLastName("Smith");
    332
    333        // Construct validator based on the loaded resources
    334        // and the form key
    335        Validator validator = new Validator(resources, FORM_KEY2);
    336        // add the name bean to the validator as a resource
    337        // for the validations to be performed on.
    338        validator.setParameter(Validator.BEAN_PARAM, name);
    339
    340        // Get results of the validation.
    341        ValidatorResults results = null;
    342
    343        results = validator.validate();
    344
    345        assertNotNull("Results are null.", results);
    346
    347        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
    348        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
    349        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
    350        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have '" + CHECK_MSG_KEY + " as a key.", firstNameResult.field.getArg(0).getKey().equals(CHECK_MSG_KEY));
    351
    352        assertNull("Last Name ValidatorResult should be null.", lastNameResult);
    353     }
    354
    355
    356     /***
    357      * Tests if the order is mantained when extending a form. Parent form fields should
    358      * preceed self form fields, except if we override the rules.
    359     */
    360     public void testOrder() {
    361
    362        Form form = resources.getForm(ValidatorResources.defaultLocale, FORM_KEY);
    363        Form form2 = resources.getForm(ValidatorResources.defaultLocale, FORM_KEY2);
    364
    365        assertNotNull(FORM_KEY + " is null.", form);
    366        assertTrue("There should only be 2 fields in " + FORM_KEY, form.getFields().size() == 2);
    367
    368        assertNotNull(FORM_KEY2 + " is null.", form2);
    369        assertTrue("There should only be 2 fields in " + FORM_KEY2, form2.getFields().size() == 2);
    370
    371        //get the first field
    372        Field fieldFirstName = (Field)form.getFields().get(0);
    373        //get the second field
    374        Field fieldLastName = (Field)form.getFields().get(1);
    375        assertTrue("firstName in " + FORM_KEY + " should be the first in the list", fieldFirstName.getKey().equals("firstName"));
    376        assertTrue("lastName in " + FORM_KEY + " should be the first in the list", fieldLastName.getKey().equals("lastName"));
    377
    378 //     get the second field
    379        fieldLastName = (Field)form2.getFields().get(0);
    380         //get the first field
    381         fieldFirstName = (Field)form2.getFields().get(1);
    382         assertTrue("firstName in " + FORM_KEY2 + " should be the first in the list", fieldFirstName.getKey().equals("firstName"));
    383        assertTrue("lastName in " + FORM_KEY2 + " should be the first in the list", fieldLastName.getKey().equals("lastName"));
    384
    385     }
    386 }