package org.richfaces.component.behavior;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.Collections;
import javax.el.ValueExpression;
import javax.faces.validator.BeanValidator;
import javax.faces.validator.Validator;
import javax.validation.groups.Default;
import org.jboss.test.faces.mock.Mock;
import org.jboss.test.faces.mock.MockTestRunner;
import org.jboss.test.faces.mock.Stub;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.richfaces.application.ServiceTracker;
import org.richfaces.javascript.Message;
import org.richfaces.validator.BeanValidatorService;
import org.richfaces.validator.FacesValidatorService;
import org.richfaces.validator.ValidatorDescriptor;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
/**
* <p class="changed_added_4_0">
* This class tests client validator behavior. as it described at https://community.jboss.org/wiki/ClientSideValidation #
* Server-side rendering algorithm
* </p>
*
* @author asmirnov@exadel.com
*
*/
@RunWith(MockTestRunner.class)
public class BehaviorGetValidatorTest extends BehaviorTestBase {
private static final Message VALIDATION_ERROR = new Message(3, "Error", "Validation Error");
private static final Class<?>[] DEFAULT_GROUP = { Default.class };
@Mock
private Validator validator;
@Mock
private ValidatorDescriptor beanValidatorDescriptor;
@Mock
private BeanValidatorService validatorService;
@Mock
private FacesValidatorService facesValidatorService;
@Stub
private ValueExpression expression;
@Before
public void setupService() {
expect(factory.getInstance(BeanValidatorService.class)).andStubReturn(validatorService);
expect(factory.getInstance(FacesValidatorService.class)).andStubReturn(facesValidatorService);
ServiceTracker.setFactory(factory);
setupBehaviorContext(input);
behavior.setGroups(DEFAULT_GROUP);
expect(input.getValueExpression("value")).andStubReturn(expression);
}
@After
public void releaseService() {
ServiceTracker.release();
}
/**
* <p class="changed_added_4_0">
* Component does not define any validators.
* </p>
*
* @throws Exception
*/
@Test
public void testEmptyValidators() throws Exception {
setupComponentValidator();
setupBeanValidator();
assertTrue(checkValidator().isEmpty());
controller.verify();
}
private Collection<ValidatorDescriptor> checkValidator() {
controller.replay();
Collection<ValidatorDescriptor> validators = behavior.getValidators(behaviorContext);
// controller.verify();
return validators;
}
private void setupBeanValidator(ValidatorDescriptor... validators) {
expect(input.getValidators()).andStubReturn(new Validator[] { new BeanValidator() });
expect(validatorService.getConstrains(environment.getFacesContext(), expression, null, DEFAULT_GROUP)).andStubReturn(
Lists.newArrayList(validators));
}
private void setupComponentValidator(Validator... validators) {
expect(input.getValidators()).andStubReturn(validators);
for (Validator validator : validators) {
ValidatorDescriptor validatorDescriptor = environment.createMock(ValidatorDescriptor.class);
expect((Class) validatorDescriptor.getImplementationClass()).andStubReturn(validator.getClass());
expect(validatorDescriptor.getMessage()).andStubReturn(VALIDATION_ERROR);
expect(facesValidatorService.getValidatorDescription(environment.getFacesContext(), input, validator, null))
.andStubReturn(validatorDescriptor);
}
}
/**
* <p class="changed_added_4_0">
* Component defines JSF validator only.
* </p>
*
* @throws Exception
*/
@Test
public void testComponentValidator() throws Exception {
setupComponentValidator(validator);
setupBeanValidator();
expect(input.getAttributes()).andStubReturn(Collections.<String, Object>emptyMap());
Collection<ValidatorDescriptor> validators = checkValidator();
assertEquals(1, validators.size());
ValidatorDescriptor validatorDescriptor = Iterables.getOnlyElement(validators);
assertSame(validator.getClass(), validatorDescriptor.getImplementationClass());
assertEquals(VALIDATION_ERROR, validatorDescriptor.getMessage());
controller.verify();
}
@Test
public void testBeanValidators() throws Exception {
setupBeanValidator(beanValidatorDescriptor);
expect(input.getAttributes()).andStubReturn(Collections.<String, Object>emptyMap());
Collection<ValidatorDescriptor> validators = checkValidator();
assertEquals(1, validators.size());
ValidatorDescriptor validatorDescriptor = Iterables.getOnlyElement(validators);
assertSame(beanValidatorDescriptor, validatorDescriptor);
controller.verify();
}
}