/* * 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.methodvalidation.cascadedgroupvalidation; import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertConstraintViolation; import static org.hibernate.validator.testutils.ValidatorUtil.getValidatingProxy; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import org.hibernate.validator.testutil.TestForIssue; import org.hibernate.validator.testutils.ValidatorUtil; import org.testng.annotations.Test; /** * @author Jan-Willem Willebrands */ @Test @TestForIssue(jiraKey = "HV-1072") public class CascadedMethodLevelValidationGroupSequenceTest { private CompoundEntityRepository entityRepository; private void setUpValidatorForGroups(Class<?>... groups) { entityRepository = getValidatingProxy( new CompoundEntityRepositoryImpl(), ValidatorUtil.getValidator(), groups ); } /** * Expect a single constraint violation from the first violation group. */ @Test private void cascadedConstraintViolationInFirstGroupOnly() { setUpValidatorForGroups( CompoundGroup.class ); try { entityRepository.store( new CompoundEntity( new Entity( null, "value" ) ) ); fail( "Expected MethodConstraintViolationException wasn't thrown." ); } catch (ConstraintViolationException e) { assertEquals( e.getConstraintViolations().size(), 1 ); ConstraintViolation<?> constraintViolation = e.getConstraintViolations().iterator().next(); assertConstraintViolation( constraintViolation, "may not be null", CompoundEntityRepositoryImpl.class, null ); assertEquals( constraintViolation.getConstraintDescriptor().getGroups().iterator().next(), ValidationGroup1.class ); } } /** * Expect a single constraint violation from the second validation group. */ @Test private void cascadedConstraintViolationInSecondGroupOnly() { setUpValidatorForGroups( CompoundGroup.class ); try { entityRepository.store( new CompoundEntity( new Entity( "value", null ) ) ); fail( "Expected MethodConstraintViolationException wasn't thrown." ); } catch (ConstraintViolationException e) { assertEquals( e.getConstraintViolations().size(), 1 ); ConstraintViolation<?> constraintViolation = e.getConstraintViolations().iterator().next(); assertConstraintViolation( constraintViolation, "may not be null", CompoundEntityRepositoryImpl.class, null ); assertEquals( constraintViolation.getConstraintDescriptor().getGroups().iterator().next(), ValidationGroup2.class ); } } /** * Expect a single constraint violation in the first group. The second group should not be * validated due to the violation in the first group. */ @Test private void cascadedConstraintViolationInBothGroups() { setUpValidatorForGroups( CompoundGroup.class ); try { entityRepository.store( new CompoundEntity( new Entity( null, null ) ) ); fail( "Expected MethodConstraintViolationException wasn't thrown." ); } catch (ConstraintViolationException e) { assertEquals( e.getConstraintViolations().size(), 1 ); ConstraintViolation<?> constraintViolation = e.getConstraintViolations().iterator().next(); assertConstraintViolation( constraintViolation, "may not be null", CompoundEntityRepositoryImpl.class, null ); assertEquals( constraintViolation.getConstraintDescriptor().getGroups().iterator().next(), ValidationGroup1.class ); } } /** * Expect a single constraint violation from the first validation group. */ @Test private void cascadedReturnValueConstraintInFirstGroup() { setUpValidatorForGroups( CompoundGroup.class ); try { entityRepository.getEntity( new CompoundEntity( new Entity( null, "value" ) ) ); fail( "Expected MethodConstraintViolationException wasn't thrown." ); } catch (ConstraintViolationException e) { assertEquals( e.getConstraintViolations().size(), 1 ); ConstraintViolation<?> constraintViolation = e.getConstraintViolations().iterator().next(); assertConstraintViolation( constraintViolation, "may not be null", CompoundEntityRepositoryImpl.class, null ); assertEquals( constraintViolation.getConstraintDescriptor().getGroups().iterator().next(), ValidationGroup1.class ); } } /** * Expect a single constraint violation from the second validation group. */ @Test private void cascadedReturnValueConstraintInSecondGroup() { setUpValidatorForGroups( CompoundGroup.class ); try { entityRepository.getEntity( new CompoundEntity( new Entity( "value", null ) ) ); fail( "Expected MethodConstraintViolationException wasn't thrown." ); } catch (ConstraintViolationException e) { assertEquals( e.getConstraintViolations().size(), 1 ); ConstraintViolation<?> constraintViolation = e.getConstraintViolations().iterator().next(); assertConstraintViolation( constraintViolation, "may not be null", CompoundEntityRepositoryImpl.class, null ); assertEquals( constraintViolation.getConstraintDescriptor().getGroups().iterator().next(), ValidationGroup2.class ); } } /** * Expect a single constraint violation in the first group. The second group should not be * validated due to the violation in the first group. */ @Test private void cascadedReturnValueConstraintInBothGroups() { setUpValidatorForGroups( CompoundGroup.class ); try { entityRepository.getEntity( new CompoundEntity( new Entity( null, null ) ) ); fail( "Expected MethodConstraintViolationException wasn't thrown." ); } catch (ConstraintViolationException e) { assertEquals( e.getConstraintViolations().size(), 1 ); ConstraintViolation<?> constraintViolation = e.getConstraintViolations().iterator().next(); assertConstraintViolation( constraintViolation, "may not be null", CompoundEntityRepositoryImpl.class, null ); assertEquals( constraintViolation.getConstraintDescriptor().getGroups().iterator().next(), ValidationGroup1.class ); } } }