/*
* 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.metadata.provider;
import static org.assertj.core.api.Assertions.assertThat;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.internal.engine.cascading.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.core.AnnotationProcessingOptionsImpl;
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
import org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider;
import org.hibernate.validator.internal.metadata.raw.BeanConfiguration;
import org.hibernate.validator.internal.metadata.raw.ConstrainedExecutable;
import org.hibernate.validator.internal.metadata.raw.ConstrainedField;
import org.hibernate.validator.internal.metadata.raw.ConstrainedParameter;
import org.hibernate.validator.internal.util.TypeResolutionHelper;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* Tests for retrieval of type annotation level constraints.
*
* @author Khalid Alqinyah
*/
public class TypeAnnotationMetaDataRetrievalTest extends AnnotationMetaDataProviderTestBase {
private AnnotationMetaDataProvider provider;
@BeforeClass
public void setup() {
provider = new AnnotationMetaDataProvider(
new ConstraintHelper(),
new TypeResolutionHelper(),
new ValueExtractorManager( Collections.emptySet() ),
new AnnotationProcessingOptionsImpl()
);
}
@Test
public void testFieldTypeArgument() throws Exception {
BeanConfiguration<A> beanConfiguration = provider.getBeanConfiguration( A.class );
ConstrainedField field = findConstrainedField( beanConfiguration, A.class, "names" );
assertThat( field.getTypeArgumentConstraints().size() ).isEqualTo( 2 );
assertThat( getAnnotationsTypes( field.getTypeArgumentConstraints() ) ).contains(
NotNull.class, NotBlank.class
);
}
@Test
public void testGetterTypeArgument() throws Exception {
BeanConfiguration<B> beanConfiguration = provider.getBeanConfiguration( B.class );
ConstrainedExecutable executable = findConstrainedMethod( beanConfiguration, B.class, "getNames" );
assertThat( executable.getTypeArgumentConstraints().size() ).isEqualTo( 2 );
assertThat( getAnnotationsTypes( executable.getTypeArgumentConstraints() ) ).contains(
NotNull.class, NotBlank.class
);
}
@Test
public void testReturnValueTypeArgument() throws Exception {
BeanConfiguration<C> beanConfiguration = provider.getBeanConfiguration( C.class );
ConstrainedExecutable executable = findConstrainedMethod( beanConfiguration, C.class, "returnNames" );
assertThat( executable.getTypeArgumentConstraints().size() ).isEqualTo( 2 );
assertThat( getAnnotationsTypes( executable.getTypeArgumentConstraints() ) ).contains(
NotNull.class, NotBlank.class
);
}
@Test
public void testExecutableParameterTypeArgument() throws Exception {
BeanConfiguration<D> beanConfiguration = provider.getBeanConfiguration( D.class );
ConstrainedExecutable executable = findConstrainedMethod(
beanConfiguration,
D.class,
"setValues",
String.class,
Integer.class,
List.class
);
ConstrainedParameter parameter = executable.getParameterMetaData( 2 );
assertThat( parameter.getTypeArgumentConstraints().size() ).isEqualTo( 2 );
assertThat( getAnnotationsTypes( parameter.getTypeArgumentConstraints() ) ).contains(
NotNull.class, NotBlank.class
);
}
@Test
public void testConstructorParameterTypeArgument() throws Exception {
BeanConfiguration<E> beanConfiguration = provider.getBeanConfiguration( E.class );
ConstrainedExecutable executable = findConstrainedConstructor(
beanConfiguration,
E.class,
String.class,
Integer.class,
List.class
);
ConstrainedParameter parameter = executable.getParameterMetaData( 2 );
assertThat( parameter.getTypeArgumentConstraints().size() ).isEqualTo( 2 );
assertThat( getAnnotationsTypes( parameter.getTypeArgumentConstraints() ) ).contains(
NotNull.class, NotBlank.class
);
}
private List<Class<? extends Annotation>> getAnnotationsTypes(Collection<MetaConstraint<?>> metaConstraints) {
return metaConstraints.stream()
.map( m -> m.getDescriptor().getAnnotationType() )
.collect( Collectors.toList() );
}
static class A {
@Valid
List<@NotNull @NotBlank String> names;
}
static class B {
@Valid
public List<@NotNull @NotBlank String> getNames() {
return Collections.emptyList();
}
}
static class C {
@Valid
public List<@NotNull @NotBlank String> returnNames() {
return Collections.emptyList();
}
}
static class D {
public void setValues(String s, Integer i, @Valid List<@NotNull @NotBlank String> numbers) {
}
}
static class E {
public E(String s, Integer i, @Valid List<@NotNull @NotBlank String> numbers) {
}
}
}