/*
* 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.messageinterpolation;
import java.util.Collections;
import java.util.Set;
import javax.validation.Configuration;
import javax.validation.ConstraintViolation;
import javax.validation.MessageInterpolator;
import javax.validation.MessageInterpolator.Context;
import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.constraints.Size;
import javax.validation.metadata.BeanDescriptor;
import javax.validation.metadata.ConstraintDescriptor;
import javax.validation.metadata.PropertyDescriptor;
import org.hibernate.validator.internal.engine.MessageInterpolatorContext;
import org.hibernate.validator.messageinterpolation.HibernateMessageInterpolatorContext;
import org.hibernate.validator.testutil.TestForIssue;
import org.hibernate.validator.testutils.ValidatorUtil;
import org.testng.annotations.Test;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertNumberOfViolations;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
/**
* @author Hardy Ferentschik
*/
public class MessageInterpolatorContextTest {
private static final String MESSAGE = "{foo}";
@Test
@TestForIssue(jiraKey = "HV-333")
public void testContextWithRightDescriptorAndValueAndRootBeanClassIsPassedToMessageInterpolator() {
// use a easy mock message interpolator for verifying that the right MessageInterpolatorContext
// will be passed
MessageInterpolator mock = createMock( MessageInterpolator.class );
Configuration<?> config = ValidatorUtil.getConfiguration().messageInterpolator( mock );
Validator validator = config.buildValidatorFactory().getValidator();
BeanDescriptor beanDescriptor = validator.getConstraintsForClass( TestBean.class );
PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty( "test" );
Set<ConstraintDescriptor<?>> constraintDescriptors = propertyDescriptor.getConstraintDescriptors();
assertTrue( constraintDescriptors.size() == 1 );
// prepare the mock interpolator to expect the right interpolate call
String validatedValue = "value";
expect(
mock.interpolate(
MESSAGE,
new MessageInterpolatorContext(
constraintDescriptors.iterator().next(),
validatedValue,
TestBean.class,
Collections.<String, Object>emptyMap(),
Collections.<String, Object>emptyMap()
)
)
)
.andReturn( "invalid" );
replay( mock );
Set<ConstraintViolation<TestBean>> violations = validator.validate( new TestBean( validatedValue ) );
assertNumberOfViolations( violations, 1 );
// verify that the right context was passed
verify( mock );
}
@Test(expectedExceptions = ValidationException.class)
public void testUnwrapToImplementationCausesValidationException() {
Context context = new MessageInterpolatorContext( null, null, null, Collections.<String, Object>emptyMap(), Collections.<String, Object>emptyMap() );
context.unwrap( MessageInterpolatorContext.class );
}
@Test
public void testUnwrapToInterfaceTypesSucceeds() {
Context context = new MessageInterpolatorContext( null, null, null, Collections.<String, Object>emptyMap(), Collections.<String, Object>emptyMap() );
MessageInterpolator.Context asMessageInterpolatorContext = context.unwrap( MessageInterpolator.Context.class );
assertSame( asMessageInterpolatorContext, context );
HibernateMessageInterpolatorContext asHibernateMessageInterpolatorContext = context.unwrap(
HibernateMessageInterpolatorContext.class
);
assertSame( asHibernateMessageInterpolatorContext, context );
Object asObject = context.unwrap( Object.class );
assertSame( asObject, context );
}
@Test
public void testGetRootBeanType() {
Class<Object> rootBeanType = Object.class;
MessageInterpolator.Context context = new MessageInterpolatorContext(
null,
null,
rootBeanType,
Collections.<String, Object>emptyMap(),
Collections.<String, Object>emptyMap()
);
assertSame( context.unwrap( HibernateMessageInterpolatorContext.class ).getRootBeanType(), rootBeanType );
}
private static class TestBean {
@Size(min = 10, message = MESSAGE)
private final String test;
public TestBean(String test) {
this.test = test;
}
}
}