/*
* Milyn - Copyright (C) 2006 - 2010
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (version 2.1) as published
* by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details:
* http://www.gnu.org/licenses/lgpl.txt
*/
package org.milyn.validation;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.milyn.container.MockApplicationContext;
import org.milyn.container.MockExecutionContext;
import org.milyn.rules.RuleProviderAccessor;
import org.milyn.rules.regex.RegexProvider;
import org.milyn.payload.FilterResult;
import org.milyn.payload.StringSource;
import org.milyn.Smooks;
import org.milyn.FilterSettings;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.util.*;
/**
* Unit test for {@link Validator}
*
* @author <a href="mailto:danielbevenius@gmail.com">Daniel Bevenius</a>
*/
public class ValidatorTest
{
private MockApplicationContext appContext;
private RegexProvider regexProvider;
@Before
public void setup()
{
appContext = new MockApplicationContext();
regexProvider = new RegexProvider("/smooks-regex.properties");
}
@Test
public void configure()
{
final String ruleName = "addressing.email";
final Validator validator = new Validator(ruleName, OnFail.WARN);
assertEquals(ruleName, validator.getCompositRuleName());
assertEquals(OnFail.WARN, validator.getOnFail());
}
@Test
public void validateWarn()
{
regexProvider.setName("addressing");
RuleProviderAccessor.add(appContext, regexProvider);
final String ruleName = "addressing.email";
final Validator validator = new Validator(ruleName, OnFail.WARN).setAppContext(appContext);
final ValidationResult result = new ValidationResult();
MockExecutionContext executionContext = new MockExecutionContext();
FilterResult.setResults(executionContext, result);
validator.validate("xyz", executionContext);
validator.validate("xyz", executionContext);
validator.validate("xyz", executionContext);
assertEquals(0, result.getOKs().size());
assertEquals(3, result.getWarnings().size());
assertEquals(0, result.getErrors().size());
}
@Test
public void validateOks()
{
regexProvider.setName("addressing");
RuleProviderAccessor.add(appContext, regexProvider);
final String ruleName = "addressing.email";
final Validator validator = new Validator(ruleName, OnFail.OK).setAppContext(appContext);
final ValidationResult result = new ValidationResult();
MockExecutionContext executionContext = new MockExecutionContext();
FilterResult.setResults(executionContext, result);
validator.validate("xyz", executionContext);
validator.validate("xyz", executionContext);
validator.validate("xyz", executionContext);
assertEquals(3, result.getOKs().size());
assertEquals(0, result.getWarnings().size());
assertEquals(0, result.getErrors().size());
}
@Test
public void validateErrors()
{
regexProvider.setName("addressing");
RuleProviderAccessor.add(appContext, regexProvider);
final String ruleName = "addressing.email";
final Validator validator = new Validator(ruleName, OnFail.ERROR).setAppContext(appContext);
final ValidationResult result = new ValidationResult();
MockExecutionContext executionContext = new MockExecutionContext();
FilterResult.setResults(executionContext, result);
validator.validate("xyz", executionContext);
validator.validate("xyz", executionContext);
validator.validate("xyz", executionContext);
assertEquals(0, result.getOKs().size());
assertEquals(0, result.getWarnings().size());
assertEquals(3, result.getErrors().size());
}
@Test
public void validateFatal()
{
regexProvider.setName("addressing");
RuleProviderAccessor.add(appContext, regexProvider);
final String ruleName = "addressing.email";
final String data = "xyz";
final Validator validator = new Validator(ruleName, OnFail.FATAL).setAppContext(appContext);
MockExecutionContext executionContext = new MockExecutionContext();
try
{
validator.validate(data, executionContext);
fail("A ValidationException should have been thrown");
}
catch (final Exception e)
{
assertTrue( e instanceof ValidationException);
OnFailResult onFailResult = ((ValidationException) e).getOnFailResult();
assertNotNull(onFailResult);
/*
* [null] is the failFragmentPath. This test method only exercises the validate method, hence the
* frailFramentPath, which is set in visitAfte, is never set.
*/
String expected = "[null] RegexRuleEvalResult, matched=false, providerName=addressing, ruleName=email, text=xyz, pattern=\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*([,;]\\s*\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*)*";
assertEquals(expected, onFailResult.getMessage());
assertEquals("A FATAL validation failure has occured " + expected, e.getMessage());
}
}
@Test
public void test_xml_config_01_dom() throws IOException, SAXException {
test_xml_config_01(FilterSettings.DEFAULT_DOM);
}
@Test
public void test_xml_config_01_sax() throws IOException, SAXException {
test_xml_config_01(FilterSettings.DEFAULT_SAX);
}
private void test_xml_config_01(FilterSettings filterSettings) throws IOException, SAXException {
Smooks smooks = new Smooks(getClass().getResourceAsStream("config-01.xml"));
ValidationResult result = new ValidationResult();
smooks.setFilterSettings(filterSettings);
smooks.filterSource(new StringSource("<a><b x='Xx'>11</b><b x='C'>Aaa</b></a>"), result);
List<OnFailResult> warnings = result.getWarnings();
assertEquals(2, warnings.size());
assertEquals("RegexRuleEvalResult, matched=false, providerName=regex, ruleName=custom, text=11, pattern=[A-Z]([a-z])+", warnings.get(0).getFailRuleResult().toString());
assertEquals("RegexRuleEvalResult, matched=false, providerName=regex, ruleName=custom, text=C, pattern=[A-Z]([a-z])+", warnings.get(1).getFailRuleResult().toString());
}
}