/* * 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.stunner.bpmn.client.forms.fields.assignmentsEditor; import java.util.HashSet; import java.util.Set; import javax.enterprise.event.Event; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwtmockito.GwtMock; import com.google.gwtmockito.GwtMockito; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.TextBox; import org.gwtbootstrap3.client.ui.ValueListBox; import org.gwtbootstrap3.client.ui.constants.IconType; import org.jboss.errai.databinding.client.api.DataBinder; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.stunner.bpmn.client.forms.fields.model.AssignmentRow; import org.kie.workbench.common.stunner.bpmn.client.forms.fields.model.Variable; import org.kie.workbench.common.stunner.bpmn.client.forms.widgets.ComboBox; import org.kie.workbench.common.stunner.bpmn.client.forms.widgets.VariableNameTextBox; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.mocks.EventSourceMock; import org.uberfire.workbench.events.NotificationEvent; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class AssignmentListItemWidgetViewImplTest { private static final String VARIABLE_NAME = "variableName"; private static final String CONSTANT_NAME = "constantName"; private static final String CUST_DATA_TYPE_NAME = "custDataTypeName"; private static final String DATA_TYPE_NAME = "dataTypeName"; @GwtMock private DataBinder<AssignmentRow> assignment; @GwtMock private VariableNameTextBox name; @GwtMock private Button deleteButton; private TextBox customDataType; private TextBox constant; private ValueListBox<String> dataType; private ValueListBox<String> processVar; private ComboBox dataTypeComboBox; private ComboBox processVarComboBox; @GwtMock private KeyDownEvent keyDownEvent; private Event<NotificationEvent> notification = mock(EventSourceMock.class); @Captor private ArgumentCaptor<KeyDownHandler> keyDownHandlerCaptor; @Captor private ArgumentCaptor<BlurHandler> blurHandlerCaptor; private AssignmentListItemWidgetViewImpl view; @Before public void setUp() throws Exception { GwtMockito.initMocks(this); customDataType = mock(TextBox.class); constant = mock(TextBox.class); dataType = mock(ValueListBox.class); processVar = mock(ValueListBox.class); dataTypeComboBox = mock(ComboBox.class); processVarComboBox = mock(ComboBox.class); view = mock(AssignmentListItemWidgetViewImpl.class); view.assignment = assignment; view.name = name; view.deleteButton = deleteButton; view.customDataType = customDataType; view.dataType = dataType; view.constant = constant; view.processVar = processVar; view.dataTypeComboBox = dataTypeComboBox; view.processVarComboBox = processVarComboBox; view.notification = notification; doCallRealMethod().when(view).init(); doCallRealMethod().when(view).getConstant(); doCallRealMethod().when(view).setConstant(anyString()); doCallRealMethod().when(view).getCustomDataType(); doCallRealMethod().when(view).setCustomDataType(anyString()); doCallRealMethod().when(view).getModel(); doCallRealMethod().when(view).setModel(any(AssignmentRow.class)); doCallRealMethod().when(view).getModelValue(any(ValueListBox.class)); doCallRealMethod().when(view).setTextBoxModelValue(any(TextBox.class), anyString()); doCallRealMethod().when(view).setListBoxModelValue(any(ValueListBox.class), anyString()); doCallRealMethod().when(view).getDataType(); doCallRealMethod().when(view).setDataType(anyString()); doCallRealMethod().when(view).getProcessVar(); doCallRealMethod().when(view).setProcessVar(anyString()); doCallRealMethod().when(view).getVariableType(); doCallRealMethod().when(view).setAllowDuplicateNames(anyBoolean(), anyString()); doCallRealMethod().when(view).setParentWidget(any(ActivityDataIOEditorWidget.class)); doCallRealMethod().when(view).isDuplicateName(anyString()); doCallRealMethod().when(view).setShowConstants(anyBoolean()); doCallRealMethod().when(view).setDisallowedNames(anySet(), anyString()); doCallRealMethod().when(view).handleDeleteButton(any(ClickEvent.class)); AssignmentRow row = new AssignmentRow(); doReturn(row).when(assignment).getModel(); } @Test public void testSetModelInputCustomProcessVar() { AssignmentRow row = new AssignmentRow(); row.setProcessVar(VARIABLE_NAME); row.setConstant(null); row.setName(VARIABLE_NAME); row.setCustomDataType(CUST_DATA_TYPE_NAME); row.setDataType(null); row.setVariableType(Variable.VariableType.INPUT); doReturn(row).when(assignment).getModel(); view.setModel(row); verify(assignment, times(1)).setModel(row); verify(deleteButton, times(1)).setIcon(IconType.TRASH); verify(constant, never()).setVisible(false); verify(customDataType, times(1)).setValue(CUST_DATA_TYPE_NAME); verify(dataType, times(1)).setValue(CUST_DATA_TYPE_NAME); verify(processVar, times(1)).setValue(VARIABLE_NAME); verify(constant, never()).setValue(anyString()); } @Test public void testSetModelOutputNormalConstant() { AssignmentRow row = new AssignmentRow(); row.setProcessVar(null); row.setConstant(CONSTANT_NAME); row.setName(VARIABLE_NAME); row.setCustomDataType(null); row.setDataType(DATA_TYPE_NAME); row.setVariableType(Variable.VariableType.OUTPUT); doReturn(row).when(assignment).getModel(); view.setModel(row); verify(assignment, times(1)).setModel(row); verify(deleteButton, times(1)).setIcon(IconType.TRASH); verify(constant, times(1)).setVisible(false); verify(customDataType, never()).setValue(DATA_TYPE_NAME); verify(dataType, times(1)).setValue(DATA_TYPE_NAME); verify(constant, times(1)).setValue(CONSTANT_NAME); } @Test public void testSetTextBoxModelValueCustomDataType() { assertNull(view.getModel().getCustomDataType()); view.setTextBoxModelValue(customDataType, "abc"); assertEquals("abc", view.getModel().getCustomDataType()); assertNull(view.getModel().getConstant()); assertEquals("abc", view.getModelValue(dataType)); } @Test public void testSetTextBoxModelValueConstant() { assertNull(view.getModel().getConstant()); view.setTextBoxModelValue(constant, "abc"); assertEquals("abc", view.getModel().getConstant()); assertNull(view.getModel().getCustomDataType()); assertEquals("abc", view.getModelValue(processVar)); } @Test public void testSetListBoxModelValueDataType() { assertNull(view.getModel().getDataType()); view.setListBoxModelValue(dataType, "abc"); assertEquals("abc", view.getModel().getDataType()); assertNull(view.getModel().getCustomDataType()); assertNull(view.getModel().getProcessVar()); assertEquals("abc", view.getModelValue(dataType)); } @Test public void testSetListBoxModelValueProcessVar() { assertNull(view.getModel().getProcessVar()); view.setListBoxModelValue(processVar, "abc"); assertEquals("abc", view.getModel().getProcessVar()); assertNull(view.getModel().getConstant()); assertNull(view.getModel().getDataType()); assertEquals("abc", view.getModelValue(processVar)); } @Test public void testDataTypeHandlerSpace() { view.init(); verify(customDataType, times(1)).addKeyDownHandler(keyDownHandlerCaptor.capture()); KeyDownHandler handler = keyDownHandlerCaptor.getValue(); doReturn(Integer.valueOf(' ')).when(keyDownEvent).getNativeKeyCode(); handler.onKeyDown(keyDownEvent); verify(keyDownEvent, times(1)).preventDefault(); } @Test public void testDataTypeHandlerAlphabetical() { view.init(); verify(customDataType, times(1)).addKeyDownHandler(keyDownHandlerCaptor.capture()); KeyDownHandler handler = keyDownHandlerCaptor.getValue(); doReturn(Integer.valueOf('a')).when(keyDownEvent).getNativeKeyCode(); handler.onKeyDown(keyDownEvent); verify(keyDownEvent, never()).preventDefault(); } @Test public void testNameBlurHandler() { ActivityDataIOEditorWidget parent = mock(ActivityDataIOEditorWidget.class); when(parent.isDuplicateName(anyString())).thenReturn(true); doReturn("anyName").when(name).getText(); view.setAllowDuplicateNames(false, "ErrorMessage"); view.setParentWidget(parent); view.init(); verify(name, times(1)).addBlurHandler(blurHandlerCaptor.capture()); BlurHandler handler = blurHandlerCaptor.getValue(); handler.onBlur(mock(BlurEvent.class)); verify(parent, times(1)).isDuplicateName("anyName"); verify(notification, times(1)).fire(new NotificationEvent("ErrorMessage", NotificationEvent.NotificationType.ERROR)); verify(name, times(1)).setValue(""); } @Test public void testSetShowConstantsTrue() { view.setShowConstants(true); verify(processVarComboBox).setShowCustomValues(true); } @Test public void testSetShowConstantsFalse() { view.setShowConstants(false); verify(processVarComboBox).setShowCustomValues(false); } @Test public void testSetDisallowedNames() { Set<String> disallowedNames = new HashSet<String>(); String disallowedNameErrorMessage = "error value"; view.setDisallowedNames(disallowedNames, disallowedNameErrorMessage); verify(name).setInvalidValues(disallowedNames, false, disallowedNameErrorMessage); } @Test public void testHandleDeleteButton() { ActivityDataIOEditorWidget widget = mock(ActivityDataIOEditorWidget.class); AssignmentRow model = mock(AssignmentRow.class); when(view.getModel()).thenReturn(model); view.setParentWidget(widget); view.handleDeleteButton(null); verify(widget).removeAssignment(model); } }