package br.com.caelum.vraptor.validator; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; import java.util.List; import java.util.Locale; import javax.validation.groups.Default; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import br.com.caelum.vraptor.core.Localization; /** * A simple class to test JSR303Validator and HibernateValidator3 components. * * @author Otávio Scherer Garcia * @since 3.1.2 */ public class BeanValidatorTest { private @Mock Localization localization; private DefaultBeanValidator beanValidator; @Before public void setup() { Locale.setDefault(new Locale("en")); MockitoAnnotations.initMocks(this); MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory(); interpolatorFactory.createInterpolator(); ValidatorFactoryCreator creator = new ValidatorFactoryCreator(interpolatorFactory.getInstance()); creator.buildFactory(); ValidatorCreator validatorFactory = new ValidatorCreator(creator.getInstance()); validatorFactory.createValidator(); beanValidator = new DefaultBeanValidator(localization, validatorFactory.getInstance(), interpolatorFactory.getInstance()); } @Test public void withoutViolations() { CustomerForValidation customer0 = new CustomerForValidation(10, "Vraptor", 18); assertThat(beanValidator.validate(customer0), hasSize(0)); } @Test public void shouldValidate() { CustomerForValidation customer0 = new CustomerForValidation(null, null, null); assertThat(beanValidator.validate(customer0), not(hasSize(0))); } @Test public void shouldValidateWithMyLocale() { when(localization.getLocale()).thenReturn(new Locale("pt", "br")); CustomerForValidation customer0 = new CustomerForValidation(null, null, null); List<Message> messages = beanValidator.validate(customer0); assertThat(messages, not(hasSize(0))); assertThat(messages.toString(), containsString("não pode ser nulo")); } @Test public void shouldValidateWithDefaultLocale() { when(localization.getLocale()).thenReturn(null); CustomerForValidation customer0 = new CustomerForValidation(null, null, null); List<Message> messages = beanValidator.validate(customer0); assertThat(messages, not(hasSize(0))); assertThat(messages.toString(), containsString("may not be null")); } @Test public void shouldReturnEmptyCollectionIsBeanIsNull() { assertThat(beanValidator.validate(null), hasSize(0)); } @Test public void nullValidatorShouldNeverValidate() { BeanValidator validator = new NullBeanValidator(); assertThat(validator.validate(null), hasSize(0)); assertThat(validator.validate(new Object()), hasSize(0)); assertThat(validator.validate(new CustomerForValidation(null, null, null)), hasSize(0)); } @Test public void shouldValidateOneSpecifiedGroup() { CustomerForValidation customer0 = new CustomerForValidation(null, null, null); assertThat(beanValidator.validate(customer0, SomeGroupValidation.class), hasSize(1)); } @Test public void shouldValidateManySpecifiedGroups() { CustomerForValidation customer0 = new CustomerForValidation(null, null, null); assertThat(beanValidator.validate(customer0, SomeGroupValidation.class, AnotherGroupValidation.class), hasSize(2)); } @Test public void shouldValidateOnlySpecifiedProperties() { CustomerForValidation customer0 = new CustomerForValidation(null, null, null); assertThat(beanValidator.validateProperties(customer0, "id"), hasSize(1)); } @Test(expected=IllegalArgumentException.class) public void shouldThrowExceptionIfNoPropertiesWereSpecified() { CustomerForValidation customer0 = new CustomerForValidation(null, null, null); beanValidator.validateProperties(customer0); } @Test public void shouldReturnEmptyCollectionIfBeanIsNullForValidationProperties() { assertThat(beanValidator.validateProperties(null, "id"), hasSize(0)); } @Test public void shouldValidateSpecificPropertyOfSpecificValidationGroup() { CustomerForValidation customer = new CustomerForValidation(null, null, null); assertThat(beanValidator.validateProperty(customer, "age", AnotherGroupValidation.class), hasSize(1)); } @Test public void shouldReturnEmptyCollectionWhenBeanIsNull() { assertThat(beanValidator.validateProperty(null, "age", AnotherGroupValidation.class), hasSize(0)); } /** * Customer for using in bean validator tests. */ public class CustomerForValidation { @javax.validation.constraints.NotNull public Integer id; @javax.validation.constraints.NotNull(groups={SomeGroupValidation.class, Default.class}) public String name; @javax.validation.constraints.NotNull(groups=AnotherGroupValidation.class) public Integer age; public CustomerForValidation(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } } public interface SomeGroupValidation {} public interface AnotherGroupValidation {} }