package org.strecks.form.controller;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createStrictMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import java.sql.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.strecks.converter.ConversionState;
import org.strecks.converter.Converter;
import org.strecks.converter.handler.DefaultConversionHandler;
import org.strecks.exceptions.ApplicationConfigurationException;
import org.strecks.exceptions.ConversionException;
import org.strecks.exceptions.ConversionRuntimeException;
import org.strecks.form.impl.SimpleStrutsForm;
import org.strecks.validator.internal.MethodValidators;
import org.strecks.validator.internal.OrderedProperty;
import org.strecks.validator.internal.ValidationInfo;
import org.strecks.validator.strategy.ValidationHandler;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author Phil Zoio
*/
public class TestDelegatingFormValidation
{
private SimpleStrutsForm simpleForm;
private ValidationHandler handler;
private DelegatingForm form;
@BeforeMethod
public void setUp()
{
simpleForm = new SimpleStrutsForm();
handler = createStrictMock(ValidationHandler.class);
}
@SuppressWarnings("unchecked")
@Test
public void testValidate() throws ConversionException
{
Map validators = createStrictMock(Map.class);
Set keys = createStrictMock(Set.class);
Iterator iterator = createStrictMock(Iterator.class);
OrderedProperty op = createStrictMock(OrderedProperty.class);
MethodValidators methodValidators = createStrictMock(MethodValidators.class);
Converter converter = createStrictMock(Converter.class);
Date sqlDate = Date.valueOf("1999-12-12");
simpleForm.setDateValue("1999-12-12");
ValidationInfo vi = new ValidationInfo(validators, handler, new DefaultConversionHandler());
expect(validators.keySet()).andReturn(keys);
expect(keys.iterator()).andReturn(iterator);
expect(iterator.hasNext()).andReturn(true);
expect(iterator.next()).andReturn(op);
expect(validators.get(op)).andReturn(methodValidators);
expect(methodValidators.getRequiresConversion()).andReturn(true);
expect(methodValidators.getConverter()).andReturn(converter);
expect(op.getPropertyName()).andReturn("dateValue");
expect(converter.toTargetType("1999-12-12")).andReturn(sqlDate);
expect(methodValidators.getConverterType()).andReturn(sqlDate.getClass());
expect(iterator.hasNext()).andReturn(false);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("dateValue", sqlDate);
// expect validationStrategy to be called
expect(handler.validate(vi, simpleForm, null, null, map)).andReturn(null);
replay(handler);
replay(validators);
replay(keys);
replay(iterator);
replay(op);
replay(methodValidators);
replay(converter);
form = new DelegatingForm(simpleForm);
form.setValidationInfo(vi);
form.validate(null, null);
verify(handler);
verify(validators);
verify(keys);
verify(iterator);
verify(op);
verify(methodValidators);
verify(converter);
}
@SuppressWarnings("unchecked")
@Test
public void testBadType() throws ConversionException
{
Map validators = createStrictMock(Map.class);
Set keys = createStrictMock(Set.class);
Iterator iterator = createStrictMock(Iterator.class);
OrderedProperty op = createStrictMock(OrderedProperty.class);
MethodValidators methodValidators = createStrictMock(MethodValidators.class);
Converter converter = createStrictMock(Converter.class);
Date sqlDate = Date.valueOf("1999-12-12");
simpleForm.setDateValue("1999-12-12");
ValidationInfo vi = new ValidationInfo(validators, handler, new DefaultConversionHandler());
expect(validators.keySet()).andReturn(keys);
expect(keys.iterator()).andReturn(iterator);
expect(iterator.hasNext()).andReturn(true);
expect(iterator.next()).andReturn(op);
expect(validators.get(op)).andReturn(methodValidators);
expect(methodValidators.getRequiresConversion()).andReturn(true);
expect(methodValidators.getConverter()).andReturn(converter);
expect(op.getPropertyName()).andReturn("dateValue");
expect(converter.toTargetType("1999-12-12")).andReturn(sqlDate);
expect(methodValidators.getConverterType()).andReturn(String.class);
replay(handler);
replay(validators);
replay(keys);
replay(iterator);
replay(op);
replay(methodValidators);
replay(converter);
form = new DelegatingForm(simpleForm);
form.setValidationInfo(vi);
try
{
form.validate(null, null);
}
catch (ApplicationConfigurationException e)
{
Assert.assertEquals(e.getMessage(), "Supplied value of dateValue in class " +
"org.strecks.form.impl.SimpleStrutsForm converted to class java.sql.Date " +
"and not the class java.lang.String expected by one or more validators. " +
"Check that the property contains an appropriate converter in its getter method");
}
verify(handler);
verify(validators);
verify(keys);
verify(iterator);
verify(op);
verify(methodValidators);
verify(converter);
}
@SuppressWarnings("unchecked")
@Test
public void testValidateNull() throws ConversionException
{
Map validators = createStrictMock(Map.class);
Set keys = createStrictMock(Set.class);
Iterator iterator = createStrictMock(Iterator.class);
OrderedProperty op = createStrictMock(OrderedProperty.class);
MethodValidators methodValidators = createStrictMock(MethodValidators.class);
Converter converter = createStrictMock(Converter.class);
ValidationInfo vi = new ValidationInfo(validators, handler, new DefaultConversionHandler());
expect(validators.keySet()).andReturn(keys);
expect(keys.iterator()).andReturn(iterator);
expect(iterator.hasNext()).andReturn(true);
expect(iterator.next()).andReturn(op);
expect(validators.get(op)).andReturn(methodValidators);
expect(methodValidators.getRequiresConversion()).andReturn(true);
expect(methodValidators.getConverter()).andReturn(converter);
expect(op.getPropertyName()).andReturn("dateValue");
expect(converter.toTargetType(null)).andReturn(null);
expect(iterator.hasNext()).andReturn(false);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("dateValue", ConversionState.NULL);
// expect validationStrategy to be called
expect(handler.validate(vi, simpleForm, null, null, map)).andReturn(null);
replay(handler);
replay(validators);
replay(keys);
replay(iterator);
replay(op);
replay(methodValidators);
replay(converter);
form = new DelegatingForm(simpleForm);
form.setValidationInfo(vi);
form.validate(null, null);
verify(handler);
verify(validators);
verify(keys);
verify(iterator);
verify(op);
verify(methodValidators);
verify(converter);
}
@SuppressWarnings("unchecked")
@Test
public void testConversionFailure() throws ConversionException
{
Map validators = createStrictMock(Map.class);
Set keys = createStrictMock(Set.class);
Iterator iterator = createStrictMock(Iterator.class);
OrderedProperty op = createStrictMock(OrderedProperty.class);
MethodValidators methodValidators = createStrictMock(MethodValidators.class);
Converter converter = createStrictMock(Converter.class);
ValidationInfo vi = new ValidationInfo(validators, handler, new DefaultConversionHandler());
expect(validators.keySet()).andReturn(keys);
expect(keys.iterator()).andReturn(iterator);
expect(iterator.hasNext()).andReturn(true);
expect(iterator.next()).andReturn(op);
expect(validators.get(op)).andReturn(methodValidators);
expect(methodValidators.getRequiresConversion()).andReturn(true);
expect(methodValidators.getConverter()).andReturn(converter);
expect(op.getPropertyName()).andReturn("dateValue");
expect(converter.toTargetType(null)).andThrow(new ConversionRuntimeException(null));
expect(iterator.hasNext()).andReturn(false);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("dateValue", ConversionState.FAILURE);
// expect validationStrategy to be called
expect(handler.validate(vi, simpleForm, null, null, map)).andReturn(null);
replay(handler);
replay(validators);
replay(keys);
replay(iterator);
replay(op);
replay(methodValidators);
replay(converter);
form = new DelegatingForm(simpleForm);
form.setValidationInfo(vi);
form.validate(null, null);
verify(handler);
verify(validators);
verify(keys);
verify(iterator);
verify(op);
verify(methodValidators);
verify(converter);
}
}