/*
* 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.drools.workbench.screens.guided.dtable.client.wizard.column.plugins;
import java.util.List;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.drools.workbench.models.datamodel.oracle.DataType;
import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint;
import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.DTCellValue52;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.models.guided.dtable.shared.model.Pattern52;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableErraiConstants;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.NewGuidedDecisionTableColumnWizard;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.AdditionalInfoPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.CalculationTypePage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.FieldPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.OperatorPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.PatternPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.ValueOptionsPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.PatternWrapper;
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.widgets.client.datamodel.AsyncPackageDataModelOracle;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.uberfire.ext.widgets.core.client.wizards.WizardPage;
import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent;
import org.uberfire.mocks.EventSourceMock;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class ConditionColumnPluginTest {
@Mock
private PatternPage<ConditionColumnPlugin> patternPage;
@Mock
private CalculationTypePage calculationTypePage;
@Mock
private FieldPage fieldPage;
@Mock
private OperatorPage operatorPage;
@Mock
private AdditionalInfoPage<ConditionColumnPlugin> additionalInfoPage;
@Mock
private ValueOptionsPage valueOptionsPage;
@Mock
private GuidedDecisionTableView.Presenter presenter;
@Mock
private TranslationService translationService;
@Mock
private EventSourceMock<WizardPageStatusChangeEvent> changeEvent;
@Mock
private ConditionCol52 editingCol;
@Mock
private GuidedDecisionTable52 model;
@Mock
private AsyncPackageDataModelOracle oracle;
@Mock
private NewGuidedDecisionTableColumnWizard wizard;
@InjectMocks
private ConditionColumnPlugin plugin = spy(new ConditionColumnPlugin(patternPage,
calculationTypePage,
fieldPage,
operatorPage,
valueOptionsPage,
additionalInfoPage,
changeEvent,
translationService));
@Before
public void setup() {
final GuidedDecisionTable52.TableFormat tableFormat = GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY;
doReturn(tableFormat).when(model).getTableFormat();
doReturn(model).when(presenter).getModel();
}
@Test
public void testGetPagesWhenItIsAnExtendedEntryTable() throws Exception {
doReturn(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY).when(model).getTableFormat();
final List<WizardPage> pages = plugin.getPages();
assertTrue(pages.stream().anyMatch(a -> a instanceof CalculationTypePage));
assertEquals(6,
pages.size());
}
@Test
public void testGetPagesWhenItIsALimitedEntryTable() throws Exception {
doReturn(GuidedDecisionTable52.TableFormat.LIMITED_ENTRY).when(model).getTableFormat();
final List<WizardPage> pages = plugin.getPages();
assertFalse(pages.stream().anyMatch(a -> a instanceof CalculationTypePage));
assertEquals(5,
pages.size());
}
@Test
public void testIsValidWhenHeaderIsBlank() throws Exception {
final String errorKey = GuidedDecisionTableErraiConstants.ConditionColumnPlugin_YouMustEnterAColumnHeaderValueDescription;
final String errorMessage = "YouMustEnterAColumnHeaderValueDescription";
doReturn("").when(editingCol).getHeader();
doReturn(editingCol).when(plugin).editingCol();
doReturn(errorMessage).when(translationService).format(errorKey);
final boolean isValid = plugin.isValid();
assertFalse(isValid);
verify(plugin).showError(eq(errorMessage));
}
@Test
public void testIsValidWhenConstraintValueIsNotPredicateAndFactFieldIsBlank() throws Exception {
final String errorKey = GuidedDecisionTableErraiConstants.ConditionColumnPlugin_PleaseSelectOrEnterField;
final String errorMessage = "PleaseSelectOrEnterField";
doReturn("Header").when(editingCol).getHeader();
doReturn("").when(editingCol).getFactField();
doReturn(editingCol).when(plugin).editingCol();
doReturn(BaseSingleFieldConstraint.TYPE_LITERAL).when(plugin).constraintValue();
doReturn(errorMessage).when(translationService).format(errorKey);
final boolean isValid = plugin.isValid();
assertFalse(isValid);
verify(plugin).showError(eq(errorMessage));
}
@Test
public void testIsValidWhenConstraintValueIsNotPredicateAndOperatorIsBlank() throws Exception {
final String errorKey = GuidedDecisionTableErraiConstants.ConditionColumnPlugin_NotifyNoSelectedOperator;
final String errorMessage = "NotifyNoSelectedOperator";
doReturn("Header").when(editingCol).getHeader();
doReturn("FactField").when(editingCol).getFactField();
doReturn("").when(editingCol).getOperator();
doReturn(editingCol).when(plugin).editingCol();
doReturn(BaseSingleFieldConstraint.TYPE_LITERAL).when(plugin).constraintValue();
doReturn(errorMessage).when(translationService).format(errorKey);
final boolean isValid = plugin.isValid();
assertFalse(isValid);
verify(plugin).showError(eq(errorMessage));
}
@Test
public void testIsValidWhenBindingIsNotUnique() throws Exception {
final String errorKey = GuidedDecisionTableErraiConstants.ConditionColumnPlugin_PleaseEnterANameThatIsNotAlreadyUsedByAnotherPattern;
final String errorMessage = "PleaseEnterANameThatIsNotAlreadyUsedByAnotherPattern";
doReturn("Header").when(editingCol).getHeader();
doReturn("FactField").when(editingCol).getFactField();
doReturn("Operator").when(editingCol).getOperator();
doReturn("Binding").when(editingCol).getBinding();
doReturn(true).when(plugin).isBindingNotUnique();
doReturn(true).when(editingCol).isBound();
doReturn(editingCol).when(plugin).editingCol();
doReturn(BaseSingleFieldConstraint.TYPE_LITERAL).when(plugin).constraintValue();
doReturn(errorMessage).when(translationService).format(errorKey);
final boolean isValid = plugin.isValid();
assertFalse(isValid);
verify(plugin).showError(eq(errorMessage));
}
@Test
public void testIsValidWhenHeaderIsNotUnique() throws Exception {
final String errorKey = GuidedDecisionTableErraiConstants.ConditionColumnPlugin_ThatColumnNameIsAlreadyInUsePleasePickAnother;
final String errorMessage = "ThatColumnNameIsAlreadyInUsePleasePickAnother";
doReturn("Header").when(editingCol).getHeader();
doReturn("FactField").when(editingCol).getFactField();
doReturn("Operator").when(editingCol).getOperator();
doReturn("Binding").when(editingCol).getBinding();
doReturn(false).when(plugin).isBindingNotUnique();
doReturn(true).when(plugin).isHeaderNotUnique();
doReturn(editingCol).when(plugin).editingCol();
doReturn(BaseSingleFieldConstraint.TYPE_LITERAL).when(plugin).constraintValue();
doReturn(errorMessage).when(translationService).format(errorKey);
final boolean isValid = plugin.isValid();
assertFalse(isValid);
verify(plugin).showError(eq(errorMessage));
}
@Test
public void testIsValidWhenItIsValid() throws Exception {
doReturn("Header").when(editingCol).getHeader();
doReturn("FactField").when(editingCol).getFactField();
doReturn("Operator").when(editingCol).getOperator();
doReturn("Binding").when(editingCol).getBinding();
doReturn(false).when(plugin).isBindingNotUnique();
doReturn(false).when(plugin).isHeaderNotUnique();
doReturn(editingCol).when(plugin).editingCol();
doReturn(BaseSingleFieldConstraint.TYPE_LITERAL).when(plugin).constraintValue();
final boolean isValid = plugin.isValid();
assertTrue(isValid);
verify(plugin,
never()).showError(any());
}
@Test
public void testPrepareValuesWhenConstraintValueIsPredicate() throws Exception {
doReturn(editingCol).when(plugin).editingCol();
doReturn(BaseSingleFieldConstraint.TYPE_PREDICATE).when(plugin).constraintValue();
plugin.prepareValues();
verify(editingCol).setOperator(null);
}
@Test
public void testPrepareValuesWhenConstraintValueIsNotLiteral() throws Exception {
doReturn(BaseSingleFieldConstraint.TYPE_UNDEFINED).when(plugin).constraintValue();
doReturn(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY).when(model).getTableFormat();
doReturn(model).when(presenter).getModel();
doReturn(editingCol).when(plugin).editingCol();
plugin.prepareValues();
verify(editingCol).setBinding(null);
}
@Test
public void testAppendColumn() throws Exception {
final PatternWrapper patternWrapper = mock(PatternWrapper.class);
final Pattern52 pattern52 = mock(Pattern52.class);
doReturn(editingCol).when(plugin).editingCol();
doReturn(patternWrapper).when(plugin).patternWrapper();
doReturn(pattern52).when(plugin).editingPattern();
plugin.appendColumn();
verify(presenter).appendColumn(pattern52,
editingCol);
}
@Test
public void testGenerateColumnWhenItIsValid() throws Exception {
doReturn(BaseSingleFieldConstraint.TYPE_UNDEFINED).when(plugin).constraintValue();
doReturn(true).when(plugin).isValid();
plugin.setupDefaultValues();
final Boolean result = plugin.generateColumn();
assertTrue(result);
verify(plugin).prepareValues();
verify(plugin).appendColumn();
}
@Test
public void testGenerateColumnWhenItIsNotValid() throws Exception {
doReturn(BaseSingleFieldConstraint.TYPE_UNDEFINED).when(plugin).constraintValue();
doReturn(false).when(plugin).isValid();
final Boolean result = plugin.generateColumn();
assertFalse(result);
verify(plugin,
never()).prepareValues();
verify(plugin,
never()).appendColumn();
}
@Test
public void testGetEditingPattern() throws Exception {
final PatternWrapper patternWrapper = mock(PatternWrapper.class);
plugin.setEditingPattern(patternWrapper);
verify(plugin).setupDefaultValues();
verify(plugin).fireChangeEvent(patternPage);
verify(plugin).fireChangeEvent(calculationTypePage);
verify(plugin).fireChangeEvent(fieldPage);
verify(plugin).fireChangeEvent(operatorPage);
verify(plugin).fireChangeEvent(valueOptionsPage);
verify(plugin).fireChangeEvent(additionalInfoPage);
}
@Test
public void testGetEntryPointNameWheeunEditingPatternIsNotPresent() throws Exception {
final PatternWrapper patternWrapper = new PatternWrapper();
doReturn(patternWrapper).when(plugin).patternWrapper();
final String entryPointName = plugin.getEntryPointName();
assertEquals("",
entryPointName);
}
@Test
public void testGetEntryPointNameWhenEditingPatternIsNotNull() throws Exception {
final PatternWrapper pattern = mock(PatternWrapper.class);
doReturn("EntryPointName").when(pattern).getEntryPointName();
doReturn(pattern).when(plugin).patternWrapper();
final String entryPointName = plugin.getEntryPointName();
assertEquals("EntryPointName",
entryPointName);
}
@Test
public void testSetEntryPointName() throws Exception {
final PatternWrapper pattern = mock(PatternWrapper.class);
doReturn(pattern).when(plugin).patternWrapper();
plugin.setEntryPointName("EntryPointName");
verify(pattern).setEntryPointName("EntryPointName");
}
@Test
public void testEditingColWhenEditingPatternIsNull() throws Exception {
final PatternWrapper pattern = mock(PatternWrapper.class);
doReturn("").when(pattern).getFactType();
doReturn(pattern).when(plugin).patternWrapper();
plugin.editingCol();
verify(plugin).resetFieldAndOperator();
}
@Test
public void testEditingColWhenEditingPatternIsNotNull() throws Exception {
final PatternWrapper pattern = mock(PatternWrapper.class);
doReturn("factType").when(pattern).getFactType();
doReturn(pattern).when(plugin).patternWrapper();
plugin.editingCol();
verify(plugin,
never()).resetFieldAndOperator();
}
@Test
public void testSetHeader() throws Exception {
final String header = "Header";
doReturn(editingCol).when(plugin).editingCol();
plugin.setHeader(header);
verify(editingCol).setHeader(header);
verify(plugin).fireChangeEvent(additionalInfoPage);
}
@Test
public void testGetFactType() throws Exception {
final PatternWrapper pattern = mock(PatternWrapper.class);
final String expectedFactType = "FactType";
doReturn(expectedFactType).when(pattern).getFactType();
doReturn(pattern).when(plugin).patternWrapper();
final String factType = plugin.getFactType();
assertEquals(expectedFactType,
factType);
}
@Test
public void testGetFactField() throws Exception {
final String expectedFactField = "FactField";
doReturn(expectedFactField).when(editingCol).getFactField();
final String factField = plugin.getFactField();
assertEquals(expectedFactField,
factField);
}
@Test
public void testSetFactField() throws Exception {
final PatternWrapper pattern = mock(PatternWrapper.class);
doReturn("FactField").when(editingCol).getFactField();
doReturn(editingCol).when(plugin).editingCol();
doReturn("FactType").when(pattern).getFactType();
doReturn(pattern).when(plugin).patternWrapper();
doReturn(oracle).when(presenter).getDataModelOracle();
plugin.setFactField("FactField");
verify(editingCol).setFactField("FactField");
verify(editingCol).setFieldType(oracle.getFieldType("FactField",
"FactType"));
verify(plugin).fireChangeEvent(fieldPage);
verify(plugin).fireChangeEvent(operatorPage);
verify(plugin).fireChangeEvent(additionalInfoPage);
verify(plugin).fireChangeEvent(valueOptionsPage);
}
@Test
public void testSetOperator() throws Exception {
doReturn(editingCol).when(plugin).editingCol();
plugin.setOperator("operator");
verify(editingCol).setOperator("operator");
verify(plugin).fireChangeEvent(operatorPage);
verify(plugin).fireChangeEvent(additionalInfoPage);
verify(plugin).fireChangeEvent(valueOptionsPage);
}
@Test
public void testConstraintValueWhenItHasEnums() throws Exception {
doReturn(oracle).when(presenter).getDataModelOracle();
doReturn(true).when(oracle).hasEnums(anyString(),
anyString());
final int constraintValue = plugin.constraintValue();
verify(plugin).setConstraintValueFieldAndUpdateEditingCol(BaseSingleFieldConstraint.TYPE_LITERAL);
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
constraintValue);
}
@Test
public void testConstraintValueWhenItDoesNotHaveEnums() throws Exception {
doReturn(oracle).when(presenter).getDataModelOracle();
doReturn(false).when(oracle).hasEnums(anyString(),
anyString());
final int constraintValue = plugin.constraintValue();
verify(plugin,
never()).setConstraintValueFieldAndUpdateEditingCol(BaseSingleFieldConstraint.TYPE_LITERAL);
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
constraintValue);
}
@Test
public void testSetConstraintValue() throws Exception {
final int constraintValue = BaseSingleFieldConstraint.TYPE_LITERAL;
doReturn(editingCol).when(plugin).editingCol();
plugin.setConstraintValue(constraintValue);
verify(editingCol).setConstraintValueType(constraintValue);
verify(plugin).setConstraintValueFieldAndUpdateEditingCol(constraintValue);
verify(plugin).resetFieldAndOperator();
verify(plugin).fireChangeEvent(calculationTypePage);
verify(plugin).fireChangeEvent(fieldPage);
verify(plugin).fireChangeEvent(operatorPage);
}
@Test
public void testSetValueOptionsPageAsCompletedWhenItIsCompleted() throws Exception {
doReturn(true).when(plugin).isValueOptionsPageCompleted();
plugin.setValueOptionsPageAsCompleted();
verify(plugin,
never()).setValueOptionsPageCompleted();
verify(plugin,
never()).fireChangeEvent(valueOptionsPage);
}
@Test
public void testSetValueOptionsPageAsCompletedWhenItIsNotCompleted() throws Exception {
doReturn(false).when(plugin).isValueOptionsPageCompleted();
plugin.setValueOptionsPageAsCompleted();
verify(plugin).setValueOptionsPageCompleted();
verify(plugin).fireChangeEvent(valueOptionsPage);
}
@Test
public void testSetValueList() throws Exception {
final String valueList = "valueList";
final DTCellValue52 cellValue52 = mock(DTCellValue52.class);
final PatternWrapper pattern = mock(PatternWrapper.class);
final DataType.DataTypes dataTypes = DataType.DataTypes.STRING;
plugin.setupDefaultValues();
doReturn("FactType").when(pattern).getFactType();
doReturn(dataTypes).when(cellValue52).getDataType();
doReturn(cellValue52).when(editingCol).getDefaultValue();
doReturn(editingCol).when(plugin).editingCol();
doReturn(pattern).when(plugin).patternWrapper();
doReturn(oracle).when(presenter).getDataModelOracle();
plugin.setValueList(valueList);
verify(editingCol).setValueList(valueList);
verify(plugin).assertDefaultValue();
verify(plugin).fireChangeEvent(valueOptionsPage);
}
@Test
public void testGetTitle() {
final String errorKey = GuidedDecisionTableErraiConstants.ConditionColumnPlugin_AddNewConditionSimpleColumn;
final String errorMessage = "Title";
when(translationService.format(errorKey)).thenReturn(errorMessage);
final String title = plugin.getTitle();
assertEquals(errorMessage,
title);
}
@Test
public void testInit() {
doReturn(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY).when(model).getTableFormat();
doReturn(model).when(plugin).model();
plugin.init(wizard);
verify(plugin).setupDefaultValues();
}
}