package org.dashbuilder.client.widgets.dataset.editor.column;
import com.google.gwt.editor.client.CompositeEditor;
import com.google.gwt.editor.client.EditorDelegate;
import com.google.gwt.editor.client.adapters.ListEditor;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.dashbuilder.client.widgets.dataset.editor.driver.DataColumnDefDriver;
import org.dashbuilder.client.widgets.dataset.event.ColumnsChangedEvent;
import org.dashbuilder.common.client.editor.ValueBoxEditor;
import org.dashbuilder.dataprovider.DataSetProviderType;
import org.dashbuilder.dataset.ColumnType;
import org.dashbuilder.dataset.def.DataColumnDef;
import org.jboss.errai.ioc.client.container.SyncBeanDef;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.uberfire.mocks.EventSourceMock;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class ColumnListEditorTest {
@Mock SyncBeanManager beanManager;
@Mock DataColumnDefDriver dataColumnDefDriver;
@Mock EventSourceMock<ColumnsChangedEvent> columnsChangedEvent;
@Mock ColumnListEditor.View view;
@Mock SyncBeanDef<DataColumnDefEditor> columnDefEditorSyncBeanDef;
@Mock DataColumnDefEditor dataColumnDefEditor;
private ColumnListEditor presenter;
final ListEditor<DataColumnDef, org.dashbuilder.dataset.client.editor.DataColumnDefEditor> listEditor = mock(ListEditor.class);
@Mock DataColumnDef col1;
@Before
public void setup() {
presenter = new ColumnListEditor(beanManager, dataColumnDefDriver, columnsChangedEvent, view);
// Bean instantiation mocks.
when(beanManager.lookupBean(DataColumnDefEditor.class)).thenReturn(columnDefEditorSyncBeanDef);
when( columnDefEditorSyncBeanDef.newInstance() ).thenAnswer( new Answer<DataColumnDefEditor>() {
@Override
public DataColumnDefEditor answer( InvocationOnMock invocationOnMock ) throws Throwable {
return dataColumnDefEditor;
}
} );
// Acceptable values.
when(col1.getId()).thenReturn("col1");
when(col1.getColumnType()).thenReturn(ColumnType.LABEL);
final List<DataColumnDef> acceptableValues = buildAcceptableValues();
presenter.acceptableColumns = acceptableValues;
// Column Editors.
final ValueBoxEditor<String> id = mock(ValueBoxEditor.class);
when(id.getValue()).thenReturn("col1");
when(dataColumnDefEditor.id()).thenReturn(id);
final List<org.dashbuilder.dataset.client.editor.DataColumnDefEditor> editors = new ArrayList<org.dashbuilder.dataset.client.editor.DataColumnDefEditor>();
final List<DataColumnDef> columns = new ArrayList<DataColumnDef>();
columns.add(col1);
editors.add(dataColumnDefEditor);
when(listEditor.getEditors()).thenReturn(editors);
when(listEditor.getList()).thenReturn(columns);
presenter.listEditor = listEditor;
}
@Test
public void testInit() {
presenter.init();
assertNotNull(presenter.listEditor);
verify(view, times(1)).init(presenter);
verify(view, times(0)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(0)).remove(anyInt());
verify(view, times(0)).clear();
}
@Test
public void testClear() {
presenter.clear();
assertNull(presenter.acceptableColumns);
verify(view, times(1)).clear();
verify(view, times(0)).init(presenter);
verify(view, times(0)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(0)).remove(anyInt());
}
@Test
public void testSetAcceptableValues() {
final List<DataColumnDef> acceptableValues = buildAcceptableValues();
presenter.setAcceptableValues(acceptableValues);
verify(dataColumnDefEditor, times(1)).isEditMode(false);
verify(dataColumnDefDriver, times(1)).initialize(dataColumnDefEditor);
verify(dataColumnDefDriver, times(1)).edit(col1);
verify(view, times(1)).clear();
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(0)).init(presenter);
verify(view, times(0)).remove(anyInt());
}
@Test
public void testOnValueRestricted() {
final String value = "col1";
presenter.restrictedColumns.clear();
presenter.onValueRestricted(value);
assertEquals(1, presenter.restrictedColumns.size());
assertEquals("col1", presenter.restrictedColumns.get(0));
verify(dataColumnDefEditor, times(1)).isEditMode(false);
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(1)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* Column editor editMode set to false, as only one column present in the dset definition, so it cannot be unselected.
*/
@Test
public void testOnValueUnRestrictedSingleColumn() {
final String value = "col1";
presenter.restrictedColumns.add("col1");
presenter.onValueUnRestricted(value);
assertTrue(presenter.restrictedColumns.isEmpty());
verify(dataColumnDefEditor, times(1)).isEditMode(false);
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(1)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* Column editor editMode set to true, as more than one column present in the dset definition, so it can be selected/unselected.
*/
@Test
public void testOnValueUnRestricted() {
final String value = "col1";
presenter.restrictedColumns.add("col1");
final DataColumnDef col2 = mock(DataColumnDef.class);
when(col2.getId()).thenReturn("col2");
when(col2.getColumnType()).thenReturn(ColumnType.LABEL);
presenter.listEditor.getList().add(col2);
presenter.onValueUnRestricted(value);
assertTrue(presenter.restrictedColumns.isEmpty());
verify(dataColumnDefEditor, times(1)).isEditMode(true);
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(1)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
@Test
public void testCreateEditorForTraversal() {
presenter.createEditorForTraversal();
verify(listEditor, times(1)).createEditorForTraversal();
verify(listEditor, times(0)).getPathElement(any(DataColumnDefEditor.class));
verify(listEditor, times(0)).setEditorChain(any(CompositeEditor.EditorChain.class));
verify(listEditor, times(0)).setDelegate(any(EditorDelegate.class));
verify(listEditor, times(0)).flush();
verify(listEditor, times(0)).onPropertyChange(anyString());
verify(listEditor, times(0)).setValue(any(List.class));
}
@Test
public void testGetPathElement() {
presenter.getPathElement(dataColumnDefEditor);
verify(listEditor, times(1)).getPathElement(dataColumnDefEditor);
verify(listEditor, times(0)).createEditorForTraversal();
verify(listEditor, times(0)).setEditorChain(any(CompositeEditor.EditorChain.class));
verify(listEditor, times(0)).setDelegate(any(EditorDelegate.class));
verify(listEditor, times(0)).flush();
verify(listEditor, times(0)).onPropertyChange(anyString());
verify(listEditor, times(0)).setValue(any(List.class));
}
@Test
public void testSetEditorChain() {
final CompositeEditor.EditorChain<DataColumnDef, org.dashbuilder.dataset.client.editor.DataColumnDefEditor> chain = mock(CompositeEditor.EditorChain.class);
presenter.setEditorChain(chain);
verify(listEditor, times(1)).setEditorChain(chain);
verify(listEditor, times(0)).createEditorForTraversal();
verify(listEditor, times(0)).getPathElement(any(DataColumnDefEditor.class));
verify(listEditor, times(0)).setDelegate(any(EditorDelegate.class));
verify(listEditor, times(0)).flush();
verify(listEditor, times(0)).onPropertyChange(anyString());
verify(listEditor, times(0)).setValue(any(List.class));
}
@Test
public void testSetDelegate() {
final EditorDelegate<List<DataColumnDef>> delegate = mock(EditorDelegate.class);
presenter.setDelegate(delegate);
verify(listEditor, times(1)).setDelegate(delegate);
verify(listEditor, times(0)).createEditorForTraversal();
verify(listEditor, times(0)).getPathElement(any(DataColumnDefEditor.class));
verify(listEditor, times(0)).setEditorChain(any(CompositeEditor.EditorChain.class));
verify(listEditor, times(0)).flush();
verify(listEditor, times(0)).onPropertyChange(anyString());
verify(listEditor, times(0)).setValue(any(List.class));
}
@Test
public void testFlush() {
presenter.flush();
verify(listEditor, times(1)).flush();
verify(listEditor, times(0)).createEditorForTraversal();
verify(listEditor, times(0)).getPathElement(any(DataColumnDefEditor.class));
verify(listEditor, times(0)).setEditorChain(any(CompositeEditor.EditorChain.class));
verify(listEditor, times(0)).setDelegate(any(EditorDelegate.class));
verify(listEditor, times(0)).onPropertyChange(anyString());
verify(listEditor, times(0)).setValue(any(List.class));
}
@Test
public void testOnPropertyChange() {
final String s = "prop1";
presenter.onPropertyChange(s);
verify(listEditor, times(1)).onPropertyChange(s);
verify(listEditor, times(0)).createEditorForTraversal();
verify(listEditor, times(0)).getPathElement(any(DataColumnDefEditor.class));
verify(listEditor, times(0)).setEditorChain(any(CompositeEditor.EditorChain.class));
verify(listEditor, times(0)).setDelegate(any(EditorDelegate.class));
verify(listEditor, times(0)).flush();
verify(listEditor, times(0)).setValue(any(List.class));
}
@Test
public void testSetValue() {
final List<DataColumnDef> value = mock(List.class);
presenter.setValue(value);
verify(listEditor, times(1)).setValue(value);
verify(listEditor, times(0)).createEditorForTraversal();
verify(listEditor, times(0)).getPathElement(any(DataColumnDefEditor.class));
verify(listEditor, times(0)).setEditorChain(any(CompositeEditor.EditorChain.class));
verify(listEditor, times(0)).setDelegate(any(EditorDelegate.class));
verify(listEditor, times(0)).flush();
verify(listEditor, times(0)).onPropertyChange(anyString());
}
@Test
public void testSetProviderType() {
DataSetProviderType type = mock(DataSetProviderType.class);
presenter.setProviderType(type);
assertEquals(type, presenter.providerType);
}
@Test
public void testOnColumnSelected() {
listEditor.getList().clear();
when(col1.clone()).thenReturn(col1);
presenter.onColumnSelect(0, true);
assertEquals(1, listEditor.getList().size());
assertEquals(col1, listEditor.getList().get(0));
verify(columnsChangedEvent, times(1)).fire(any(ColumnsChangedEvent.class));
}
@Test
public void testOnColumnUnSelected() {
when(col1.clone()).thenReturn(col1);
presenter.onColumnSelect(0, false);
assertTrue(listEditor.getList().isEmpty());
verify(columnsChangedEvent, times(1)).fire(any(ColumnsChangedEvent.class));
}
/**
* Column editor created with editMode set to false, as only one column present in the dset definition, so it cannot be unselected.
*/
@Test
public void testDataColumnDefEditorSource_Create() {
ColumnListEditor.DataColumnDefEditorSource source = presenter.createDataColumnDefEditorSource();
org.dashbuilder.dataset.client.editor.DataColumnDefEditor e = source.create(0);
verify(dataColumnDefEditor, times(2)).isEditMode(false);
verify(dataColumnDefEditor, times(1)).setProviderType(any(DataSetProviderType.class));
verify(dataColumnDefEditor, times(1)).setOriginalColumnType(any(ColumnType.class));
verify(view, times(2)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(2)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* Column editor created with editMode set to true, as more than one column present in the dset definition. First column enabled too, as it was disabled as was the unique one before this creation.
*/
@Test
public void testDataColumnDefEditorSource_CreateMultiple() {
final DataColumnDef col2 = mock(DataColumnDef.class);
when(col2.getId()).thenReturn("col2");
when(col2.getColumnType()).thenReturn(ColumnType.LABEL);
presenter.acceptableColumns.add(col2);
presenter.listEditor.getList().add(col2);
presenter.restrictedColumns.clear();
ColumnListEditor.DataColumnDefEditorSource source = presenter.createDataColumnDefEditorSource();
org.dashbuilder.dataset.client.editor.DataColumnDefEditor e = source.create(0);
verify(dataColumnDefEditor, times(2)).isEditMode(true);
verify(dataColumnDefEditor, times(1)).setOriginalColumnType(any(ColumnType.class));
verify(dataColumnDefEditor, times(1)).setProviderType(any(DataSetProviderType.class));
verify(view, times(2)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(2)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* See https://issues.jboss.org/browse/DASHBUILDE-79
*/
@Test
public void testDataColumnDefEditorSource_Create_DASHBUILDE79_A() {
final DataColumnDef col2 = mock(DataColumnDef.class);
when(col2.getId()).thenReturn("col2");
when(col2.getColumnType()).thenReturn(ColumnType.LABEL);
presenter.acceptableColumns.add(col2);
presenter.listEditor.getList().add(col2);
presenter.listEditor.getEditors().clear();
presenter.restrictedColumns.clear();
ColumnListEditor.DataColumnDefEditorSource source = presenter.createDataColumnDefEditorSource();
org.dashbuilder.dataset.client.editor.DataColumnDefEditor e = source.create(0);
verify(dataColumnDefEditor, times(1)).isEditMode(true);
verify(dataColumnDefEditor, times(1)).setOriginalColumnType(any(ColumnType.class));
verify(dataColumnDefEditor, times(1)).setProviderType(any(DataSetProviderType.class));
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(1)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* See https://issues.jboss.org/browse/DASHBUILDE-79 (re-opened)
*/
@Test
public void testDataColumnDefEditorSource_Create_DASHBUILDE79_B() {
final DataColumnDef col2 = mock(DataColumnDef.class);
when(col2.getId()).thenReturn("col2");
when(col2.getColumnType()).thenReturn(ColumnType.LABEL);
presenter.acceptableColumns.add(col2);
presenter.listEditor.getList().clear();
presenter.listEditor.getList().add(col2);
presenter.listEditor.getEditors().clear();
presenter.restrictedColumns.clear();
ColumnListEditor.DataColumnDefEditorSource source = presenter.createDataColumnDefEditorSource();
org.dashbuilder.dataset.client.editor.DataColumnDefEditor e = source.create(0);
verify(dataColumnDefEditor, times(1)).isEditMode(false);
verify(dataColumnDefEditor, times(1)).setOriginalColumnType(any(ColumnType.class));
verify(dataColumnDefEditor, times(1)).setProviderType(any(DataSetProviderType.class));
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(1)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* Ensure create a dummy not editable column when disposing the only one present from the definition.
*/
@Test
public void testDataColumnDefEditorSource_Dispose() {
ColumnListEditor.DataColumnDefEditorSource source = presenter.createDataColumnDefEditorSource();
source.dispose(dataColumnDefEditor);
verify(dataColumnDefEditor, times(1)).removeFromParent();
verify(dataColumnDefEditor, times(3)).isEditMode(false);
verify(dataColumnDefDriver, times(1)).initialize(dataColumnDefEditor);
verify(dataColumnDefDriver, times(1)).edit(col1);
verify(view, times(2)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(2)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
/**
* Ensure create a dummy not editable column when disposing the only one present from the definition and ensure first column is set to editMode=false, as will be the only one column in the definition.
*/
@Test
public void testDataColumnDefEditorSource_Dispose_UniqueColumn() {
final DataColumnDef col2 = mock(DataColumnDef.class);
when(col2.getId()).thenReturn("col2");
when(col2.getColumnType()).thenReturn(ColumnType.LABEL);
final DataColumnDefEditor col2Editor = mock(DataColumnDefEditor.class);
final ValueBoxEditor<String> id2 = mock(ValueBoxEditor.class);
when(id2.getValue()).thenReturn("col2");
when(col2Editor.id()).thenReturn(id2);
presenter.acceptableColumns.add(col2);
presenter.listEditor.getList().add(col2);
presenter.listEditor.getEditors().add(col2Editor);
when( columnDefEditorSyncBeanDef.newInstance() ).thenAnswer( new Answer<DataColumnDefEditor>() {
@Override
public DataColumnDefEditor answer( InvocationOnMock invocationOnMock ) throws Throwable {
return col2Editor;
}
} );
ColumnListEditor.DataColumnDefEditorSource source = presenter.createDataColumnDefEditorSource();
source.dispose(col2Editor);
verify(dataColumnDefEditor, times(0)).removeFromParent();
verify(dataColumnDefEditor, times(0)).isEditMode(false);
verify(col2Editor, times(1)).removeFromParent();
verify(col2Editor, times(2)).isEditMode(false);
verify(dataColumnDefDriver, times(1)).initialize(col2Editor);
verify(dataColumnDefDriver, times(1)).edit(col2);
verify(view, times(1)).insert(anyInt(), any(DataColumnDefEditor.View.class), anyBoolean(), anyBoolean(), anyString());
verify(view, times(1)).remove(anyInt());
verify(view, times(0)).init(presenter);
verify(view, times(0)).clear();
}
protected List<DataColumnDef> buildAcceptableValues() {
final List<DataColumnDef> acceptableValues = new ArrayList<DataColumnDef>();
acceptableValues.add(col1);
return acceptableValues;
}
}