blob: 3c41b9fc9b0945e1c5f131dad0023b86293de513 [file] [log] [blame]
/*
* 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.
*/
package com.opensymphony.xwork2.validator;
import com.mockobjects.dynamic.C;
import com.mockobjects.dynamic.Mock;
import com.opensymphony.xwork2.util.ClassLoaderUtil;
import com.opensymphony.xwork2.validator.validators.*;
import junit.framework.TestCase;
import org.apache.struts2.StrutsException;
import java.io.InputStream;
import java.util.List;
/**
* @author Jason Carreira
* @author James House
* @author tm_jee ( tm_jee (at) yahoo.co.uk )
* @author Martin Gilday
*/
public class DefaultValidatorFileParserTest extends TestCase {
private static final String testFileName = "com/opensymphony/xwork2/validator/validator-parser-test.xml";
private static final String testFileName2 = "com/opensymphony/xwork2/validator/validator-parser-test2.xml";
private static final String testFileName3 = "com/opensymphony/xwork2/validator/validator-parser-test3.xml";
private static final String testFileName4 = "com/opensymphony/xwork2/validator/validator-parser-test4.xml";
private static final String testFileName5 = "com/opensymphony/xwork2/validator/validator-parser-test5.xml";
private static final String testFileName6 = "com/opensymphony/xwork2/validator/validator-parser-test6.xml";
private static final String testFileNameFail = "com/opensymphony/xwork2/validator/validators-fail.xml";
private Mock mockValidatorFactory;
private ValidatorFileParser parser;
public void testParserActionLevelValidatorsShouldBeBeforeFieldLevelValidators() throws Exception {
InputStream is = ClassLoaderUtil.getResourceAsStream(testFileName2, this.getClass());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("expression")), ExpressionValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("required")), RequiredFieldValidator.class.getName());
List configs = parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName2);
mockValidatorFactory.verify();
ValidatorConfig valCfg0 = (ValidatorConfig) configs.get(0);
ValidatorConfig valCfg1 = (ValidatorConfig) configs.get(1);
assertNotNull(configs);
assertEquals(configs.size(), 2);
assertEquals("expression", valCfg0.getType());
assertFalse(valCfg0.isShortCircuit());
assertEquals(valCfg0.getDefaultMessage(), "an expression error message");
assertEquals(valCfg0.getParams().get("expression"), "false");
assertEquals("required", valCfg1.getType());
assertFalse(valCfg1.isShortCircuit());
assertEquals(valCfg1.getDefaultMessage(), "a field error message");
}
public void testParser() {
InputStream is = ClassLoaderUtil.getResourceAsStream(testFileName, this.getClass());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("expression")), ExpressionValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("expression")), ExpressionValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("required")), RequiredFieldValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("required")), RequiredFieldValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("int")), IntRangeFieldValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("regex")), RegexFieldValidator.class.getName());
List configs = parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName);
mockValidatorFactory.verify();
assertNotNull(configs);
assertEquals(6, configs.size());
ValidatorConfig cfg = (ValidatorConfig) configs.get(0);
assertEquals("expression", cfg.getType());
assertFalse(cfg.isShortCircuit());
cfg = (ValidatorConfig) configs.get(1);
assertEquals("expression", cfg.getType());
assertTrue(cfg.isShortCircuit());
cfg = (ValidatorConfig) configs.get(2);
assertEquals("required", cfg.getType());
assertEquals("foo", cfg.getParams().get("fieldName"));
assertEquals("You must enter a value for foo.", cfg.getDefaultMessage());
assertEquals(25, cfg.getLocation().getLineNumber());
cfg = (ValidatorConfig) configs.get(3);
assertEquals("required", cfg.getType());
assertTrue(cfg.isShortCircuit());
cfg = (ValidatorConfig) configs.get(4);
assertEquals("int", cfg.getType());
assertFalse(cfg.isShortCircuit());
cfg = (ValidatorConfig) configs.get(5);
assertEquals("regex", cfg.getType());
assertFalse(cfg.isShortCircuit());
assertEquals("([aAbBcCdD][123][eEfFgG][456])", cfg.getParams().get("expression"));
}
public void testParserWithBadValidation() {
InputStream is = ClassLoaderUtil.getResourceAsStream(testFileName3, this.getClass());
boolean pass = false;
try {
parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName3);
} catch (StrutsException ex) {
assertTrue("Wrong line number", 24 == ex.getLocation().getLineNumber());
pass = true;
}
assertTrue("Validation file should have thrown exception", pass);
}
public void testParserWithBadXML() {
InputStream is = ClassLoaderUtil.getResourceAsStream(testFileName4, this.getClass());
boolean pass = false;
try {
parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName4);
} catch (StrutsException ex) {
assertTrue("Wrong line number: " + ex.getLocation(), 34 == ex.getLocation().getLineNumber());
pass = true;
}
assertTrue("Validation file should have thrown exception", pass);
}
public void testParserWithBadXML2() {
InputStream is = ClassLoaderUtil.getResourceAsStream(testFileNameFail, this.getClass());
boolean pass = false;
try {
parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileNameFail);
} catch (StrutsException ex) {
assertTrue("Wrong line number: " + ex.getLocation(), 28 == ex.getLocation().getLineNumber());
pass = true;
}
assertTrue("Validation file should have thrown exception", pass);
}
public void testValidatorDefinitionsWithBadClassName() {
InputStream is = ClassLoaderUtil.getResourceAsStream(testFileName5, this.getClass());
boolean pass = false;
try {
parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, testFileName5);
} catch (StrutsException ex) {
assertTrue("Wrong line number", 24 == ex.getLocation().getLineNumber());
pass = true;
}
assertTrue("Validation file should have thrown exception", pass);
}
public void testValidatorWithI18nMessage() throws Exception {
try (InputStream is = ClassLoaderUtil.getResourceAsStream(testFileName6, this.getClass())) {
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("requiredstring")), RequiredStringValidator.class.getName());
mockValidatorFactory.expectAndReturn("lookupRegisteredValidatorType", C.args(C.eq("requiredstring")), RequiredStringValidator.class.getName());
List validatorConfigs = parser.parseActionValidatorConfigs((ValidatorFactory) mockValidatorFactory.proxy(), is, "-//OpenSymphony Group//XWork Validator 1.0.3//EN");
mockValidatorFactory.verify();
assertEquals(validatorConfigs.size(), 2);
assertEquals(((ValidatorConfig)validatorConfigs.get(0)).getParams().get("fieldName"), "name");
assertEquals(((ValidatorConfig)validatorConfigs.get(0)).getMessageParams().length, 0);
assertEquals(((ValidatorConfig)validatorConfigs.get(0)).getMessageKey(), "error.name");
assertEquals(((ValidatorConfig)validatorConfigs.get(0)).getDefaultMessage(), "default message 1");
assertEquals(((ValidatorConfig)validatorConfigs.get(0)).getParams().size(), 1);
assertEquals(((ValidatorConfig)validatorConfigs.get(0)).getType(), "requiredstring");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getParams().get("fieldName"), "address");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageParams().length, 5);
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageParams()[0], "'tmjee'");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageParams()[1], "'phil'");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageParams()[2], "'rainer'");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageParams()[3], "'hopkins'");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageParams()[4], "'jimmy'");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getMessageKey(), "error.address");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getDefaultMessage(), "The Default Message");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getParams().size(), 3);
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getParams().get("trim"), "true");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getParams().get("anotherParam"), "anotherValue");
assertEquals(((ValidatorConfig)validatorConfigs.get(1)).getType(), "requiredstring");
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
mockValidatorFactory = new Mock(ValidatorFactory.class);
parser = new DefaultValidatorFileParser();
}
@Override
protected void tearDown() throws Exception {
mockValidatorFactory = null;
parser = null;
}
}