/* * 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.drools.workbench.screens.guided.dtable.client.widget.table; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.enterprise.event.Event; import com.google.gwt.event.shared.EventBus; import org.drools.workbench.models.datamodel.workitems.PortableWorkDefinition; import org.drools.workbench.models.guided.dtable.shared.model.BaseColumn; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.screens.guided.dtable.client.editor.clipboard.Clipboard; import org.drools.workbench.screens.guided.dtable.client.editor.clipboard.impl.DefaultClipboard; import org.drools.workbench.screens.guided.dtable.client.type.GuidedDTableResourceType; import org.drools.workbench.screens.guided.dtable.client.widget.analysis.DecisionTableAnalyzerProvider; import org.drools.workbench.screens.guided.dtable.client.widget.analysis.controller.AnalyzerController; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableColumnSelectedEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectedEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectionsChangedEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.RefreshActionsPanelEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.RefreshAttributesPanelEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.RefreshConditionsPanelEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.RefreshMetaDataPanelEvent; import org.drools.workbench.screens.guided.dtable.client.widget.table.lockmanager.GuidedDecisionTableLockManager; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.cell.GridWidgetCellFactory; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.cell.impl.GridWidgetCellFactoryImpl; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.BaseColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.GridWidgetColumnFactory; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ActionInsertFactColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ActionRetractFactColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ActionSetFieldColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ActionWorkItemColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ActionWorkItemInsertFactColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ActionWorkItemSetFieldColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.AttributeColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.BRLActionVariableColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.BRLConditionVariableColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.ConditionColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.DescriptionColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.GridWidgetColumnFactoryImpl; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.LimitedEntryColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.MetaDataColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.converters.column.impl.RowNumberColumnConverter; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.ModelSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.Synchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionInsertFactColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionRetractFactColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionSetFieldColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionWorkItemColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionWorkItemInsertFactColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ActionWorkItemSetFieldColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.AttributeColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.BRLActionColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.BRLConditionColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ConditionColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.LimitedEntryBRLActionColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.LimitedEntryBRLConditionColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.MetaDataColumnSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.ModelSynchronizerImpl; import org.drools.workbench.screens.guided.dtable.client.widget.table.model.synchronizers.impl.RowSynchronizer; import org.drools.workbench.screens.guided.dtable.client.widget.table.themes.GuidedDecisionTableRenderer; import org.drools.workbench.screens.guided.dtable.client.widget.table.utilities.EnumLoaderUtilities; import org.drools.workbench.screens.guided.dtable.model.GuidedDecisionTableEditorContent; import org.drools.workbench.screens.guided.dtable.service.GuidedDecisionTableLinkManager; import org.drools.workbench.screens.guided.dtable.shared.DefaultGuidedDecisionTableLinkManager; import org.guvnor.common.services.shared.metadata.model.Overview; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.ioc.client.container.SyncBeanManager; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.kie.workbench.common.services.datamodel.model.PackageDataModelOracleBaselinePayload; import org.kie.workbench.common.services.shared.enums.EnumDropdownService; import org.kie.workbench.common.services.shared.preferences.ApplicationPreferences; import org.kie.workbench.common.services.shared.rulename.RuleNamesService; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracleFactory; import org.mockito.Mock; import org.uberfire.backend.vfs.ObservablePath; import org.uberfire.backend.vfs.Path; import org.uberfire.ext.wires.core.grids.client.model.GridData; import org.uberfire.ext.wires.core.grids.client.widget.layer.impl.DefaultGridLayer; import org.uberfire.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.events.NotificationEvent; import static org.mockito.Mockito.*; public abstract class BaseGuidedDecisionTablePresenterTest { @Mock protected User identity; @Mock protected GuidedDTableResourceType resourceType; @Mock protected RuleNamesService ruleNameService; protected Caller<RuleNamesService> ruleNameServiceCaller; @Mock protected EnumDropdownService enumDropdownService; protected Caller<EnumDropdownService> enumDropdownServiceCaller; protected EnumLoaderUtilities enumLoaderUtilities; @Mock protected AsyncPackageDataModelOracleFactory oracleFactory; @Mock protected AsyncPackageDataModelOracle oracle; @Mock protected SyncBeanManager beanManager; @Mock protected ObservablePath dtPath; @Mock protected PlaceRequest dtPlaceRequest; @Mock protected GuidedDecisionTableModellerPresenter modellerPresenter; @Mock protected GuidedDecisionTableModellerView modellerView; @Mock protected GuidedDecisionTableLockManager lockManager; protected GuidedDecisionTableLinkManager linkManager; protected Event<DecisionTableSelectedEvent> decisionTableSelectedEvent = spy(new EventSourceMock<DecisionTableSelectedEvent>() { @Override public void fire(final DecisionTableSelectedEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<DecisionTableColumnSelectedEvent> decisionTableColumnSelectedEvent = spy(new EventSourceMock<DecisionTableColumnSelectedEvent>() { @Override public void fire(final DecisionTableColumnSelectedEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<DecisionTableSelectionsChangedEvent> decisionTableSelectionsChangedEvent = spy(new EventSourceMock<DecisionTableSelectionsChangedEvent>() { @Override public void fire(final DecisionTableSelectionsChangedEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<RefreshAttributesPanelEvent> refreshAttributesPanelEvent = spy(new EventSourceMock<RefreshAttributesPanelEvent>() { @Override public void fire(final RefreshAttributesPanelEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<RefreshMetaDataPanelEvent> refreshMetaDataPanelEvent = spy(new EventSourceMock<RefreshMetaDataPanelEvent>() { @Override public void fire(final RefreshMetaDataPanelEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<RefreshConditionsPanelEvent> refreshConditionsPanelEvent = spy(new EventSourceMock<RefreshConditionsPanelEvent>() { @Override public void fire(final RefreshConditionsPanelEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<RefreshActionsPanelEvent> refreshActionsPanelEvent = spy(new EventSourceMock<RefreshActionsPanelEvent>() { @Override public void fire(final RefreshActionsPanelEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected Event<NotificationEvent> notificationEvent = spy(new EventSourceMock<NotificationEvent>() { @Override public void fire(final NotificationEvent event) { //Do nothing. Default implementation throws an UnsupportedOperationException } }); protected GridWidgetCellFactory gridWidgetCellFactory = new GridWidgetCellFactoryImpl(); protected GridWidgetColumnFactory gridWidgetColumnFactory = new GridWidgetColumnFactoryImpl(); protected ModelSynchronizer synchronizer = spy(new ModelSynchronizerImpl() { @Override protected void fireAfterColumnInsertedEvent(final BaseColumn column) { //Do nothing; we're not testing V&V integration in these tests. } @Override protected void fireAfterColumnDeletedEvent(final int columnIndex) { //Do nothing; we're not testing V&V integration in these tests. } @Override protected void fireAppendRowEvent() { //Do nothing; we're not testing V&V integration in these tests. } @Override protected void fireDeleteRowEvent(final int rowIndex) { //Do nothing; we're not testing V&V integration in these tests. } @Override protected void fireInsertRowEvent(final int rowIndex) { //Do nothing; we're not testing V&V integration in these tests. } @Override protected void fireValidateEvent(final GridData.Range rowRange, final Set<Integer> columnRange) { //Do nothing; we're not testing V&V integration in these tests. } @Override protected void fireUpdateColumnDataEvent() { //Do nothing; we're not testing V&V integration in these tests. } }); protected Clipboard clipboard = spy(new DefaultClipboard()); @Mock protected GuidedDecisionTableRenderer renderer; @Mock protected GuidedDecisionTableView view; @Mock protected DefaultGridLayer gridLayer; @Mock private DecisionTableAnalyzerProvider decisionTableAnalyzerProvider; @Mock protected AnalyzerController analyzerController; protected GuidedDecisionTable52 model; protected GuidedDecisionTablePresenter dtPresenter; protected GuidedDecisionTableEditorContent dtContent; @Before public void setup() { setupPreferences(); setupServices(); setupProviders(); setupPresenter(); } private void setupProviders() { when(decisionTableAnalyzerProvider.newAnalyzer(eq(dtPlaceRequest), eq(oracle), any(GuidedDecisionTable52.class), any(EventBus.class))).thenReturn(analyzerController); } private void setupPreferences() { final Map<String, String> preferences = new HashMap<String, String>() {{ put(ApplicationPreferences.DATE_FORMAT, "dd/mm/yyyy"); }}; ApplicationPreferences.setUp(preferences); } private void setupServices() { ruleNameServiceCaller = new CallerMock<>(ruleNameService); enumDropdownServiceCaller = new CallerMock<>(enumDropdownService); enumLoaderUtilities = new EnumLoaderUtilities(enumDropdownServiceCaller); linkManager = spy(new DefaultGuidedDecisionTableLinkManager()); } private void setupPresenter() { final GuidedDecisionTablePresenter wrapped = new GuidedDecisionTablePresenter(identity, resourceType, ruleNameServiceCaller, decisionTableSelectedEvent, decisionTableColumnSelectedEvent, decisionTableSelectionsChangedEvent, refreshAttributesPanelEvent, refreshMetaDataPanelEvent, refreshConditionsPanelEvent, refreshActionsPanelEvent, notificationEvent, gridWidgetCellFactory, gridWidgetColumnFactory, oracleFactory, synchronizer, beanManager, lockManager, linkManager, clipboard, decisionTableAnalyzerProvider, enumLoaderUtilities) { @Override void initialiseLockManager() { //Do nothing for tests } @Override GuidedDecisionTableRenderer makeViewRenderer() { return renderer; } @Override GuidedDecisionTableView makeView(final Set<PortableWorkDefinition> workItemDefinitions) { return view; } @Override void initialiseAuditLog() { //Do nothing for tests } @Override List<BaseColumnConverter> getConverters() { final List<BaseColumnConverter> converters = new ArrayList<BaseColumnConverter>(); converters.add(new ActionInsertFactColumnConverter()); converters.add(new ActionRetractFactColumnConverter()); converters.add(new ActionSetFieldColumnConverter()); converters.add(new ActionWorkItemColumnConverter()); converters.add(new ActionWorkItemInsertFactColumnConverter()); converters.add(new ActionWorkItemSetFieldColumnConverter()); converters.add(new AttributeColumnConverter()); converters.add(new BRLActionVariableColumnConverter()); converters.add(new BRLConditionVariableColumnConverter()); converters.add(new ConditionColumnConverter()); converters.add(new DescriptionColumnConverter()); converters.add(new LimitedEntryColumnConverter()); converters.add(new MetaDataColumnConverter()); converters.add(new RowNumberColumnConverter()); return converters; } @Override List<Synchronizer<? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData>> getSynchronizers() { final List<Synchronizer<? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData, ? extends Synchronizer.MetaData>> synchronizers = new ArrayList<>(); synchronizers.add(new ActionColumnSynchronizer()); synchronizers.add(new ActionInsertFactColumnSynchronizer()); synchronizers.add(new ActionRetractFactColumnSynchronizer()); synchronizers.add(new ActionSetFieldColumnSynchronizer()); synchronizers.add(new ActionWorkItemColumnSynchronizer()); synchronizers.add(new ActionWorkItemInsertFactColumnSynchronizer()); synchronizers.add(new ActionWorkItemSetFieldColumnSynchronizer()); synchronizers.add(new AttributeColumnSynchronizer()); synchronizers.add(new BRLActionColumnSynchronizer()); synchronizers.add(new BRLConditionColumnSynchronizer()); synchronizers.add(new ConditionColumnSynchronizer()); synchronizers.add(new LimitedEntryBRLActionColumnSynchronizer()); synchronizers.add(new LimitedEntryBRLConditionColumnSynchronizer()); synchronizers.add(new MetaDataColumnSynchronizer()); synchronizers.add(new RowSynchronizer()); return synchronizers; } }; dtPresenter = spy(wrapped); model = new GuidedDecisionTable52(); final PackageDataModelOracleBaselinePayload dmoBaseline = mock(PackageDataModelOracleBaselinePayload.class); final Set<PortableWorkDefinition> workItemDefinitions = Collections.emptySet(); final Overview overview = mock(Overview.class); dtContent = new GuidedDecisionTableEditorContent(model, workItemDefinitions, overview, dmoBaseline); when(oracleFactory.makeAsyncPackageDataModelOracle(any(Path.class), any(GuidedDecisionTable52.class), eq(dmoBaseline))).thenReturn(oracle); when(view.getLayer()).thenReturn(gridLayer); when(modellerPresenter.getView()).thenReturn(modellerView); when(modellerView.getGridLayerView()).thenReturn(gridLayer); when(dtPresenter.getModellerPresenter()).thenReturn(modellerPresenter); dtPresenter.setContent(dtPath, dtPlaceRequest, dtContent, modellerPresenter, false); } }