/*
* 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.rendering;
import java.util.Map;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtmockito.GwtMock;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.guvnor.common.services.shared.metadata.model.Overview;
import org.jboss.errai.ioc.client.api.ManagedInstance;
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.dynamic.client.rendering.FieldRenderer;
import org.kie.workbench.common.forms.dynamic.client.rendering.FieldRendererManager;
import org.kie.workbench.common.forms.editor.client.editor.FormEditorHelper;
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.properties.FieldPropertiesRenderer;
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.fields.shared.fieldTypes.basic.textArea.type.TextAreaFieldType;
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.mockito.Mock;
import org.uberfire.ext.layout.editor.api.editor.LayoutComponent;
import org.uberfire.ext.layout.editor.client.api.ComponentDropEvent;
import org.uberfire.ext.layout.editor.client.api.ComponentRemovedEvent;
import org.uberfire.ext.layout.editor.client.api.ModalConfigurationContext;
import org.uberfire.ext.layout.editor.client.api.RenderingContext;
import org.uberfire.ext.layout.editor.client.infra.LayoutDragComponentHelper;
import org.uberfire.mocks.EventSourceMock;
import org.uberfire.mvp.Command;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class EditorFieldLayoutComponentTest {
public static String ANOTHER_BINDING = "antherField";
@Mock
private ManagedInstance<EditorFieldLayoutComponent> editorFieldLayoutComponents;
@Mock
protected EventSourceMock<FormEditorContextResponse> responseEvent;
protected FormModelerContent content;
private FormEditorHelper formEditorHelper;
@Mock
protected FieldPropertiesRenderer.FieldPropertiesRendererView fieldPropertiesRendererView;
@Mock
protected FieldPropertiesRenderer propertiesRenderer;
@Mock
protected LayoutDragComponentHelper layoutDragComponentHelper;
@Mock
protected EventSourceMock<FormEditorContextRequest> fieldRequest;
@Mock
protected EventSourceMock<ComponentDropEvent> fieldDroppedEvent;
@Mock
protected EventSourceMock<ComponentRemovedEvent> fieldRemovedEvent;
@Mock
protected FieldRendererManager fieldRendererManager;
@Mock
protected FieldRenderer fieldRenderer;
@Mock
protected TranslationService translationService;
@Mock
protected FormEditorRenderingContext context;
@Mock
protected FormDefinition formDefinition;
protected FieldDefinition fieldDefinition;
private LayoutComponent layoutComponent = new LayoutComponent(EditorFieldLayoutComponent.class.getName());
@GwtMock
private Widget widget;
private RenderingContext ctx;
private EditorFieldLayoutComponent editorFieldLayoutComponent;
@Before
public void init() {
when(editorFieldLayoutComponents.get()).thenAnswer(invocationOnMock -> {
final EditorFieldLayoutComponent mocked = mock(EditorFieldLayoutComponent.class);
return mocked;
});
formEditorHelper = spy(new FormEditorHelper(new TestFieldManager(),
responseEvent,
editorFieldLayoutComponents));
fieldDefinition = new TextBoxFieldDefinition();
fieldDefinition.setId(EditorFieldLayoutComponent.FIELD_ID);
fieldDefinition.setName(EditorFieldLayoutComponent.FIELD_ID);
fieldDefinition.setBinding(EditorFieldLayoutComponent.FIELD_ID);
when(formDefinition.getId()).thenReturn(EditorFieldLayoutComponent.FORM_ID);
when(formDefinition.getFieldById(anyString())).thenReturn(fieldDefinition);
when(context.getRootForm()).thenReturn(formDefinition);
content = new FormModelerContent();
content.setDefinition(formDefinition);
content.setOverview(mock(Overview.class));
formEditorHelper.initHelper(content);
when(formEditorHelper.getRenderingContext()).thenReturn(context);
layoutComponent.addProperty(EditorFieldLayoutComponent.FIELD_ID,
EditorFieldLayoutComponent.FIELD_ID);
layoutComponent.addProperty(EditorFieldLayoutComponent.FORM_ID,
EditorFieldLayoutComponent.FORM_ID);
ctx = new RenderingContext(layoutComponent,
widget);
when(fieldRendererManager.getRendererForField(any())).thenReturn(fieldRenderer);
when(fieldRenderer.renderWidget()).thenReturn(widget);
when(propertiesRenderer.getView()).thenReturn(fieldPropertiesRendererView);
editorFieldLayoutComponent = spy(new EditorFieldLayoutComponent(propertiesRenderer,
layoutDragComponentHelper,
fieldRequest,
fieldDroppedEvent,
fieldRemovedEvent) {
{
fieldRendererManager = EditorFieldLayoutComponentTest.this.fieldRendererManager;
translationService = EditorFieldLayoutComponentTest.this.translationService;
}
});
}
@Test
public void testDroppingNewField() {
editorFieldLayoutComponent.getShowWidget(ctx);
verify(editorFieldLayoutComponent).getEditionContext(layoutComponent.getProperties());
verify(fieldRequest).fire(any());
editorFieldLayoutComponent.onFieldResponse(new FormEditorContextResponse(EditorFieldLayoutComponent.FORM_ID,
EditorFieldLayoutComponent.FIELD_ID,
formEditorHelper));
verify(editorFieldLayoutComponent).init(context,
fieldDefinition);
verify(fieldRenderer).init(context,
fieldDefinition);
verify(fieldRenderer).renderWidget();
}
@Test
public void testRenderingExistingField() {
testDroppingNewField();
editorFieldLayoutComponent.getShowWidget(ctx);
verify(editorFieldLayoutComponent, times(1)).getEditionContext(layoutComponent.getProperties());
verify(fieldRequest, times(1)).fire(any());
verify(editorFieldLayoutComponent, times(1)).init(context,
fieldDefinition);
verify(fieldRenderer, times(1)).init(context,
fieldDefinition);
verify(fieldRenderer, times(2)).renderWidget();
}
@Test
public void testReceivingWrongContextResponses() {
testDroppingNewField();
editorFieldLayoutComponent.onFieldResponse(new FormEditorContextResponse("",
EditorFieldLayoutComponent.FIELD_ID,
formEditorHelper));
verify(editorFieldLayoutComponent, times(1)).init(context,
fieldDefinition);
verify(fieldRenderer, times(1)).init(context,
fieldDefinition);
editorFieldLayoutComponent.onFieldResponse(new FormEditorContextResponse(EditorFieldLayoutComponent.FORM_ID,
"",
formEditorHelper));
verify(editorFieldLayoutComponent, times(1)).init(context,
fieldDefinition);
verify(fieldRenderer, times(1)).init(context,
fieldDefinition);
}
@Test
public void testReceivingResponsesWhenDisabled() {
editorFieldLayoutComponent.setDisabled(true);
editorFieldLayoutComponent.onFieldResponse(new FormEditorContextResponse(EditorFieldLayoutComponent.FORM_ID,
EditorFieldLayoutComponent.FIELD_ID,
formEditorHelper));
verify(editorFieldLayoutComponent, never()).init(context,
fieldDefinition);
verify(fieldRenderer, never()).init(context,
fieldDefinition);
}
@Test
public void testOpenFieldPropertiesBeforeDrop() {
ModalConfigurationContext modalConfigurationContext = new ModalConfigurationContext(layoutComponent,
mock(Command.class),
mock(Command.class));
editorFieldLayoutComponent.getConfigurationModal(modalConfigurationContext);
verify(editorFieldLayoutComponent).getEditionContext(layoutComponent.getProperties());
verify(fieldRequest).fire(any());
editorFieldLayoutComponent.onFieldResponse(new FormEditorContextResponse(EditorFieldLayoutComponent.FORM_ID,
EditorFieldLayoutComponent.FIELD_ID,
formEditorHelper));
verify(editorFieldLayoutComponent).init(context,
fieldDefinition);
verify(fieldRenderer).init(context,
fieldDefinition);
verify(propertiesRenderer).render(any());
}
@Test
public void testOpenFieldProperties() {
testDroppingNewField();
ModalConfigurationContext modalConfigurationContext = new ModalConfigurationContext(layoutComponent,
mock(Command.class),
mock(Command.class));
editorFieldLayoutComponent.getConfigurationModal(modalConfigurationContext);
verify(propertiesRenderer).render(any());
verify(propertiesRenderer).getView();
verify(fieldPropertiesRendererView).getPropertiesModal();
}
@Test
public void testSwitchToFieldType() {
testOpenFieldProperties();
editorFieldLayoutComponent.switchToFieldType(TextAreaFieldType.NAME);
verify(formEditorHelper).switchToFieldType(fieldDefinition, TextAreaFieldType.NAME);
verify(propertiesRenderer, times(2)).render(any());
verify(fieldRendererManager,
times(2)).getRendererForField(any());
verify(fieldRenderer,
times(2)).renderWidget();
}
@Test
public void testSwitchToDifferentField() {
testOpenFieldProperties();
editorFieldLayoutComponent.switchToField(ANOTHER_BINDING);
verify(formEditorHelper).switchToField(fieldDefinition, ANOTHER_BINDING);
verify(fieldRemovedEvent).fire(any());
verify(fieldDroppedEvent).fire(any());
verify(propertiesRenderer, times(2)).render(any());
verify(fieldRenderer, times(2)).init(any(), any());
verify(fieldRenderer,
times(2)).renderWidget();
}
@Test
public void testSwitchToSameField() {
testOpenFieldProperties();
editorFieldLayoutComponent.switchToField(fieldDefinition.getBinding());
verify(formEditorHelper, never()).switchToField(any(), anyString());
verify(fieldRemovedEvent, never()).fire(any());
verify(fieldDroppedEvent,never()).fire(any());
verify(propertiesRenderer, times(1)).render(any());
verify(fieldRenderer, times(1)).init(any(), any());
verify(fieldRenderer,
times(1)).renderWidget();
}
@Test
public void testHardCodedDragAndDropMethods() {
editorFieldLayoutComponent.setSettingValue(EditorFieldLayoutComponent.FORM_ID,
formDefinition.getId());
editorFieldLayoutComponent.setSettingValue(EditorFieldLayoutComponent.FIELD_ID,
fieldDefinition.getId());
verifyDragAndDropMethods();
}
@Test
public void testDragAndDropMethods() {
testDroppingNewField();
verifyDragAndDropMethods();
}
protected void verifyDragAndDropMethods() {
assertEquals(2, editorFieldLayoutComponent.getSettingsKeys().length);
assertEquals(formDefinition.getId(), editorFieldLayoutComponent.getSettingValue(EditorFieldLayoutComponent.FORM_ID));
assertEquals(fieldDefinition.getId(), editorFieldLayoutComponent.getSettingValue(EditorFieldLayoutComponent.FIELD_ID));
Map<String, String> settings = editorFieldLayoutComponent.getMapSettings();
assertEquals(formDefinition.getId(), settings.get(EditorFieldLayoutComponent.FORM_ID));
assertEquals(fieldDefinition.getId(), settings.get(EditorFieldLayoutComponent.FIELD_ID));
}
}