package org.dashbuilder.dataset.editor.client.screens; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwtmockito.GwtMockitoTestRunner; import org.dashbuilder.client.widgets.dataset.editor.DataSetEditor; import org.dashbuilder.client.widgets.dataset.editor.workflow.DataSetEditorWorkflow; import org.dashbuilder.client.widgets.dataset.editor.workflow.DataSetEditorWorkflowFactory; import org.dashbuilder.client.widgets.dataset.editor.workflow.create.DataSetBasicAttributesWorkflow; import org.dashbuilder.client.widgets.dataset.editor.workflow.create.DataSetProviderTypeWorkflow; import org.dashbuilder.client.widgets.dataset.editor.workflow.edit.SQLDataSetEditWorkflow; import org.dashbuilder.client.widgets.dataset.event.CancelRequestEvent; import org.dashbuilder.client.widgets.dataset.event.ErrorEvent; import org.dashbuilder.client.widgets.dataset.event.TabChangedEvent; import org.dashbuilder.client.widgets.dataset.event.TestDataSetRequestEvent; import org.dashbuilder.common.client.error.ClientRuntimeError; import org.dashbuilder.dataprovider.DataSetProviderType; import org.dashbuilder.dataset.ColumnType; import org.dashbuilder.dataset.DataColumn; import org.dashbuilder.dataset.DataSet; import org.dashbuilder.dataset.client.DataSetClientServices; import org.dashbuilder.dataset.client.editor.SQLDataSetDefEditor; import org.dashbuilder.dataset.def.DataColumnDef; import org.dashbuilder.dataset.def.DataSetDef; import org.dashbuilder.dataset.def.SQLDataSetDef; import org.dashbuilder.dataset.service.DataSetDefVfsServices; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.jboss.errai.ioc.client.container.SyncBeanManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.uberfire.backend.vfs.Path; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.workbench.widgets.common.ErrorPopupPresenter; import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter; import org.uberfire.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.events.NotificationEvent; import java.util.ArrayList; import java.util.List; import static org.jgroups.util.Util.assertEquals; import static org.jgroups.util.Util.assertNotNull; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class DataSetDefWizardScreenTest { @Mock EventSourceMock<NotificationEvent> notification; @Mock PlaceManager placeManager; @Mock SyncBeanManager beanManager; @Mock DataSetEditorWorkflowFactory workflowFactory; @Mock DataSetClientServices clientServices; @Mock ErrorPopupPresenter errorPopupPresenter; @Mock DataSetDefScreenView view; @Mock DataSetProviderTypeWorkflow dataSetProviderTypeWorkflow; @Mock SQLDataSetDef dataSetDef; @Mock SQLDataSetDefEditor dataSetDefEditor; @Mock DataSetBasicAttributesWorkflow dataSetBasicAttributesWorkflow; @Mock SQLDataSetEditWorkflow editWorkflow; @Mock DataSetDefVfsServices dataSetDefVfsServices; @Mock SavePopUpPresenter savePopUpPresenter; Caller<DataSetDefVfsServices> services; private DataSetDefWizardScreen presenter; @Before public void setup() throws Exception { services = new CallerMock<DataSetDefVfsServices>( dataSetDefVfsServices ); when(dataSetDef.getUUID()).thenReturn("uuid1"); when(dataSetDef.getName()).thenReturn("name1"); when(dataSetDef.getProvider()).thenReturn(DataSetProviderType.SQL); when(workflowFactory.providerType()).thenReturn(dataSetProviderTypeWorkflow); when(workflowFactory.edit(any(DataSetProviderType.class))).thenReturn(editWorkflow); when(dataSetProviderTypeWorkflow.edit(any(DataSetDef.class))).thenReturn(dataSetProviderTypeWorkflow); when(dataSetProviderTypeWorkflow.providerTypeEdition()).thenReturn(dataSetProviderTypeWorkflow); doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocationOnMock) throws Throwable { RemoteCallback callback = (RemoteCallback) invocationOnMock.getArguments()[1]; callback.callback(dataSetDef); return null; } }).when(clientServices).newDataSet(any(DataSetProviderType.class), any(RemoteCallback.class)); when(dataSetBasicAttributesWorkflow.edit(any(DataSetDef.class))).thenReturn(dataSetBasicAttributesWorkflow); when(dataSetBasicAttributesWorkflow.basicAttributesEdition()).thenReturn(editWorkflow); when(editWorkflow.getDataSetDef()).thenReturn(dataSetDef); when(editWorkflow.edit(any(SQLDataSetDef.class), any(List.class))).thenReturn(editWorkflow); when(editWorkflow.showNextButton()).thenReturn(editWorkflow); when(editWorkflow.showBackButton()).thenReturn(editWorkflow); when(editWorkflow.showTestButton()).thenReturn(editWorkflow); when(editWorkflow.showPreviewTab()).thenReturn(editWorkflow); when(editWorkflow.showConfigurationTab()).thenReturn(editWorkflow); when(editWorkflow.showAdvancedTab()).thenReturn(editWorkflow); when(workflowFactory.basicAttributes(any(DataSetProviderType.class))).thenReturn(dataSetBasicAttributesWorkflow); doNothing().when(placeManager).goTo(anyString()); doNothing().when(placeManager).closePlace(any(PlaceRequest.class)); doNothing().when(placeManager).closePlace(anyString()); presenter = new DataSetDefWizardScreen( beanManager, workflowFactory, services, clientServices, notification, placeManager, errorPopupPresenter, savePopUpPresenter, view ); presenter.services = services; } @Test public void testShowError() { final ClientRuntimeError error = mock(ClientRuntimeError.class); when(error.getCause()).thenReturn("errorCause"); presenter.showError(error); verify(errorPopupPresenter, times(1)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testInitProviderTypeEdition() { PlaceRequest placeRequest = mock(PlaceRequest.class); presenter.init(placeRequest); assertEquals(dataSetProviderTypeWorkflow, presenter.currentWorkflow); verify(workflowFactory, times(1)).providerType(); verify(view, times(1)).setWidget(any(IsWidget.class)); verify(dataSetProviderTypeWorkflow, times(1)).edit(any(DataSetDef.class)); verify(dataSetProviderTypeWorkflow, times(1)).showNextButton(); verify(dataSetProviderTypeWorkflow, times(0)).showTestButton(); verify(dataSetProviderTypeWorkflow, times(0)).showBackButton(); } @Test public void testOnProviderTypeSelected() throws Exception { when(dataSetProviderTypeWorkflow.getProviderType()).thenReturn(DataSetProviderType.SQL); presenter.onProviderTypeSelected(dataSetProviderTypeWorkflow); assertEquals(dataSetBasicAttributesWorkflow, presenter.currentWorkflow); verify(view, times(1)).setWidget(any(IsWidget.class)); verify(dataSetBasicAttributesWorkflow, times(1)).edit(any(DataSetDef.class)); verify(editWorkflow, times(1)).showTestButton(); verify(editWorkflow, times(1)).showBackButton(); verify(editWorkflow, times(0)).showNextButton(); } @Test public void testOnTestEventWithErrors() { TestDataSetRequestEvent event = mock(TestDataSetRequestEvent.class); when(event.getContext()).thenReturn(dataSetBasicAttributesWorkflow); when(dataSetBasicAttributesWorkflow.hasErrors()).thenReturn(true); presenter.currentWorkflow = dataSetBasicAttributesWorkflow; presenter.onTestEvent(event); verify(dataSetBasicAttributesWorkflow, times(0)).testDataSet(any(DataSetEditorWorkflow.TestDataSetCallback.class)); } @Test public void testOnTestEventAndCompleteEdition() { final DataSet dataSet = mock(DataSet.class); DataColumn col1 = mock(DataColumn.class); when(col1.getId()).thenReturn("col1"); when(col1.getColumnType()).thenReturn(ColumnType.LABEL); DataColumn col2 = mock(DataColumn.class); when(col2.getId()).thenReturn("col2"); when(col2.getColumnType()).thenReturn(ColumnType.LABEL); List<DataColumn> columns = new ArrayList<DataColumn>(); columns.add(col1); columns.add(col2); when(dataSet.getColumns()).thenReturn(columns); TestDataSetRequestEvent event = mock(TestDataSetRequestEvent.class); when(event.getContext()).thenReturn(dataSetBasicAttributesWorkflow); when(dataSetBasicAttributesWorkflow.hasErrors()).thenReturn(false); when(dataSetBasicAttributesWorkflow.getDataSetDef()).thenReturn(dataSetDef); doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocationOnMock) throws Throwable { DataSetEditorWorkflow.TestDataSetCallback callback = (DataSetEditorWorkflow.TestDataSetCallback) invocationOnMock.getArguments()[0]; callback.onSuccess(dataSet); return null; } }).when(dataSetBasicAttributesWorkflow).testDataSet(any(DataSetEditorWorkflow.TestDataSetCallback.class)); presenter.currentWorkflow = dataSetBasicAttributesWorkflow; presenter.onTestEvent(event); verify(dataSetBasicAttributesWorkflow, times(1)).testDataSet(any(DataSetEditorWorkflow.TestDataSetCallback.class)); assertEquals(editWorkflow, presenter.currentWorkflow); verify(workflowFactory, times(1)).edit(any(DataSetProviderType.class)); verify(view, times(1)).setWidget(any(IsWidget.class)); final ArgumentCaptor<List> dataCaptor = ArgumentCaptor.forClass(List.class); verify(editWorkflow, times(1)).edit(any(SQLDataSetDef.class), dataCaptor.capture()); List<DataColumnDef> columnsCaptured = dataCaptor.getValue(); assertNotNull(columnsCaptured); assertEquals(2, columnsCaptured.size()); assertEquals("col1", columnsCaptured.get(0).getId()); assertEquals("col2", columnsCaptured.get(1).getId()); verify(editWorkflow, times(1)).showPreviewTab(); verify(editWorkflow, times(1)).showNextButton(); verify(editWorkflow, times(1)).showBackButton(); verify(editWorkflow, times(0)).showTestButton(); } @Test public void testOnSave() { final Path path = mock(Path.class); when(dataSetDefVfsServices.save(any(DataSetDef.class), anyString())).thenReturn(path); presenter.currentWorkflow = editWorkflow; presenter.onSave(dataSetDef, "saveMessage"); verify(placeManager, times(1)).goTo("DataSetAuthoringHome"); verify(notification, times(1)).fire(any(NotificationEvent.class)); verify(placeManager, times(1)).closePlace(any(PlaceRequest.class)); verify(editWorkflow, times(1)).clear(); verify(workflowFactory, times(0)).providerType(); verify(workflowFactory, times(0)).edit(any(DataSetProviderType.class)); verify(workflowFactory, times(0)).basicAttributes(any(DataSetProviderType.class)); } @Test public void testOnCancelEvent() { presenter.currentWorkflow = dataSetBasicAttributesWorkflow; CancelRequestEvent event = mock(CancelRequestEvent.class); when(event.getContext()).thenReturn(dataSetBasicAttributesWorkflow); presenter.onCancelEvent(event); verify(workflowFactory, times(1)).providerType(); verify(workflowFactory, times(0)).edit(any(DataSetProviderType.class)); verify(workflowFactory, times(0)).basicAttributes(any(DataSetProviderType.class)); } @Test public void testOnErrorEvent() { ErrorEvent event = mock(ErrorEvent.class); when(event.getClientRuntimeError()).thenReturn(null); when(event.getMessage()).thenReturn("errorMessage"); presenter.currentWorkflow = dataSetBasicAttributesWorkflow; presenter.onErrorEvent(event); verify(dataSetBasicAttributesWorkflow, times(0)).clear(); verify(dataSetBasicAttributesWorkflow, times(0)).clearButtons(); verify(dataSetBasicAttributesWorkflow, times(0)).showTestButton(); verify(dataSetBasicAttributesWorkflow, times(0)).showNextButton(); verify(dataSetBasicAttributesWorkflow, times(0)).showBackButton(); verify(dataSetBasicAttributesWorkflow, times(0)).edit(any(DataSetDef.class)); verify(errorPopupPresenter, times(1)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnTabChangedEvent_ConfigurationTab() { when(editWorkflow.getEditor()).thenReturn(dataSetDefEditor); TabChangedEvent event = mock(TabChangedEvent.class); when(event.getContext()).thenReturn(dataSetDefEditor); when(event.getTabId()).thenReturn(DataSetEditor.TAB_CONFIGURATION); presenter.currentWorkflow = editWorkflow; presenter.onTabChangedEvent(event); verify(editWorkflow, times(1)).clearButtons(); verify(editWorkflow, times(1)).showTestButton(); verify(editWorkflow, times(0)).showNextButton(); verify(editWorkflow, times(0)).showBackButton(); verify(editWorkflow, times(0)).edit(any(SQLDataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnTabChangedEvent_PreviewTab() { when(editWorkflow.getEditor()).thenReturn(dataSetDefEditor); TabChangedEvent event = mock(TabChangedEvent.class); when(event.getContext()).thenReturn(dataSetDefEditor); when(event.getTabId()).thenReturn(DataSetEditor.TAB_PREVIEW); presenter.currentWorkflow = editWorkflow; presenter.onTabChangedEvent(event); verify(editWorkflow, times(1)).clearButtons(); verify(editWorkflow, times(1)).showNextButton(); verify(editWorkflow, times(1)).showBackButton(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).edit(any(SQLDataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnTabChangedEvent_AdvancedTab() { when(editWorkflow.getEditor()).thenReturn(dataSetDefEditor); TabChangedEvent event = mock(TabChangedEvent.class); when(event.getContext()).thenReturn(dataSetDefEditor); when(event.getTabId()).thenReturn(DataSetEditor.TAB_ADVANCED); presenter.currentWorkflow = editWorkflow; presenter.onTabChangedEvent(event); verify(editWorkflow, times(1)).clearButtons(); verify(editWorkflow, times(1)).showNextButton(); verify(editWorkflow, times(1)).showBackButton(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).edit(any(SQLDataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } }