package org.dashbuilder.client.widgets.dataset.editor;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.dashbuilder.client.widgets.common.LoadingBox;
import org.dashbuilder.client.widgets.dataset.editor.attributes.*;
import org.dashbuilder.client.widgets.dataset.event.ColumnsChangedEvent;
import org.dashbuilder.client.widgets.dataset.event.ErrorEvent;
import org.dashbuilder.client.widgets.dataset.event.FilterChangedEvent;
import org.dashbuilder.client.widgets.dataset.event.TabChangedEvent;
import org.dashbuilder.common.client.error.ClientRuntimeError;
import org.dashbuilder.dataprovider.DataSetProviderType;
import org.dashbuilder.dataset.ColumnType;
import org.dashbuilder.dataset.DataSet;
import org.dashbuilder.dataset.DataSetMetadata;
import org.dashbuilder.dataset.client.DataSetClientServices;
import org.dashbuilder.dataset.client.editor.ColumnListEditor;
import org.dashbuilder.dataset.def.DataColumnDef;
import org.dashbuilder.dataset.def.DataSetDef;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.dashbuilder.displayer.client.DataSetHandler;
import org.dashbuilder.displayer.client.Displayer;
import org.dashbuilder.displayer.client.DisplayerListener;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.uberfire.mocks.EventSourceMock;
import org.uberfire.mvp.Command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.jgroups.util.Util.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyDouble;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class DataSetEditorTest {
@Mock protected DataSetDefBasicAttributesEditor basicAttributesEditor;
@Mock protected IsWidget providerAttributesEditorView;
@Mock protected DataSetDefColumnsFilterEditor columnsAndFilterEditor;
@Mock protected DataSetDefPreviewTable previewTable;
@Mock protected DataSetDefBackendCacheAttributesEditor backendCacheAttributesEditor;
@Mock protected DataSetDefClientCacheAttributesEditor clientCacheAttributesEditor;
@Mock protected DataSetDefRefreshAttributesEditor refreshEditor;
@Mock protected DataSetClientServices clientServices;
@Mock protected LoadingBox loadingBox;
@Mock protected EventSourceMock<ErrorEvent> errorEvent;
@Mock protected EventSourceMock<TabChangedEvent> tabChangedEvent;
@Mock protected DataSetEditor.View view;
@Mock protected DataSetDefFilterEditor filterEditor;
@Mock protected org.dashbuilder.dataset.client.editor.DataSetDefColumnsEditor columnsEditor;
@Mock protected ColumnListEditor columnListEditor;
@Mock protected DataSetDef dataSetDef;
private DataSetEditor<DataSetDef> presenter;
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
IsWidget attributesEditor = mock(IsWidget.class);
presenter = new DataSetEditor<DataSetDef>(basicAttributesEditor, attributesEditor, columnsAndFilterEditor,
previewTable, backendCacheAttributesEditor, clientCacheAttributesEditor, refreshEditor, clientServices,
loadingBox, errorEvent, tabChangedEvent, view) {
@Override
public void init() {
super.init();
}
};
when(dataSetDef.getUUID()).thenReturn("uuid1");
when(dataSetDef.getName()).thenReturn("name1");
when(dataSetDef.getProvider()).thenReturn(DataSetProviderType.BEAN);
when(columnsAndFilterEditor.dataSetFilter()).thenReturn(filterEditor);
when(columnsAndFilterEditor.columnListEditor()).thenReturn(columnsEditor);
when(columnsEditor.columns()).thenReturn(columnListEditor);
}
@Test
public void testInit() {
presenter.init();
verify(view, times(1)).init(presenter);
verify(view, times(1)).initWidgets(
any(DataSetDefBasicAttributesEditor.View.class),
any(IsWidget.class),
any(DataSetDefColumnsFilterEditor.View.class),
any(DataSetDefPreviewTable.View.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefRefreshAttributesEditor.View.class)
);
verify(view, times(1)).addConfigurationTabItemClickHandler(any(Command.class));
verify(view, times(1)).addPreviewTabItemClickHandler(any(Command.class));
verify(view, times(1)).addAdvancedTabItemClickHandler(any(Command.class));
verify(columnsAndFilterEditor, times(1)).setMaxHeight(anyString());
verify(backendCacheAttributesEditor, times(1)).setRange(anyDouble(), anyDouble());
verify(clientCacheAttributesEditor, times(1)).setRange(anyDouble(), anyDouble());
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
verify(view, times(0)).showAdvancedTab();
verify(view, times(0)).openColumnsFilterPanel(anyString());
verify(view, times(0)).closeColumnsFilterPanel(anyString());
verify(view, times(0)).showErrorNotification(any(SafeHtml.class));
verify(view, times(0)).clearErrorNotification();
}
@Test
public void testShowConfigurationTab() {
presenter.showConfigurationTab();
presenter.afterPreviewCommand.execute();
verify(view, times(1)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
verify(view, times(0)).showAdvancedTab();
}
@Test
public void testShowPreviewTab() {
presenter.showPreviewTab();
presenter.afterPreviewCommand.execute();
verify(view, times(1)).showPreviewTab();
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showAdvancedTab();
}
@Test
public void testShowAdvTab() {
presenter.showAdvancedTab();
presenter.afterPreviewCommand.execute();
verify(view, times(1)).showAdvancedTab();
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
}
@Test
public void testSetAcceptableValues() {
List<DataColumnDef> acceptableValues = mock(List.class);
presenter.setAcceptableValues(acceptableValues);
verify(columnsAndFilterEditor, times(1)).setAcceptableValues(acceptableValues);
assertViewNotUsed();
}
@Test
public void testBasicAttributesEditor() {
assertEquals(basicAttributesEditor, presenter.basicAttributesEditor());
assertViewNotUsed();
}
@Test
public void testColumnsAndFilterEditor() {
assertEquals(columnsAndFilterEditor, presenter.columnsAndFilterEditor());
assertViewNotUsed();
}
@Test
public void testBackendCacheEditor() {
assertEquals(backendCacheAttributesEditor, presenter.backendCacheEditor());
assertViewNotUsed();
}
@Test
public void testClientCacheEditor() {
assertEquals(clientCacheAttributesEditor, presenter.clientCacheEditor());
assertViewNotUsed();
}
@Test
public void testRefreshEditor() {
assertEquals(refreshEditor, presenter.refreshEditor());
assertViewNotUsed();
}
@Test
public void testOnOpenColumnsFilterPanel() {
presenter.onOpenColumnsFilterPanel();
verify(view, times(1)).openColumnsFilterPanel(anyString());
}
@Test
public void testOnCloseColumnsFilterPanel() {
presenter.onCloseColumnsFilterPanel();
verify(view, times(1)).closeColumnsFilterPanel(anyString());
}
@Test
public void testConfigurationTabItemClickHandler() {
presenter.configurationTabItemClickHandler.execute();
final ArgumentCaptor<TabChangedEvent> tabChangedEventCaptor = ArgumentCaptor.forClass(TabChangedEvent.class);
verify(tabChangedEvent, times(1)).fire(tabChangedEventCaptor.capture());
final TabChangedEvent tabChangedEvent = tabChangedEventCaptor.getValue();
assertEquals(presenter, tabChangedEvent.getContext());
assertEquals(DataSetEditor.TAB_CONFIGURATION, tabChangedEvent.getTabId());
assertViewNotUsed();
}
@Test
public void testPreviewTabItemClickHandler() {
presenter.previewTabItemClickHandler.execute();
final ArgumentCaptor<TabChangedEvent> tabChangedEventCaptor = ArgumentCaptor.forClass(TabChangedEvent.class);
verify(tabChangedEvent, times(1)).fire(tabChangedEventCaptor.capture());
final TabChangedEvent tabChangedEvent = tabChangedEventCaptor.getValue();
assertEquals(presenter, tabChangedEvent.getContext());
assertEquals(DataSetEditor.TAB_PREVIEW, tabChangedEvent.getTabId());
assertViewNotUsed();
}
@Test
public void testAdvTabItemClickHandler() {
presenter.advancedTabItemClickHandler.execute();
final ArgumentCaptor<TabChangedEvent> tabChangedEventCaptor = ArgumentCaptor.forClass(TabChangedEvent.class);
verify(tabChangedEvent, times(1)).fire(tabChangedEventCaptor.capture());
final TabChangedEvent tabChangedEvent = tabChangedEventCaptor.getValue();
assertEquals(presenter, tabChangedEvent.getContext());
assertEquals(DataSetEditor.TAB_ADVANCED, tabChangedEvent.getTabId());
assertViewNotUsed();
}
@Test
public void testShowError() {
final ClientRuntimeError error = mock(ClientRuntimeError.class);
when(error.getCause()).thenReturn("errorCause");
presenter.afterPreviewCommand = mock(Command.class);
presenter.showError(error);
verify(loadingBox, times(1)).hide();
verify(view, times(1)).showErrorNotification(any(SafeHtml.class));
verify(errorEvent, times(1)).fire(any(ErrorEvent.class));
verify(presenter.afterPreviewCommand, times(1)).execute();
verify(view, times(0)).addConfigurationTabItemClickHandler(any(Command.class));
verify(view, times(0)).addPreviewTabItemClickHandler(any(Command.class));
verify(view, times(0)).addAdvancedTabItemClickHandler(any(Command.class));
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
verify(view, times(0)).showAdvancedTab();
verify(view, times(0)).openColumnsFilterPanel(anyString());
verify(view, times(0)).closeColumnsFilterPanel(anyString());
verify(view, times(0)).clearErrorNotification();
}
@Test
public void testOnColumnsChangedEvent() {
final DataColumnDef col1 = mock(DataColumnDef.class);
when(col1.getId()).thenReturn("col1");
when(col1.getColumnType()).thenReturn(ColumnType.LABEL);
final DataColumnDef col2 = mock(DataColumnDef.class);
when(col2.getId()).thenReturn("col2");
when(col2.getColumnType()).thenReturn(ColumnType.NUMBER);
final List<DataColumnDef> cols = new ArrayList<DataColumnDef>();
cols.add(col1);
cols.add(col2);
final ColumnsChangedEvent event = mock(ColumnsChangedEvent.class);
when(event.getContext()).thenReturn(columnListEditor);
when(event.getColumns()).thenReturn(cols);
presenter.dataSetDef = this.dataSetDef;
mockPreviewTableCall();
final Command afterPreviewCommand = mock(Command.class);
presenter.afterPreviewCommand = afterPreviewCommand;
presenter.onColumnsChangedEvent(event);
verify(dataSetDef, times(1)).setColumns(cols);
verify(loadingBox, times(1)).show();
verify(loadingBox, times(1)).hide();
verify(view, times(1)).clearErrorNotification();
verify(filterEditor, times(1)).init(any(DataSetMetadata.class));
verify(afterPreviewCommand, times(1)).execute();
verify(view, times(0)).init(any(DataSetEditor.class));
verify(view, times(0)).initWidgets(
any(DataSetDefBasicAttributesEditor.View.class),
any(IsWidget.class),
any(DataSetDefColumnsFilterEditor.View.class),
any(DataSetDefPreviewTable.View.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefRefreshAttributesEditor.View.class)
);
verify(view, times(0)).addConfigurationTabItemClickHandler(any(Command.class));
verify(view, times(0)).addPreviewTabItemClickHandler(any(Command.class));
verify(view, times(0)).addAdvancedTabItemClickHandler(any(Command.class));
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
verify(view, times(0)).showAdvancedTab();
verify(view, times(0)).openColumnsFilterPanel(anyString());
verify(view, times(0)).closeColumnsFilterPanel(anyString());
verify(view, times(0)).showErrorNotification(any(SafeHtml.class));
}
@Test
public void testOnFilterChangedEvent() {
final FilterChangedEvent event = mock(FilterChangedEvent.class);
final DataSetFilter filter = mock(DataSetFilter.class);
when(event.getContext()).thenReturn(filterEditor);
when(event.getFilter()).thenReturn(filter);
presenter.dataSetDef = this.dataSetDef;
mockPreviewTableCall();
final Command afterPreviewCommand = mock(Command.class);
presenter.afterPreviewCommand = afterPreviewCommand;
presenter.onFilterChangedEvent(event);
verify(dataSetDef, times(1)).setDataSetFilter(filter);
verify(loadingBox, times(1)).show();
verify(loadingBox, times(1)).hide();
verify(view, times(1)).clearErrorNotification();
verify(filterEditor, times(0)).init(any(DataSetMetadata.class));
verify(afterPreviewCommand, times(1)).execute();
verify(view, times(0)).init(any(DataSetEditor.class));
verify(view, times(0)).initWidgets(
any(DataSetDefBasicAttributesEditor.View.class),
any(IsWidget.class),
any(DataSetDefColumnsFilterEditor.View.class),
any(DataSetDefPreviewTable.View.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefRefreshAttributesEditor.View.class)
);
verify(view, times(0)).addConfigurationTabItemClickHandler(any(Command.class));
verify(view, times(0)).addPreviewTabItemClickHandler(any(Command.class));
verify(view, times(0)).addAdvancedTabItemClickHandler(any(Command.class));
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
verify(view, times(0)).showAdvancedTab();
verify(view, times(0)).openColumnsFilterPanel(anyString());
verify(view, times(0)).closeColumnsFilterPanel(anyString());
verify(view, times(0)).showErrorNotification(any(SafeHtml.class));
}
protected void mockPreviewTableCall() {
final Displayer displayer = mock(Displayer.class);
final DataSetHandler dataSetHandler = mock(DataSetHandler.class);
final DataSet dataSet = mock(DataSet.class);
when(displayer.getDataSetHandler()).thenReturn(dataSetHandler);
when(dataSetHandler.getLastDataSet()).thenReturn(dataSet);
doAnswer(new Answer<Void>() {
@Override
public Void answer(final InvocationOnMock invocationOnMock) throws Throwable {
DisplayerListener listener = (DisplayerListener) invocationOnMock.getArguments()[2];
listener.onDraw(displayer);
return null;
}
}).when(previewTable).show(any(DataSetDef.class), any(Collection.class), any(DisplayerListener.class));
}
protected void assertViewNotUsed() {
verify(view, times(0)).init(any(DataSetEditor.class));
verify(view, times(0)).initWidgets(
any(DataSetDefBasicAttributesEditor.View.class),
any(IsWidget.class),
any(DataSetDefColumnsFilterEditor.View.class),
any(DataSetDefPreviewTable.View.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefCacheAttributesEditorView.class),
any(DataSetDefRefreshAttributesEditor.View.class)
);
verify(view, times(0)).addConfigurationTabItemClickHandler(any(Command.class));
verify(view, times(0)).addPreviewTabItemClickHandler(any(Command.class));
verify(view, times(0)).addAdvancedTabItemClickHandler(any(Command.class));
verify(view, times(0)).showConfigurationTab();
verify(view, times(0)).showPreviewTab();
verify(view, times(0)).showAdvancedTab();
verify(view, times(0)).openColumnsFilterPanel(anyString());
verify(view, times(0)).closeColumnsFilterPanel(anyString());
verify(view, times(0)).showErrorNotification(any(SafeHtml.class));
verify(view, times(0)).clearErrorNotification();
}
}