package org.richfaces.validator; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.lang.annotation.Annotation; import java.util.Collection; import java.util.Locale; import javax.el.ValueExpression; import javax.faces.component.UIViewRoot; import javax.validation.constraints.Size; import javax.validation.groups.Default; import org.jboss.test.faces.mock.Environment; import org.jboss.test.faces.mock.Environment.Feature; import org.jboss.test.faces.mock.Mock; import org.jboss.test.faces.mock.MockController; import org.jboss.test.faces.mock.MockFacesEnvironment; import org.jboss.test.faces.mock.MockTestRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.richfaces.el.ValueDescriptor; import org.richfaces.el.ValueExpressionAnalayser; import org.richfaces.el.model.Bean; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; @RunWith(MockTestRunner.class) public class BeanValidatorServiceConstrainsTest { @Mock @Environment(Feature.EL_CONTEXT) private MockFacesEnvironment environment; @Mock private ValueExpression expression; @Mock private ValueExpressionAnalayser analayser; @Mock private UIViewRoot viewRoot; private MockController controller; private BeanValidatorServiceImpl validatorService; @Before public void setUp() throws Exception { RichFacesBeanValidatorFactory validatorFactory = new RichFacesBeanValidatorFactory(); validatorFactory.init(); validatorService = new BeanValidatorServiceImpl(analayser, validatorFactory); expect(environment.getFacesContext().getViewRoot()).andStubReturn(viewRoot); expect(viewRoot.getLocale()).andStubReturn(Locale.ENGLISH); } @After public void tearDown() throws Exception { validatorService = null; controller.release(); } @Test public void testGetSingleValidator() throws Exception { forProperty(Bean.class, "string"); expectValidatorWithParameter(Size.class, "max", 2); } @Test public void testGetNoValidator() throws Exception { forProperty(Bean.class, "list"); expectValidators(); } @Test public void testValidatorMessageExtractor() throws Exception { forProperty(Bean.class, "string"); Collection<ValidatorDescriptor> validators = expectValidators(Size.class); ValidatorDescriptor validatorDescriptor = Iterables.getOnlyElement(validators); assertEquals("size must be between 0 and 2", validatorDescriptor.getMessage().getSummary()); } private void forProperty(Class<?> beanClass, String property) { expect(analayser.getPropertyDescriptor(environment.getFacesContext(), expression)).andReturn( new ValueDescriptor(beanClass, property)); } private void expectValidatorWithParameter(Class<? extends Annotation> validator, String param, Object value) { Collection<ValidatorDescriptor> validators = expectValidators(validator); ValidatorDescriptor validatorDescriptor = Iterables.getOnlyElement(validators); assertTrue(validatorDescriptor.getAdditionalParameters().containsKey(param)); assertEquals(value, validatorDescriptor.getAdditionalParameters().get(param)); } /** */ private Collection<ValidatorDescriptor> expectValidators(Class<? extends Annotation>... validators) { return expectValidatorsWithGroups(new Class<?>[0], validators); } private Collection<ValidatorDescriptor> expectValidatorsWithGroups(Class<?>[] groups, Class<? extends Annotation>... validators) { controller.replay(); Collection<ValidatorDescriptor> constrains = validatorService.getConstrains(environment.getFacesContext(), expression, null, groups); controller.verify(); assertEquals(validators.length, constrains.size()); for (final Class<? extends Annotation> class1 : validators) { Iterables.find(constrains, new Predicate<ValidatorDescriptor>() { public boolean apply(ValidatorDescriptor input) { return class1.equals(input.getImplementationClass()); } }); } return constrains; } @Test public void testGetConstrainsWithDefaulGroup() throws Exception { forProperty(Bean.class, "string"); expectValidatorsWithGroups(new Class<?>[] { Default.class }, Size.class); } @Test public void testGetConstrainsWithNullGroup() throws Exception { forProperty(Bean.class, "string"); expectValidatorsWithGroups(null, Size.class); } @Test public void testGetConstrainsWithCustomGroup() throws Exception { forProperty(Bean.class, "string"); expectValidatorsWithGroups(new Class<?>[] { CustomGroup.class }); } }