/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.forms.processing.engine.handling.impl; import javax.validation.Validation; import javax.validation.Validator; import com.google.gwtmockito.GwtMockitoTestRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.forms.processing.engine.handling.FormField; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class FieldChangeHandlerManagerImplTest extends AbstractFormEngineTest { protected FieldChangeHandlerManagerImpl fieldChangeHandlerManager; @Before public void init() { super.init(); Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); FormValidatorImpl formValidator = new FormValidatorImpl(new DefaultModelValidator(validator)); formValidator.setFormFieldProvider(formFieldProvider); fieldChangeHandlerManager = new FieldChangeHandlerManagerImpl(); fieldChangeHandlerManager.setValidator(formValidator); executionCounts = 0; } @After public void after() { fieldChangeHandlerManager.clear(); } @Test public void testAnonymousFieldChangeProcessing() { registerFields(false); fieldChangeHandlerManager.addFieldChangeHandler(anonymous); fieldChangeHandlerManager.processFieldChange(VALUE_FIELD, model.getValue(), model); assertEquals(1, executionCounts); verify(anonymous).onFieldChange(anyString(), anyObject()); fieldChangeHandlerManager.processFieldChange(USER_NAME_FIELD, model.getUser().getName(), model); assertEquals(2, executionCounts); verify(anonymous, times(2)).onFieldChange(anyString(), anyObject()); fieldChangeHandlerManager.processFieldChange(USER_LAST_NAME_FIELD, model.getUser().getLastName(), model); fieldChangeHandlerManager.processFieldChange(USER_ADDRESS_FIELD, model.getUser().getName(), model); assertEquals(4, executionCounts); verify(anonymous, times(4)).onFieldChange(anyString(), anyObject()); } @Test public void testAnonymousFieldChangeProcessingWithValidation() { registerFields(true); fieldChangeHandlerManager.addFieldChangeHandler(anonymous); fieldChangeHandlerManager.processFieldChange(VALUE_FIELD, model.getValue(), model); assertEquals(1, executionCounts); verify(anonymous).onFieldChange(anyString(), anyObject()); fieldChangeHandlerManager.processFieldChange(USER_NAME_FIELD, model.getUser().getName(), model); assertEquals(2, executionCounts); verify(anonymous, times(2)).onFieldChange(anyString(), anyObject()); fieldChangeHandlerManager.processFieldChange(USER_LAST_NAME_FIELD, model.getUser().getLastName(), model); fieldChangeHandlerManager.processFieldChange(USER_ADDRESS_FIELD, model.getUser().getName(), model); assertEquals(4, executionCounts); verify(anonymous, times(4)).onFieldChange(anyString(), anyObject()); } @Test public void testAnonymousFieldChangeProcessingWithValidationFailure() { registerFields(true); fieldChangeHandlerManager.addFieldChangeHandler(anonymous); model.setValue(60); fieldChangeHandlerManager.processFieldChange(VALUE_FIELD, model.getValue(), model); // Validation must file model.value must be between 0 : 50 assertEquals(0, executionCounts); verify(anonymous, never()).onFieldChange(anyString(), anyObject()); fieldChangeHandlerManager.processFieldChange(USER_NAME_FIELD, model.getUser().getName(), model); // Validation must work! assertEquals(1, executionCounts); verify(anonymous).onFieldChange(anyString(), anyObject()); model.getUser().setAddress("Pentos"); fieldChangeHandlerManager.processFieldChange(USER_LAST_NAME_FIELD, model.getUser().getLastName(), model); fieldChangeHandlerManager.processFieldChange(USER_ADDRESS_FIELD, model.getUser().getName(), model); // Validation must fail for USER_ADDRESS_FIELD -> address between 10 : 100 assertEquals(2, executionCounts); verify(anonymous, times(2)).onFieldChange(anyString(), anyObject()); } @Test public void testNamedFieldChangeProcessing() { registerFields(false); fieldChangeHandlerManager.addFieldChangeHandler(VALUE_FIELD, value); fieldChangeHandlerManager.addFieldChangeHandler(USER_NAME_FIELD, userName); fieldChangeHandlerManager.addFieldChangeHandler(USER_LAST_NAME_FIELD, userLastName); fieldChangeHandlerManager.addFieldChangeHandler(USER_BIRTHDAY_FIELD, userBirthday); fieldChangeHandlerManager.addFieldChangeHandler(USER_MARRIED_FIELD, userMarried); fieldChangeHandlerManager.addFieldChangeHandler(USER_ADDRESS_FIELD, userAddress); fieldChangeHandlerManager.processFieldChange(VALUE_FIELD, model.getValue(), model); assertEquals(1, executionCounts); verify(value).onFieldChange(anyString(), anyObject()); verify(userName, never()).onFieldChange(anyString(), anyObject()); verify(userLastName, never()).onFieldChange(anyString(), anyObject()); verify(userBirthday, never()).onFieldChange(anyString(), anyObject()); verify(userMarried, never()).onFieldChange(anyString(), anyObject()); verify(userAddress, never()).onFieldChange(anyString(), anyObject()); fieldChangeHandlerManager.processFieldChange(USER_NAME_FIELD, model.getUser().getName(), model); fieldChangeHandlerManager.processFieldChange(USER_LAST_NAME_FIELD, model.getUser().getName(), model); fieldChangeHandlerManager.processFieldChange(USER_MARRIED_FIELD, model.getUser().getName(), model); assertEquals(4, executionCounts); verify(value).onFieldChange(anyString(), anyObject()); verify(userName).onFieldChange(anyString(), anyObject()); verify(userLastName).onFieldChange(anyString(), anyObject()); verify(userBirthday, never()).onFieldChange(anyString(), anyObject()); verify(userMarried).onFieldChange(anyString(), anyObject()); verify(userAddress, never()).onFieldChange(anyString(), anyObject()); } @Test public void testNamedFieldChangeProcessingWithValidation() { registerFields(true); fieldChangeHandlerManager.addFieldChangeHandler(VALUE_FIELD, value); fieldChangeHandlerManager.addFieldChangeHandler(USER_NAME_FIELD, userName); fieldChangeHandlerManager.addFieldChangeHandler(USER_LAST_NAME_FIELD, userLastName); fieldChangeHandlerManager.addFieldChangeHandler(USER_BIRTHDAY_FIELD, userBirthday); fieldChangeHandlerManager.addFieldChangeHandler(USER_MARRIED_FIELD, userMarried); fieldChangeHandlerManager.addFieldChangeHandler(USER_ADDRESS_FIELD, userAddress); // Validation must work here fieldChangeHandlerManager.processFieldChange(VALUE_FIELD, model.getValue(), model); assertEquals(1, executionCounts); verify(value).onFieldChange(anyString(), anyObject()); verify(userName, never()).onFieldChange(anyString(), anyObject()); verify(userLastName, never()).onFieldChange(anyString(), anyObject()); verify(userBirthday, never()).onFieldChange(anyString(), anyObject()); verify(userMarried, never()).onFieldChange(anyString(), anyObject()); verify(userAddress, never()).onFieldChange(anyString(), anyObject()); model.getUser().setName(null); model.getUser().setLastName(null); fieldChangeHandlerManager.processFieldChange(USER_NAME_FIELD, model.getUser().getName(), model); fieldChangeHandlerManager.processFieldChange(USER_LAST_NAME_FIELD, model.getUser().getName(), model); fieldChangeHandlerManager.processFieldChange(USER_MARRIED_FIELD, model.getUser().getName(), model); // Validation must fail for USER_NAME_FIELD && USER_LAST_NAME_FIELD (cannot be null or empty string) assertEquals(2, executionCounts); verify(value).onFieldChange(anyString(), anyObject()); verify(userName, never()).onFieldChange(anyString(), anyObject()); verify(userLastName, never()).onFieldChange(anyString(), anyObject()); verify(userBirthday, never()).onFieldChange(anyString(), anyObject()); verify(userMarried).onFieldChange(anyString(), anyObject()); verify(userAddress, never()).onFieldChange(anyString(), anyObject()); } protected void registerFields(boolean validateOnChange) { for (FormField formField : formFieldProvider.getAll()) { fieldChangeHandlerManager.registerField(formField.getFieldName(), validateOnChange); } } }