package com.sequenceiq.cloudbreak.controller.validation; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.validation.ConstraintTarget; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.Payload; import javax.validation.metadata.ConstraintDescriptor; import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl; import org.hibernate.validator.internal.engine.path.PathImpl; import org.junit.Before; import org.junit.Test; import com.sequenceiq.cloudbreak.api.model.InstanceGroupAdjustmentJson; import com.sequenceiq.cloudbreak.api.model.StatusRequest; import com.sequenceiq.cloudbreak.api.model.UpdateStackJson; import com.sequenceiq.cloudbreak.validation.UpdateStackRequestValidator; public class UpdateStackRequestValidatorTest { private UpdateStackRequestValidator underTest; private ConstraintValidatorContext constraintValidatorContext; @Before public void setUp() { underTest = new UpdateStackRequestValidator(); constraintValidatorContext = new ConstraintValidatorContextImpl( new ArrayList<>(), null, PathImpl.createRootPath(), new DummyConstraintDescriptor() ); } @Test public void testIsValidShouldReturnTrueWhenStatusIsUpdated() { UpdateStackJson updateStackJson = new UpdateStackJson(); updateStackJson.setInstanceGroupAdjustment(null); updateStackJson.setStatus(StatusRequest.STARTED); boolean valid = underTest.isValid(updateStackJson, constraintValidatorContext); assertTrue(valid); } @Test public void testIsValidShouldReturnTrueWhenNodeCountIsUpdated() { UpdateStackJson updateStackJson = new UpdateStackJson(); InstanceGroupAdjustmentJson instanceGroupAdjustmentJson = new InstanceGroupAdjustmentJson(); instanceGroupAdjustmentJson.setScalingAdjustment(12); instanceGroupAdjustmentJson.setInstanceGroup("slave_1"); updateStackJson.setInstanceGroupAdjustment(instanceGroupAdjustmentJson); updateStackJson.setStatus(null); boolean valid = underTest.isValid(updateStackJson, constraintValidatorContext); assertTrue(valid); } @Test public void testInValidShouldReturnTrueWhenNodeCountIsLowerThanOneUpdatedAndWithClusterEvent() { UpdateStackJson updateStackJson = new UpdateStackJson(); InstanceGroupAdjustmentJson instanceGroupAdjustmentJson = new InstanceGroupAdjustmentJson(); instanceGroupAdjustmentJson.setScalingAdjustment(-1); instanceGroupAdjustmentJson.setWithClusterEvent(true); instanceGroupAdjustmentJson.setInstanceGroup("slave_1"); updateStackJson.setInstanceGroupAdjustment(instanceGroupAdjustmentJson); updateStackJson.setStatus(null); boolean valid = underTest.isValid(updateStackJson, constraintValidatorContext); assertFalse(valid); } @Test public void testIsValidShouldReturnFalseWhenRequestContainsNodeCountAndStatus() { UpdateStackJson updateStackJson = new UpdateStackJson(); InstanceGroupAdjustmentJson instanceGroupAdjustmentJson = new InstanceGroupAdjustmentJson(); instanceGroupAdjustmentJson.setScalingAdjustment(4); instanceGroupAdjustmentJson.setInstanceGroup("slave_1"); updateStackJson.setStatus(StatusRequest.STARTED); updateStackJson.setInstanceGroupAdjustment(instanceGroupAdjustmentJson); boolean valid = underTest.isValid(updateStackJson, constraintValidatorContext); assertFalse(valid); } @Test public void testIsValidShouldReturnFalseWhenRequestContainsOnlyNulls() { UpdateStackJson updateStackJson = new UpdateStackJson(); updateStackJson.setInstanceGroupAdjustment(null); updateStackJson.setStatus(null); boolean valid = underTest.isValid(updateStackJson, constraintValidatorContext); assertFalse(valid); } private class DummyAnnotation implements Annotation { @Override public boolean equals(Object obj) { return false; } @Override public int hashCode() { return 0; } @Override public String toString() { return "dummy"; } @Override public Class<? extends Annotation> annotationType() { return getClass(); } } private class DummyConstraintDescriptor implements ConstraintDescriptor<DummyAnnotation>, Serializable { @Override public DummyAnnotation getAnnotation() { return null; } @Override public String getMessageTemplate() { return ""; } @Override public Set<Class<?>> getGroups() { return new HashSet<>(); } @Override public Set<Class<? extends Payload>> getPayload() { return new HashSet<>(); } @Override public ConstraintTarget getValidationAppliesTo() { return ConstraintTarget.PARAMETERS; } @Override public List<Class<? extends ConstraintValidator<DummyAnnotation, ?>>> getConstraintValidatorClasses() { return new ArrayList<>(); } @Override public Map<String, Object> getAttributes() { return new HashMap<>(); } @Override public Set<ConstraintDescriptor<?>> getComposingConstraints() { return new HashSet<>(); } @Override public boolean isReportAsSingleViolation() { return false; } } }