/*
* 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.Locale;
import java.util.Set;
import javax.validation.Configuration;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.testutil.TestForIssue;
import org.hibernate.validator.testutils.ValidatorUtil;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectConstraintViolationMessages;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertNumberOfViolations;
/**
* Tests for correct message interpolation for messages from the default bundle.
*
* @author Hardy Ferentschik
* @author Gunnar Morling
*/
public class MessageInterpolationWithDefaultBundleTest {
private Locale defaultLocale;
@BeforeClass
public void storeDefaultLocale() {
defaultLocale = Locale.getDefault();
}
@AfterClass
public void restoreDefaultLocale() {
Locale.setDefault( defaultLocale );
}
@Test
@TestForIssue(jiraKey = "HV-268")
public void testEmailAndRangeMessageEnglishLocale() {
Configuration<?> config = ValidatorUtil.getConfiguration( Locale.ENGLISH );
config.messageInterpolator( new ResourceBundleMessageInterpolator() );
Validator validator = config.buildValidatorFactory().getValidator();
User user = new User();
user.setEmail( "foo" );
user.setAge( 16 );
Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
assertNumberOfViolations( constraintViolations, 2 );
assertCorrectConstraintViolationMessages(
constraintViolations, "not a well-formed email address", "must be between 18 and 21"
);
}
@Test
@TestForIssue(jiraKey = "HV-268")
public void testEmailAndRangeMessageGermanLocale() {
Configuration<?> config = ValidatorUtil.getConfiguration( Locale.GERMAN );
config.messageInterpolator( new ResourceBundleMessageInterpolator() );
Validator validator = config.buildValidatorFactory().getValidator();
User user = new User();
user.setEmail( "foo" );
user.setAge( 16 );
Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
assertNumberOfViolations( constraintViolations, 2 );
assertCorrectConstraintViolationMessages(
constraintViolations, "keine g\u00FCltige E-Mail-Adresse", "muss zwischen 18 und 21 liegen"
);
}
@Test
@TestForIssue(jiraKey = "HV-268")
public void testEmailAndRangeMessageFrenchLocale() {
Configuration<?> config = ValidatorUtil.getConfiguration( Locale.FRENCH );
config.messageInterpolator( new ResourceBundleMessageInterpolator() );
Validator validator = config.buildValidatorFactory().getValidator();
User user = new User();
user.setEmail( "foo" );
user.setAge( 16 );
Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
assertNumberOfViolations( constraintViolations, 2 );
assertCorrectConstraintViolationMessages(
constraintViolations, "adresse email mal form\u00E9e", "doit \u00EAtre entre 18 et 21"
);
}
/**
* HV-306. If English is explicitly set as locale for message interpolation, it
* must take precedence over the system's default locale.
*/
@Test
@TestForIssue(jiraKey = "HV-306")
public void testThatExplicitlySetEnglishLocaleHasPrecedenceOverDefaultLocale() {
Configuration<?> config = ValidatorUtil.getConfiguration( Locale.FRENCH );
config.messageInterpolator( new LocalizedMessageInterpolator( Locale.ENGLISH ) );
Validator validator = config.buildValidatorFactory().getValidator();
User user = new User();
user.setEmail( "foo" );
user.setAge( 16 );
Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
assertNumberOfViolations( constraintViolations, 2 );
assertCorrectConstraintViolationMessages(
constraintViolations, "not a well-formed email address", "must be between 18 and 21"
);
}
@Test
@TestForIssue(jiraKey = "HV-256")
public void testConditionalDecimalMinMessageDependingOnInclusiveFlag() {
Configuration<?> config = ValidatorUtil.getConfiguration( Locale.ENGLISH );
config.messageInterpolator( new ResourceBundleMessageInterpolator() );
Validator validator = config.buildValidatorFactory().getValidator();
Set<ConstraintViolation<DoubleHolder>> constraintViolations = validator.validate( new DoubleHolder() );
assertNumberOfViolations( constraintViolations, 4 );
assertCorrectConstraintViolationMessages(
constraintViolations,
"must be greater than or equal to 1.0",
"must be greater than 1.0",
"must be less than or equal to 1.0",
"must be less than 1.0"
);
}
private static class DoubleHolder {
@DecimalMax(value = "1.0")
private final double inclusiveMaxDouble;
@DecimalMax(value = "1.0", inclusive = false)
private final double exclusiveMaxDouble;
@DecimalMin(value = "1.0")
private final double inclusiveMinDouble;
@DecimalMin(value = "1.0", inclusive = false)
private final double exclusiveMinDouble;
private DoubleHolder() {
this.inclusiveMaxDouble = 1.1;
this.exclusiveMaxDouble = 1.0;
this.inclusiveMinDouble = 0.9;
this.exclusiveMinDouble = 1.0;
}
}
/**
* A message interpolator that enforces one given locale to be used for message
* interpolation.
*
* @author Gunnar Morling
*/
private static class LocalizedMessageInterpolator extends ResourceBundleMessageInterpolator {
private Locale locale;
public LocalizedMessageInterpolator(Locale locale) {
this.locale = locale;
}
@Override
public String interpolate(String messageTemplate, Context context) {
return interpolate( messageTemplate, context, this.locale );
}
}
}