/*
* 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.descriptor;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hibernate.validator.internal.util.Contracts.assertNotNull;
import static org.hibernate.validator.testutils.ValidatorUtil.getMethodDescriptor;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintDeclarationException;
import javax.validation.constraints.NotNull;
import javax.validation.metadata.ConstraintDescriptor;
import javax.validation.metadata.MethodDescriptor;
import javax.validation.metadata.ParameterDescriptor;
import javax.validation.metadata.Scope;
import org.joda.time.DateMidnight;
import org.testng.annotations.Test;
import org.hibernate.validator.test.internal.metadata.Customer;
import org.hibernate.validator.test.internal.metadata.CustomerRepository;
import org.hibernate.validator.test.internal.metadata.CustomerRepositoryExt;
import org.hibernate.validator.test.internal.metadata.CustomerRepositoryExt.CustomerExtension;
import org.hibernate.validator.test.internal.metadata.IllegalCustomerRepositoryExt;
import org.hibernate.validator.testutil.TestForIssue;
/**
* @author Gunnar Morling
*/
public class MethodDescriptorTest {
@Test
public void testGetMethod() throws Exception {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"foo"
);
assertEquals( methodDescriptor.getName(), "foo" );
}
@Test
public void testIsCascaded() {
MethodDescriptor cascadingMethodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"foo"
);
assertTrue( cascadingMethodDescriptor.getReturnValueDescriptor().isCascaded() );
MethodDescriptor nonCascadingMethodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"baz"
);
assertFalse( nonCascadingMethodDescriptor.getReturnValueDescriptor().isCascaded() );
}
@Test
public void testHasConstraints() {
MethodDescriptor descriptor = getMethodDescriptor(
CustomerRepository.class,
"bar"
);
assertFalse(
descriptor.hasConstraints(),
"Method has no constraints."
);
descriptor = getMethodDescriptor(
CustomerRepository.class,
"methodWithCrossParameterConstraint",
DateMidnight.class,
DateMidnight.class
);
assertFalse(
descriptor.hasConstraints(),
"Cross-parameter constraints shouldn't be reported on MethodDescriptor."
);
}
@Test
public void testGetElementClass() {
//the return type as defined in the base type
MethodDescriptor methodDescriptor = getMethodDescriptor( CustomerRepository.class, "bar" );
assertEquals( methodDescriptor.getElementClass(), Customer.class );
//the return type is now the one as defined in the derived type (covariant return type)
methodDescriptor = getMethodDescriptor( CustomerRepositoryExt.class, "bar" );
assertEquals( methodDescriptor.getElementClass(), CustomerExtension.class );
}
@Test
public void testGetConstraintDescriptors() {
MethodDescriptor descriptor = getMethodDescriptor(
CustomerRepository.class,
"bar"
);
assertTrue( descriptor.getConstraintDescriptors().isEmpty() );
descriptor = getMethodDescriptor(
CustomerRepository.class,
"methodWithCrossParameterConstraint",
DateMidnight.class,
DateMidnight.class
);
assertTrue( descriptor.getConstraintDescriptors().isEmpty() );
}
@Test
public void testFindConstraintsMatchingGroups() {
MethodDescriptor descriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"methodWithCrossParameterConstraint",
DateMidnight.class,
DateMidnight.class
);
assertTrue(
descriptor.findConstraints()
.getConstraintDescriptors()
.isEmpty()
);
}
@Test
@TestForIssue(jiraKey = "HV-443")
public void testFindParameterConstraintLookingAt() {
ParameterDescriptor parameterDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"createCustomer",
CharSequence.class,
String.class
).getParameterDescriptors().get( 1 );
Set<ConstraintDescriptor<?>> constraintDescriptors = parameterDescriptor.findConstraints()
.lookingAt( Scope.LOCAL_ELEMENT )
.getConstraintDescriptors();
assertEquals( constraintDescriptors.size(), 0 );
constraintDescriptors = parameterDescriptor.findConstraints()
.lookingAt( Scope.HIERARCHY )
.getConstraintDescriptors();
assertEquals( constraintDescriptors.size(), 1 );
assertEquals(
constraintDescriptors.iterator().next().getAnnotation().annotationType(),
NotNull.class
);
}
@Test(expectedExceptions = ConstraintDeclarationException.class, expectedExceptionsMessageRegExp = "HV000151.*")
@TestForIssue(jiraKey = "HV-683")
public void testGetMethodDescriptorForIllegalyConfiguredMethodCausesConstraintDeclarationException() {
getMethodDescriptor( IllegalCustomerRepositoryExt.class, "zap", int.class );
}
@Test
public void testGetParameterConstraints() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class, "createCustomer", CharSequence.class, String.class
);
List<ParameterDescriptor> parameterConstraints = methodDescriptor.getParameterDescriptors();
assertNotNull( parameterConstraints );
assertEquals( parameterConstraints.size(), 2 );
ParameterDescriptor parameterDescriptor1 = parameterConstraints.get( 0 );
assertEquals( parameterDescriptor1.getElementClass(), CharSequence.class );
assertFalse( parameterDescriptor1.hasConstraints() );
ParameterDescriptor parameterDescriptor2 = parameterConstraints.get( 1 );
assertEquals( parameterDescriptor2.getElementClass(), String.class );
assertTrue( parameterDescriptor2.hasConstraints() );
}
@Test
public void testGetParameterConstraintsForParameterlessMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"baz"
);
List<ParameterDescriptor> parameterConstraints = methodDescriptor.getParameterDescriptors();
assertNotNull( parameterConstraints );
assertEquals( parameterConstraints.size(), 0 );
}
@Test
public void testGetReturnValueDescriptorForVoidMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"saveCustomer",
Customer.class
);
assertThat( methodDescriptor.getReturnValueDescriptor() ).isNotNull();
}
@Test
public void testIsReturnValueConstrainedForConstrainedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"baz"
);
assertThat( methodDescriptor.hasConstrainedReturnValue() ).isTrue();
}
@Test
public void testIsReturnValueConstrainedForCascadedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"foo"
);
assertThat( methodDescriptor.hasConstrainedReturnValue() ).isTrue();
}
@Test
public void testIsReturnValueConstrainedForParameterConstrainedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"createCustomer",
CharSequence.class,
String.class
);
assertThat( methodDescriptor.hasConstrainedReturnValue() ).isFalse();
}
@Test
public void testIsReturnValueConstrainedForVoidMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"saveCustomer",
Customer.class
);
assertThat( methodDescriptor.hasConstrainedReturnValue() ).isFalse();
}
@Test
public void testAreParametersConstrainedForParameterConstrainedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"createCustomer",
CharSequence.class,
String.class
);
assertThat( methodDescriptor.hasConstrainedParameters() ).isTrue();
}
@Test
public void testAreParametersConstrainedForParameterCascadedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"saveCustomer",
Customer.class
);
assertThat( methodDescriptor.hasConstrainedParameters() ).isTrue();
}
@Test
public void testAreParametersConstrainedForCrossParameterConstrainedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"methodWithCrossParameterConstraint", DateMidnight.class, DateMidnight.class
);
assertThat( methodDescriptor.hasConstrainedParameters() ).isTrue();
}
@Test
public void testAreParametersConstrainedForNonParameterConstrainedMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"zip",
int.class
);
assertThat( methodDescriptor.hasConstrainedParameters() ).isFalse();
}
@Test
public void testAreParametersConstrainedForParameterlessMethod() {
MethodDescriptor methodDescriptor = getMethodDescriptor(
CustomerRepositoryExt.class,
"zip"
);
assertThat( methodDescriptor.hasConstrainedParameters() ).isFalse();
}
}