package org.openstack.atlas.api.validation; import org.openstack.atlas.api.validation.context.HttpRequestType; import org.openstack.atlas.api.validation.exceptions.UnfinishedExpectationChainException; import org.openstack.atlas.api.validation.exceptions.ValidationChainExecutionException; import org.openstack.atlas.api.validation.results.ValidatorResult; import org.openstack.atlas.api.validation.verifiers.Verifier; import org.openstack.atlas.api.validation.verifiers.VerifierResult; import org.junit.Before; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import static org.openstack.atlas.api.validation.ValidatorBuilder.build; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(Enclosed.class) public class ValidatorTest { public static class WhenBuildingValidators { @Test(expected = IllegalArgumentException.class) public void shouldNotAcceptObjectsThatArenNotUnderInterceptorControl() { build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result("".toCharArray()).must().beEmptyOrNull(); } }); } @Test(expected = IllegalArgumentException.class) public void shouldNotAcceptMethodsWithParameters() { build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().doSomething("", Integer.SIZE)).must().beEmptyOrNull(); } }); } @Test(expected = UnfinishedExpectationChainException.class) public void shouldNotValidateUsingUnfinishedMethodExpectations() { build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getStringProperty1()); } }).validate(null, HttpRequestType.POST); } @Test(expected = UnfinishedExpectationChainException.class) public void shouldNotValidateUsingUnfinishedRootExpectations() { build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { must(); } }).validate(null, HttpRequestType.POST); } } public static class WhenValidating { private SimpleBean testObjectA; private SimpleBean testObjectB; @Before public void standUp() { testObjectA = new SimpleBean("1", "2", "3", 1, null, 3); testObjectB = new SimpleBean("1", "2", "3", null, 2, 3); } @Test public void shouldValidateAgainstRootTarget() { final Validator<SimpleBean> validator = build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { must().adhereTo(new Verifier<SimpleBean>() { @Override public VerifierResult verify(SimpleBean obj) { return new VerifierResult(obj.getStringProperty1().equals(obj.getStringProperty1())); } }); } }); assertTrue(validator.validate(testObjectA, HttpRequestType.POST).passedValidation()); assertTrue(validator.validate(testObjectA, HttpRequestType.POST).passedValidation()); } @Test public void shouldValidateNotNull() { final Validator<SimpleBean> validator = build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getIntProperty1()).must().exist().withMessage("Must not be null"); } }); assertTrue(validator.validate(testObjectA, HttpRequestType.POST).passedValidation()); assertFalse(validator.validate(testObjectB, HttpRequestType.POST).passedValidation()); } @Test public void shouldValidateNotNotNotNull() { final Validator<SimpleBean> validator = build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getIntProperty1()).must().not().not().exist().withMessage("Must not be null"); } }); assertTrue(validator.validate(testObjectA, HttpRequestType.POST).passedValidation()); assertFalse(validator.validate(testObjectB, HttpRequestType.POST).passedValidation()); } @Test public void shouldValidateNotEmpty() { final Validator<SimpleBean> validator = build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getIntProperty1()).must().exist().withMessage("Must not be null"); result(validationTarget().getStringProperty1()).must().not().beEmptyOrNull().withMessage("Must not be null"); } }); assertTrue(validator.validate(testObjectA, HttpRequestType.POST).passedValidation()); assertFalse(validator.validate(testObjectB, HttpRequestType.POST).passedValidation()); } @Test public void shouldValidateNull() { final Validator<SimpleBean> validator = build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getIntProperty2()).must().not().exist().withMessage("Must not be null"); } }); assertTrue(validator.validate(testObjectA, HttpRequestType.POST).passedValidation()); assertFalse(validator.validate(testObjectB, HttpRequestType.POST).passedValidation()); } @Test public void shouldReturnedClonedExpectationResultLists() { final Validator<SimpleBean> validator = build(new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getIntProperty2()).must().not().exist().withMessage("Must not be null"); result(validationTarget().getIntProperty1()).must().not().exist().withMessage("Must not be null"); } }); final ValidatorResult result = validator.validate(testObjectB, HttpRequestType.POST); assertTrue(result.getValidationResults().size() == 1); result.getValidationResults().clear(); assertTrue(result.getValidationResults().size() == 1); } } public static class WhenHandlingExceptionsDuringValidation { @Test(expected = ValidationChainExecutionException.class) public void shouldNotValidateRaisedExpcetions() throws Exception { build( new ValidatorBuilder<SimpleBean>(SimpleBean.class) { { result(validationTarget().getIntProperty3()).must().exist(); } }).validate(new SimpleBean(), HttpRequestType.POST); } } }