/*
* 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.defaultgroupsequenceprovider;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.GroupDefinitionException;
import javax.validation.Validator;
import javax.validation.constraints.NotNull;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.group.GroupSequenceProvider;
import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectConstraintViolationMessages;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertNumberOfViolations;
import static org.hibernate.validator.testutils.ValidatorUtil.getValidator;
/**
* @author Kevin Pollet <kevin.pollet@serli.com> (C) 2011 SERLI
*/
public class DefaultGroupSequenceProviderTest {
private static Validator validator;
@BeforeClass
public static void init() {
validator = getValidator();
}
@Test(
expectedExceptions = GroupDefinitionException.class,
expectedExceptionsMessageRegExp = ".* must be part of the redefined default group sequence."
)
public void testNullProviderDefaultGroupSequence() {
validator.validate( new A() );
}
@Test(
expectedExceptions = GroupDefinitionException.class,
expectedExceptionsMessageRegExp = ".* must be part of the redefined default group sequence."
)
public void testNotValidProviderDefaultGroupSequenceDefinition() {
validator.validate( new B() );
}
@Test(
expectedExceptions = GroupDefinitionException.class,
expectedExceptionsMessageRegExp = "HV[0-9]*: The default group sequence provider defined for .* has the wrong type"
)
public void testDefinitionOfDefaultGroupSequenceProviderWithWrongType() {
validator.validate( new D() );
}
@Test
public void testValidateUserProviderDefaultGroupSequence() {
User user = new User( "$password" );
Set<ConstraintViolation<User>> violations = validator.validate( user );
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "must match \"\\w+\"" );
User admin = new User( "short", true );
violations = validator.validate( admin );
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "length must be between 10 and 20" );
}
@Test
public void testValidatePropertyUserProviderDefaultGroupSequence() {
User user = new User( "$password" );
Set<ConstraintViolation<User>> violations = validator.validateProperty( user, "password" );
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "must match \"\\w+\"" );
User admin = new User( "short", true );
violations = validator.validateProperty( admin, "password" );
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "length must be between 10 and 20" );
}
@Test
public void testValidateValueUserProviderDefaultGroupSequence() {
Set<ConstraintViolation<User>> violations = validator.validateValue(
User.class, "password", "$password"
);
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "must match \"\\w+\"" );
}
@Test
public void testValidateReturnValueProviderDefaultGroupSequence() throws NoSuchMethodException {
C c = new CImpl();
Method fooMethod = C.class.getDeclaredMethod( "foo", String.class );
Set<ConstraintViolation<C>> violations = validator.forExecutables().validateReturnValue(
c, fooMethod, c.foo( null )
);
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "may not be null" );
violations = validator.forExecutables().validateReturnValue( c, fooMethod, c.foo( "foo" ) );
assertNumberOfViolations( violations, 1 );
assertCorrectConstraintViolationMessages( violations, "length must be between 10 and 20" );
}
@GroupSequenceProvider(NullGroupSequenceProvider.class)
private static class A {
@NotNull
String c;
@NotNull(groups = TestGroup.class)
String d;
}
@GroupSequenceProvider(InvalidGroupSequenceProvider.class)
private static class B {
}
private interface C {
@NotNull(message = "may not be null")
@Length(min = 10, max = 20, groups = TestGroup.class, message = "length must be between {min} and {max}")
String foo(String param);
}
@GroupSequenceProvider(MethodGroupSequenceProvider.class)
private static class CImpl implements C {
@Override
public String foo(String param) {
return param;
}
}
@GroupSequenceProvider(NullGroupSequenceProvider.class)
private static class D {
}
private interface TestGroup {
}
public static class MethodGroupSequenceProvider implements DefaultGroupSequenceProvider<CImpl> {
@Override
public List<Class<?>> getValidationGroups(CImpl object) {
return Arrays.<Class<?>>asList( TestGroup.class, CImpl.class );
}
}
public static class NullGroupSequenceProvider implements DefaultGroupSequenceProvider<A> {
@Override
public List<Class<?>> getValidationGroups(A object) {
return null;
}
}
public static class InvalidGroupSequenceProvider implements DefaultGroupSequenceProvider<B> {
@Override
public List<Class<?>> getValidationGroups(B object) {
List<Class<?>> defaultGroupSequence = new ArrayList<Class<?>>();
defaultGroupSequence.add( TestGroup.class );
return defaultGroupSequence;
}
}
}