/* * Hibernate Validator, declare and validate application constraints * * License: Apache License, Version 2.0 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. */ package org.hibernate.validator.test.internal.engine.groups.conversion; import static org.hibernate.validator.internal.util.CollectionHelper.asSet; import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectPropertyPaths; import static org.hibernate.validator.testutils.ValidatorUtil.getValidator; import java.util.Arrays; import java.util.List; import java.util.Set; import javax.validation.ConstraintDeclarationException; import javax.validation.ConstraintViolation; import javax.validation.GroupSequence; import javax.validation.Valid; import javax.validation.Validator; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.groups.ConvertGroup; import javax.validation.groups.Default; import org.hibernate.validator.internal.util.logging.Log; import org.hibernate.validator.internal.util.logging.LoggerFactory; import org.testng.annotations.Test; /** * Integrative test for group conversion. * * @author Gunnar Morling */ public abstract class AbstractGroupConversionTest { private static final Log log = LoggerFactory.make(); protected Validator validator; public abstract void setupValidator(); @Test public void groupConversionOnField() { Set<ConstraintViolation<User1>> violations = validator.validate( new User1() ); assertCorrectPropertyPaths( violations, "addresses[].street1", "addresses[].zipCode" ); } @Test public void groupConversionOnGetter() { Set<ConstraintViolation<User2>> violations = validator.validate( new User2() ); assertCorrectPropertyPaths( violations, "addresses[].street1", "addresses[].zipCode" ); } @Test public void groupConversionOnParameter() throws Exception { Set<ConstraintViolation<User6>> violations = getValidator().forExecutables().validateParameters( new User6(), User6.class.getMethod( "setAddresses", List.class ), new List<?>[] { Arrays.asList( new Address() ) } ); assertCorrectPropertyPaths( violations, "setAddresses.addresses[0].street1", "setAddresses.addresses[0].zipCode" ); } @Test public void groupConversionOnReturnValue() throws Exception { Set<ConstraintViolation<User7>> violations = getValidator().forExecutables().validateReturnValue( new User7(), User7.class.getMethod( "findAddresses" ), Arrays.asList( new Address() ) ); assertCorrectPropertyPaths( violations, "findAddresses.<return value>[0].street1", "findAddresses.<return value>[0].zipCode" ); } @Test public void multipleGroupConversionsOnField() { Set<ConstraintViolation<User3>> violations = validator.validate( new User3() ); assertCorrectPropertyPaths( violations, "addresses[].street1", "addresses[].zipCode" ); violations = validator.validate( new User3(), Complete.class ); for ( ConstraintViolation<User3> constraintViolation : violations ) { log.info( constraintViolation.getPropertyPath() ); } assertCorrectPropertyPaths( violations, "addresses[].doorCode", "addresses[].street1", "addresses[].zipCode" ); } @Test public void multipleGroupConversionsOnGetter() { Set<ConstraintViolation<User4>> violations = validator.validate( new User4() ); assertCorrectPropertyPaths( violations, "addresses[].street1", "addresses[].zipCode" ); violations = validator.validate( new User4(), Complete.class ); assertCorrectPropertyPaths( violations, "addresses[].doorCode", "addresses[].street1", "addresses[].zipCode" ); } @Test public void conversionIsEvaluatedPerProperty() { Set<ConstraintViolation<User5>> violations = validator.validate( new User5() ); assertCorrectPropertyPaths( violations, "addresses[].street1", "addresses[].zipCode", "phoneNumber.number" ); } @Test(expectedExceptions = ConstraintDeclarationException.class, expectedExceptionsMessageRegExp = "HV000127.*PostalSequence.*") public void conversionFromSequenceCausesException() { validator.validate( new User8() ); } public interface Complete extends Default { } public interface BasicPostal { } public interface FullPostal extends BasicPostal { } private interface BasicNumber { } @GroupSequence({ BasicPostal.class, FullPostal.class }) private interface PostalSequence { } private static class Address { @NotNull(groups = BasicPostal.class) String street1; @NotNull String street2; @Size(groups = BasicPostal.class, min = 3) String zipCode = "12"; @Size(groups = FullPostal.class, max = 2) String doorCode = "ABC"; } private static class PhoneNumber { @NotNull(groups = BasicNumber.class) String number; } private static class User1 { @Valid @ConvertGroup(from = Default.class, to = BasicPostal.class) private final Set<Address> addresses = asSet( new Address() ); public Set<Address> getAddresses() { return addresses; } } private static class User2 { private final Set<Address> addresses = asSet( new Address() ); @Valid @ConvertGroup(from = Default.class, to = BasicPostal.class) public Set<Address> getAddresses() { return addresses; } } private static class User3 { private final Set<Address> addresses = asSet( new Address() ); @Valid @ConvertGroup.List({ @ConvertGroup(from = Default.class, to = BasicPostal.class), @ConvertGroup(from = Complete.class, to = FullPostal.class) }) public Set<Address> getAddresses() { return addresses; } } private static class User4 { private final Set<Address> addresses = asSet( new Address() ); @Valid @ConvertGroup.List({ @ConvertGroup(from = Default.class, to = BasicPostal.class), @ConvertGroup(from = Complete.class, to = FullPostal.class) }) public Set<Address> getAddresses() { return addresses; } } private static class User5 { @Valid @ConvertGroup(from = Default.class, to = BasicPostal.class) public Set<Address> getAddresses() { return asSet( new Address() ); } @Valid @ConvertGroup(from = Default.class, to = BasicNumber.class) public PhoneNumber getPhoneNumber() { return new PhoneNumber(); } } private static class User6 { public void setAddresses( @Valid @ConvertGroup(from = Default.class, to = BasicPostal.class) List<Address> addresses) { } } private static class User7 { private final List<Address> addresses = Arrays.asList( new Address() ); @Valid @ConvertGroup(from = Default.class, to = BasicPostal.class) public List<Address> findAddresses() { return addresses; } } private static class User8 { @Valid @ConvertGroup(from = PostalSequence.class, to = BasicPostal.class) private final List<Address> addresses = Arrays.asList( new Address() ); } }