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.edit.DataSetEditWorkflow; 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.backend.EditDataSetDef; import org.dashbuilder.dataset.client.editor.DataSetDefEditor; import org.dashbuilder.dataset.def.DataColumnDef; import org.dashbuilder.dataset.def.DataSetDef; import org.dashbuilder.dataset.service.DataSetDefVfsServices; import org.jboss.errai.common.client.api.Caller; 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.InjectMocks; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.uberfire.backend.vfs.ObservablePath; import org.uberfire.backend.vfs.Path; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent; import org.uberfire.client.workbench.widgets.common.ErrorPopupPresenter; import org.uberfire.ext.editor.commons.client.history.VersionRecordManager; import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilder; import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator; import org.uberfire.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.events.NotificationEvent; import java.util.List; import static org.junit.Assert.*; import static org.mockito.Mockito.*; /** * @since 0.4.0 */ @RunWith(GwtMockitoTestRunner.class) public class DataSetDefEditorPresenterTest { @Mock EventSourceMock<ChangeTitleWidgetEvent> changeTitleNotification; @Mock EventSourceMock<NotificationEvent> notification; @Mock VersionRecordManager versionRecordManager; @Mock BasicFileMenuBuilder menuBuilder; @Mock DefaultFileNameValidator fileNameValidator; @Mock PlaceManager placeManager; @Mock PlaceRequest placeRequest; @Mock ObservablePath observablePath; @Mock SyncBeanManager beanManager; @Mock DataSetEditorWorkflowFactory workflowFactory; @Mock DataSetDefType resourceType; @Mock ErrorPopupPresenter errorPopupPresenter; @Mock DataSetDefVfsServices dataSetDefVfsServices; @Mock DataSetDef dataSetDef; @Mock DataSetDefEditor dataSetDefEditor; @Mock DataSetDefScreenView view; Caller<DataSetDefVfsServices> services; @InjectMocks private DataSetDefEditorPresenter presenter; final List<DataColumnDef> columns = mock(List.class); final DataSetEditWorkflow editWorkflow = mock(DataSetEditWorkflow.class); @Before public void setup() throws Exception { when(dataSetDef.getUUID()).thenReturn("uuid1"); when(dataSetDef.getName()).thenReturn("name1"); when(dataSetDef.getProvider()).thenReturn(DataSetProviderType.BEAN); when(dataSetDef.getColumns()).thenReturn(columns); services = new CallerMock<DataSetDefVfsServices>( dataSetDefVfsServices ); presenter.services = services; presenter.workflow = editWorkflow; final EditDataSetDef editDataSetDef = mock(EditDataSetDef.class); when(editDataSetDef.getDefinition()).thenReturn(dataSetDef); when(editDataSetDef.getColumns()).thenReturn(columns); when(dataSetDefVfsServices.load(any(Path.class))).thenReturn(editDataSetDef); when(dataSetDefVfsServices.get(any(Path.class))).thenReturn(dataSetDef); when(workflowFactory.edit(any(DataSetProviderType.class))).thenReturn(editWorkflow); when(editWorkflow.getDataSetDef()).thenReturn(dataSetDef); when(editWorkflow.getEditor()).thenReturn(dataSetDefEditor); when(editWorkflow.edit(any(DataSetDef.class), any(List.class))).thenReturn(editWorkflow); assertEquals(view.asWidget(), presenter.getWidget()); } @Test public void testLoadContent() throws Exception { presenter.loadContent(); verify(dataSetDefVfsServices, times(1)).load(any(Path.class)); verify(changeTitleNotification, times(1)).fire(any(ChangeTitleWidgetEvent.class)); verify(view, times(1)).hideBusyIndicator(); verify(view, times(1)).setWidget(editWorkflow); verify(editWorkflow, times(1)).edit(dataSetDef, columns); verify(editWorkflow, times(1)).showPreviewTab(); } @Test public void testLoadContentNullified() throws Exception { when(dataSetDefVfsServices.load(any(Path.class))).thenReturn(null); presenter.loadContent(); verify(dataSetDefVfsServices, times(1)).load(any(Path.class)); verify(errorPopupPresenter, times(1)).showMessage(anyString()); verify(view, times(1)).hideBusyIndicator(); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testLoadDefinition() throws Exception { final Exception loadContentException = mock(Exception.class); doThrow(loadContentException).when(dataSetDefVfsServices).load(any(Path.class)); presenter.loadContent(); verify(dataSetDefVfsServices, times(1)).get(any(Path.class)); verify(view, times(1)).hideBusyIndicator(); verify(view, times(1)).setWidget(editWorkflow); verify(editWorkflow, times(1)).edit(dataSetDef, columns); verify(editWorkflow, times(1)).showPreviewTab(); } @Test public void testGetDataSetDef() { assertEquals(dataSetDef, presenter.getDataSetDef()); } @Test public void testGetDataSetDefNullified() { when(editWorkflow.getDataSetDef()).thenReturn(null); DataSetDef d = presenter.getDataSetDef(); assertNull(d); } @Test public void testOnTestEvent() { TestDataSetRequestEvent event = mock(TestDataSetRequestEvent.class); when(event.getContext()).thenReturn(editWorkflow); when(editWorkflow.hasErrors()).thenReturn(false); presenter.onTestEvent(event); verify(editWorkflow, times(1)).testDataSet(any(DataSetEditorWorkflow.TestDataSetCallback.class)); } @Test public void testOnTestEventWithErrors() { TestDataSetRequestEvent event = mock(TestDataSetRequestEvent.class); when(event.getContext()).thenReturn(editWorkflow); when(editWorkflow.hasErrors()).thenReturn(true); presenter.onTestEvent(event); verify(editWorkflow, times(0)).testDataSet(any(DataSetEditorWorkflow.TestDataSetCallback.class)); } @Test public void testOnValidateSuccess() { when(editWorkflow.hasErrors()).thenReturn(false); presenter.onValidate().execute(); verify(editWorkflow, times(1)).flush(); final ArgumentCaptor<NotificationEvent> dataCaptor = ArgumentCaptor.forClass(NotificationEvent.class); verify(notification, times(1)).fire(dataCaptor.capture()); NotificationEvent ne = dataCaptor.getValue(); assertNotNull(ne); assertEquals(NotificationEvent.NotificationType.SUCCESS, ne.getType()); } @Test public void testOnValidateFailed() { when(editWorkflow.hasErrors()).thenReturn(true); presenter.onValidate().execute(); verify(editWorkflow, times(1)).flush(); final ArgumentCaptor<NotificationEvent> dataCaptor = ArgumentCaptor.forClass(NotificationEvent.class); verify(notification, times(1)).fire(dataCaptor.capture()); NotificationEvent ne = dataCaptor.getValue(); assertNotNull(ne); assertEquals(NotificationEvent.NotificationType.ERROR, ne.getType()); } // TODO: @Test - Do it when SaveOperationService refactored. public void testOnSave() { presenter.save(); } @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)); verify(editWorkflow, times(0)).clear(); verify(editWorkflow, times(0)).clearButtons(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).showNextButton(); verify(editWorkflow, times(0)).showBackButton(); verify(editWorkflow, times(0)).edit(any(DataSetDef.class), any(List.class)); } @Test public void testOnCancelEvent() { CancelRequestEvent event = mock(CancelRequestEvent.class); when(event.getContext()).thenReturn(editWorkflow); presenter.onCancelEvent(event); verify(editWorkflow, times(1)).clear(); verify(editWorkflow, times(0)).clearButtons(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).showNextButton(); verify(editWorkflow, times(0)).showBackButton(); verify(editWorkflow, times(0)).edit(any(DataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnErrorEvent() { ErrorEvent event = mock(ErrorEvent.class); when(event.getClientRuntimeError()).thenReturn(null); when(event.getMessage()).thenReturn("errorMessage"); presenter.onErrorEvent(event); verify(editWorkflow, times(0)).clear(); verify(editWorkflow, times(0)).clearButtons(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).showNextButton(); verify(editWorkflow, times(0)).showBackButton(); verify(editWorkflow, times(0)).edit(any(DataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(1)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnTabChangedEvent_ConfigurationTab() { TabChangedEvent event = mock(TabChangedEvent.class); when(event.getContext()).thenReturn(dataSetDefEditor); when(event.getTabId()).thenReturn(DataSetEditor.TAB_CONFIGURATION); 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(DataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnTabChangedEvent_PreviewTab() { TabChangedEvent event = mock(TabChangedEvent.class); when(event.getContext()).thenReturn(dataSetDefEditor); when(event.getTabId()).thenReturn(DataSetEditor.TAB_PREVIEW); presenter.onTabChangedEvent(event); verify(editWorkflow, times(1)).clearButtons(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).showNextButton(); verify(editWorkflow, times(0)).showBackButton(); verify(editWorkflow, times(0)).edit(any(DataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } @Test public void testOnTabChangedEvent_AdvancedTab() { TabChangedEvent event = mock(TabChangedEvent.class); when(event.getContext()).thenReturn(dataSetDefEditor); when(event.getTabId()).thenReturn(DataSetEditor.TAB_ADVANCED); presenter.onTabChangedEvent(event); verify(editWorkflow, times(1)).clearButtons(); verify(editWorkflow, times(0)).showTestButton(); verify(editWorkflow, times(0)).showNextButton(); verify(editWorkflow, times(0)).showBackButton(); verify(editWorkflow, times(0)).edit(any(DataSetDef.class), any(List.class)); verify(errorPopupPresenter, times(0)).showMessage(anyString()); verify(view, times(0)).setWidget(any(IsWidget.class)); } }