package org.dashbuilder.client.widgets.dataset.explorer; import com.google.gwt.user.client.ui.Widget; import com.google.gwtmockito.GwtMockitoTestRunner; import org.dashbuilder.dataprovider.DataSetProviderType; import org.dashbuilder.dataset.client.DataSetClientServices; import org.dashbuilder.dataset.def.DataSetDef; import org.dashbuilder.dataset.events.DataSetDefModifiedEvent; import org.dashbuilder.dataset.events.DataSetDefRegisteredEvent; import org.dashbuilder.dataset.events.DataSetDefRemovedEvent; import org.jboss.errai.common.client.api.RemoteCallback; 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 javax.enterprise.inject.Instance; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static org.jgroups.util.Util.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class DataSetExplorerTest { @Mock DataSetExplorer.View view; @Mock DataSetPanel dataSetPanel; @Mock DataSetDef dataSetDef; @Mock DataSetDef dataSetDefCustom; @Mock DataSetClientServices dataSetClientServices; Instance<DataSetPanel> panelInstances; private DataSetExplorer presenter; final List<DataSetDef> dataSetDefList = new ArrayList<DataSetDef>(); @Before public void setup() throws Exception { when(dataSetDef.getUUID()).thenReturn("uuid1"); when(dataSetDef.getName()).thenReturn("name1"); when(dataSetDef.isPublic()).thenReturn(true); when(dataSetDef.getProvider()).thenReturn(DataSetProviderType.BEAN); when(dataSetDefCustom.getUUID()).thenReturn("uuid2"); when(dataSetDefCustom.getName()).thenReturn("name2"); when(dataSetDefCustom.isPublic()).thenReturn(true); when(dataSetDefCustom.getProvider()).thenReturn(() -> "CUSTOM"); dataSetDefList.add(dataSetDef); dataSetDefList.add(dataSetDefCustom); final Widget widget = mock(Widget.class); when(view.asWidget()).thenReturn(widget); panelInstances = new MockInstance(); // Client services method mocks. when(dataSetPanel.getDataSetDef()).thenReturn(dataSetDef); doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocationOnMock) throws Throwable { RemoteCallback<List<DataSetDef>> callback = (RemoteCallback<List<DataSetDef>>) invocationOnMock.getArguments()[0]; callback.callback(dataSetDefList); return null; } }).when(dataSetClientServices).getPublicDataSetDefs(any(RemoteCallback.class)); // The presenter instance to test. presenter = new DataSetExplorer(panelInstances, dataSetClientServices, view); } @Test public void testInit() throws Exception { presenter.init(); verify(view, times(1)).init(presenter); } @Test public void testAsWidget() throws Exception { assertEquals(view.asWidget(), presenter.asWidget()); } @Test public void testShow() throws Exception { presenter.show(); assertEquals(1, presenter.panels.size()); assertEquals(dataSetPanel, presenter.panels.get(0)); verify(view, times(1)).clear(); verify(view, times(1)).addPanel(any(DataSetPanel.View.class)); verify(dataSetPanel, times(1)).show(dataSetDef, "dataSetsExplorerPanelGroup"); } @Test public void testShowTwice() throws Exception { // Add same data set def again, but only one panel must be visible. dataSetDefList.add(dataSetDef); presenter.show(); assertEquals(1, presenter.panels.size()); assertEquals(dataSetPanel, presenter.panels.get(0)); verify(view, times(1)).clear(); verify(view, times(1)).addPanel(any(DataSetPanel.View.class)); verify(dataSetPanel, times(1)).show(dataSetDef, "dataSetsExplorerPanelGroup"); } @Test public void testOnDataSetDefRegisteredEvent() { final DataSetDefRegisteredEvent event = mock(DataSetDefRegisteredEvent.class); when(event.getDataSetDef()).thenReturn(dataSetDef); presenter.onDataSetDefRegisteredEvent(event); assertEquals(1, presenter.panels.size()); assertEquals(dataSetPanel, presenter.panels.get(0)); verify(view, times(0)).clear(); verify(view, times(1)).addPanel(any(DataSetPanel.View.class)); verify(dataSetPanel, times(1)).show(dataSetDef, "dataSetsExplorerPanelGroup"); } @Test public void testOnDataSetDefModifiedEvent() { final DataSetDefModifiedEvent event = mock(DataSetDefModifiedEvent.class); when(event.getOldDataSetDef()).thenReturn(dataSetDef); when(event.getNewDataSetDef()).thenReturn(dataSetDef); presenter.panels.add(dataSetPanel); presenter.onDataSetDefModifiedEvent(event); assertEquals(1, presenter.panels.size()); assertEquals(dataSetPanel, presenter.panels.get(0)); verify(view, times(0)).clear(); verify(view, times(0)).addPanel(any(DataSetPanel.View.class)); verify(dataSetPanel, times(1)).show(dataSetDef, "dataSetsExplorerPanelGroup"); verify(dataSetPanel, times(1)).close(); } @Test public void testOnDataSetDefRemovedEvent() { final DataSetDef removedDataSetDef = mock(DataSetDef.class); when(removedDataSetDef.getUUID()).thenReturn("removed"); when(removedDataSetDef.getName()).thenReturn("removedDef"); when(removedDataSetDef.isPublic()).thenReturn(true); when(removedDataSetDef.getProvider()).thenReturn(DataSetProviderType.SQL); final DataSetDefRemovedEvent event = mock(DataSetDefRemovedEvent.class); when(event.getDataSetDef()).thenReturn(removedDataSetDef); presenter.onDataSetDefRemovedEvent(event); assertEquals(1, presenter.panels.size()); assertEquals(dataSetPanel, presenter.panels.get(0)); verify(view, times(1)).clear(); verify(view, times(1)).addPanel(any(DataSetPanel.View.class)); verify(dataSetPanel, times(1)).show(dataSetDef, "dataSetsExplorerPanelGroup"); } // Mockito complains when mocking Instance<U>, so let's create an empty implementation for it. It returns a single mocked DataSetPanel instance. private class MockInstance implements Instance<DataSetPanel> { @Override public Instance<DataSetPanel> select(Annotation... annotations) { return null; } @Override public <U extends DataSetPanel> Instance<U> select(Class<U> aClass, Annotation... annotations) { return (Instance<U>) dataSetPanel; } @Override public boolean isUnsatisfied() { return false; } @Override public boolean isAmbiguous() { return false; } @Override public void destroy(DataSetPanel dataSetPanel) { } @Override public Iterator<DataSetPanel> iterator() { return null; } @Override public DataSetPanel get() { return dataSetPanel; } } }