/* * Copyright 2017 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.editor.client.editor; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gwtmockito.GwtMock; import com.google.gwtmockito.GwtMockitoTestRunner; import org.apache.deltaspike.core.util.StringUtils; import org.guvnor.common.services.shared.metadata.model.Overview; import org.jboss.errai.ioc.client.api.ManagedInstance; import org.jboss.errai.ioc.client.container.SyncBeanDef; import org.jboss.errai.ioc.client.container.SyncBeanManager; import org.jboss.errai.ui.client.local.spi.TranslationService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.forms.editor.client.editor.events.FormEditorContextRequest; import org.kie.workbench.common.forms.editor.client.editor.events.FormEditorContextResponse; import org.kie.workbench.common.forms.editor.client.editor.rendering.EditorFieldLayoutComponent; import org.kie.workbench.common.forms.editor.client.type.FormDefinitionResourceType; import org.kie.workbench.common.forms.editor.model.FormModelerContent; import org.kie.workbench.common.forms.editor.service.shared.FormEditorRenderingContext; import org.kie.workbench.common.forms.editor.service.shared.FormEditorService; import org.kie.workbench.common.forms.fields.shared.fieldTypes.basic.checkBox.definition.CheckBoxFieldDefinition; import org.kie.workbench.common.forms.fields.shared.fieldTypes.basic.datePicker.definition.DatePickerFieldDefinition; import org.kie.workbench.common.forms.fields.shared.fieldTypes.basic.textBox.definition.TextBoxFieldDefinition; import org.kie.workbench.common.forms.fields.test.TestFieldManager; import org.kie.workbench.common.forms.model.FieldDefinition; import org.kie.workbench.common.forms.model.FormDefinition; import org.kie.workbench.common.forms.model.FormModel; import org.mockito.Mock; import org.uberfire.ext.editor.commons.client.history.VersionRecordManager; import org.uberfire.ext.plugin.client.perspective.editor.layout.editor.HTMLLayoutDragComponent; import org.uberfire.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class FormEditorHelperTest { private List<FieldDefinition> employeeFields; private FieldDefinition nameField; private FieldDefinition marriedField; private FormEditorHelper formEditorHelper; @Mock VersionRecordManager versionRecordManager; @Mock private FormEditorPresenter.FormEditorView view; @Mock private TranslationService translationService; @GwtMock private FormDefinitionResourceType formDefinitionResourceType; @Mock private HTMLLayoutDragComponent htmlLayoutDragComponent; @Mock private ManagedInstance<EditorFieldLayoutComponent> editorFieldLayoutComponents; @Mock protected EventSourceMock<FormEditorContextResponse> eventMock; @Mock protected FormEditorService formEditorService; @Mock protected FormDefinition formDefinition; @Mock protected TestFieldManager testFieldManager; private CallerMock<FormEditorService> editorServiceCallerMock; private FormModelerContent content; @Before public void setUp() throws Exception { initFields(); loadContent(); } protected void loadContent() { when(editorFieldLayoutComponents.get()).thenAnswer(invocationOnMock -> { final EditorFieldLayoutComponent mocked = mock(EditorFieldLayoutComponent.class); return mocked; }); when(formEditorService.loadContent(any())).then(invocation -> { FormDefinition form = new FormDefinition(); form.setName("EmployeeTestForm"); form.setId("_random_id"); content = new FormModelerContent(); employeeFields.forEach(fieldDefinition -> content.getModelProperties().add(fieldDefinition.getBinding())); FormModel model = () -> "employee"; form.setModel(model); Map<String, List<FieldDefinition>> availableFields = new HashMap<>(); availableFields.put("employee", employeeFields); content.setDefinition(form); content.setOverview(new Overview()); content.setAvailableFields(availableFields); return content; }); when(testFieldManager.getBaseFieldTypes()).thenAnswer(invocationOnMock -> { List<String> baseFields = new ArrayList<>(); baseFields.add("TextBox"); baseFields.add("CheckBox"); return baseFields; }); when(testFieldManager.getDefinitionByFieldTypeName("TextBox")).thenReturn(new TextBoxFieldDefinition()); when(testFieldManager.getDefinitionByFieldTypeName("CheckBox")).thenReturn(new CheckBoxFieldDefinition()); editorServiceCallerMock = new CallerMock<>(formEditorService); formEditorHelper = new FormEditorHelper(testFieldManager, eventMock, editorFieldLayoutComponents); formEditorService.loadContent(null); formEditorHelper.initHelper(content); } @Test public void testGenerateUnbindedFieldName() { String fieldName = formEditorHelper.generateUnbindedFieldName(nameField); assertEquals(fieldName, FormEditorHelper.UNBINDED_FIELD_NAME_PREFFIX + nameField.getId()); } @Test public void testGetContent() { FormModelerContent resContent = formEditorHelper.getContent(); assertEquals(resContent, content); } @Test public void testGetFormDefinition() { FormDefinition formDefinition = formEditorHelper.getFormDefinition(); assertEquals(formDefinition, content.getDefinition()); } @Test public void testGetRenderingContext() { FormEditorRenderingContext renderingContext = formEditorHelper.getRenderingContext(); assertEquals(renderingContext, content.getRenderingContext()); } @Test public void testGetAvailableFields() { Map<String, FieldDefinition> availableFields = formEditorHelper.getAvailableFields(); assertEquals("There should be no available field", availableFields.size(), 0); } @Test public void testGetFormField() { when(formDefinition.getFieldById(anyString())).thenReturn(nameField); content.setDefinition(formDefinition); FieldDefinition formField = formEditorHelper.getFormField(nameField.getId()); assertEquals(formField, nameField); } @Test public void testGetFormFieldAvailable() { formEditorHelper.addAvailableField(nameField); formEditorHelper.getFormField(nameField.getId()); assertEquals("If the field should be no more available!", formEditorHelper.getAvailableFields().size(), 0); } @Test public void testGetFormFieldUnbinded() { when(testFieldManager.getDefinitionByFieldTypeName(anyString())).thenReturn(nameField); FieldDefinition formField = formEditorHelper.getFormField(nameField.getId()); assertEquals("The unbinded field must have a generated name", formField.getName(), formEditorHelper.generateUnbindedFieldName(nameField)); assertEquals("The unbinded field must have label = the field type name", formField.getLabel(), nameField.getFieldType().getTypeName()); } @Test public void testGetBaseFieldsDraggables() { List<EditorFieldLayoutComponent> draggables = formEditorHelper.getBaseFieldsDraggables(); assertEquals(0, 0); } @Test public void testAddAvailableField() { formEditorHelper.addAvailableField(employeeFields.get(0)); Map<String, FieldDefinition> availableFields = formEditorHelper.getAvailableFields(); assertEquals("The added field should be returned in available fields", availableFields.size(), 1); } @Test public void testAddAvailableFields() { formEditorHelper.addAvailableFields(employeeFields); Map<String, FieldDefinition> availableFields = formEditorHelper.getAvailableFields(); assertEquals("The added field should be returned in available fields", availableFields.size(), employeeFields.size()); } @Test public void testRemoveFieldsNotAddToAvailableNoFields() { testRemoveFields(false, false); } @Test public void testRemoveFieldsAddToAvailable() { testRemoveFields(true, true); } @Test public void testRemoveFieldsNotAddToAvailable() { testRemoveFields(false, true); } @Test public void testRemoveFieldsAddToAvailableNoFields() { testRemoveFields(true, false); } protected void testRemoveFields(boolean addToAvailable, boolean definitionHasFields) { if (definitionHasFields) { when(formDefinition.getFields()).thenReturn(new ArrayList<>(employeeFields)); content.setDefinition(formDefinition); } int prevAvailableSize = formEditorHelper.getAvailableFields().size(); FieldDefinition removedField = formEditorHelper.removeField(nameField.getId(), addToAvailable); assertEquals("It should " + (addToAvailable ? " " : "not ") + "add the field to the available fields", formEditorHelper.getAvailableFields().size(), prevAvailableSize + (addToAvailable && definitionHasFields ? 1 : 0)); assertFalse("Removed field should " + (definitionHasFields ? "not " : " ") + "be null", (removedField == null) == definitionHasFields); } @Test public void testGetCompatibleFieldCodes() { List<String> fieldCodes = formEditorHelper.getCompatibleModelFields(nameField); assertTrue(fieldCodes.size() > 0); assertEquals(fieldCodes.get(0), nameField.getId()); } @Test public void testGetCompatibleFieldTypes() { Collection<String> fieldCodes = formEditorHelper.getCompatibleFieldTypes(nameField); assertTrue(fieldCodes.size() == 0); } @Test public void testSwitchToFieldNull() { testSwitchToField(null); } @Test public void testSwitchToFieldNotNull() { testSwitchToField(nameField.getBinding()); } public void testSwitchToField(String fieldCode) { when(testFieldManager.getDefinitionByFieldTypeName(anyString())) .thenReturn(nameField); formEditorHelper.addAvailableFields(employeeFields); FieldDefinition fieldDefinition = formEditorHelper.switchToField(nameField, fieldCode); String expectedFieldName = (StringUtils.isEmpty(fieldCode) ? formEditorHelper.generateUnbindedFieldName(nameField) : nameField.getName()); assertEquals(fieldDefinition.getName(), expectedFieldName); } @Test public void testSwitchToFieldType() { when(testFieldManager.getFieldFromProvider(any(), any())).thenReturn(marriedField); FieldDefinition fieldDefinition = formEditorHelper.switchToFieldType(nameField, marriedField.getFieldType().getTypeName()); assertEquals(fieldDefinition.getStandaloneClassName(), nameField.getStandaloneClassName()); assertEquals(fieldDefinition.getName(), nameField.getName()); assertNotEquals(fieldDefinition.getClass(), nameField.getClass()); } @Test public void testOnFieldRequest() { FormEditorContextRequest request = new FormEditorContextRequest(formEditorHelper.getFormDefinition().getId(), nameField.getId()); formEditorHelper.onFieldRequest(request); verify(eventMock, times(1)).fire(any()); } @Test public void testGetDroppedField() { formEditorHelper.getDroppedField(marriedField.getFieldType().getTypeName()); verify(eventMock, times(1)).fire(any()); } protected void initFields() { TextBoxFieldDefinition name = new TextBoxFieldDefinition(); name.setId("name"); name.setName("employee_name"); name.setLabel("Name"); name.setPlaceHolder("Name"); name.setBinding("name"); name.setStandaloneClassName(String.class.getName()); nameField = name; TextBoxFieldDefinition lastName = new TextBoxFieldDefinition(); lastName.setId("lastName"); lastName.setName("employee_lastName"); lastName.setLabel("Last Name"); lastName.setPlaceHolder("Last Name"); lastName.setBinding("lastName"); lastName.setStandaloneClassName(String.class.getName()); DatePickerFieldDefinition birthday = new DatePickerFieldDefinition(); birthday.setId("birthday"); birthday.setName("employee_birthday"); birthday.setLabel("Birthday"); birthday.setBinding("birthday"); birthday.setStandaloneClassName(Date.class.getName()); CheckBoxFieldDefinition married = new CheckBoxFieldDefinition(); married.setId("married"); married.setName("employee_married"); married.setLabel("Married"); married.setBinding("married"); married.setStandaloneClassName(Boolean.class.getName()); marriedField = married; employeeFields = new ArrayList<>(); employeeFields.add(name); employeeFields.add(lastName); employeeFields.add(birthday); employeeFields.add(married); } }