package org.dashbuilder.common.client.editor.map; import com.google.gwt.editor.client.EditorError; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwtmockito.GwtMockitoTestRunner; import org.dashbuilder.common.client.editor.AbstractEditorTest; import org.dashbuilder.common.client.event.ValueChangeEvent; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.uberfire.mocks.EventSourceMock; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class MapEditorTest extends AbstractEditorTest { @Mock MapEditor.View view; @Mock EventSourceMock<ValueChangeEvent<Map<String, String>>> valueChangeEvent; private MapEditor presenter; @Before public void setup() { // The presenter instance to test. presenter = new MapEditor(view, valueChangeEvent); assertEquals(view.asWidget(), presenter.asWidget()); } @Test public void testInit() throws Exception { presenter.init(); verify(view, times(1)).init(presenter); verify(view, times(1)).setAddText(anyString()); verify(view, times(1)).setEmptyText(anyString()); verify(view, times(1)).addButtonColumn(anyInt(), anyString(), anyInt()); verify(view, times(2)).addTextColumn(anyInt(), anyString(), anyBoolean(), anyInt()); verify(view, times(0)).clearError(); verify(view, times(0)).removeColumn(anyInt()); verify(view, times(0)).showError(any(SafeHtml.class)); verify(view, times(0)).setData(anyList()); verify(view, times(0)).setRowCount(anyInt()); } @Test public void testClearErrors() throws Exception { List<EditorError> errors = new ArrayList<EditorError>(); presenter.showErrors(errors); verify(view, times(1)).clearError(); verify(view, times(0)).init(presenter); verify(view, times(0)).setAddText(anyString()); verify(view, times(0)).setEmptyText(anyString()); verify(view, times(0)).addButtonColumn(anyInt(), anyString(), anyInt()); verify(view, times(0)).addTextColumn(anyInt(), anyString(), anyBoolean(), anyInt()); verify(view, times(0)).showError(any(SafeHtml.class)); verify(view, times(0)).setData(anyList()); verify(view, times(0)).setRowCount(anyInt()); verify(view, times(0)).removeColumn(anyInt()); } @Test public void testShowErrors() throws Exception { EditorError e1 = mockEditorError(presenter, "m1"); EditorError e2 = mockEditorError(presenter, "m2"); List<EditorError> errors = new ArrayList<EditorError>(2); errors.add(e1); errors.add(e2); presenter.showErrors(errors); final ArgumentCaptor<SafeHtml> errorSafeHtmlCaptor = ArgumentCaptor.forClass(SafeHtml.class); verify(view, times(1)).showError(errorSafeHtmlCaptor.capture()); verify(view, times(0)).clearError(); verify(view, times(0)).init(presenter); verify(view, times(0)).setAddText(anyString()); verify(view, times(0)).setEmptyText(anyString()); verify(view, times(0)).addButtonColumn(anyInt(), anyString(), anyInt()); verify(view, times(0)).addTextColumn(anyInt(), anyString(), anyBoolean(), anyInt()); verify(view, times(0)).setData(anyList()); verify(view, times(0)).setRowCount(anyInt()); verify(view, times(0)).removeColumn(anyInt()); final SafeHtml value = errorSafeHtmlCaptor.getValue(); Assert.assertEquals("m1\nm2", value.asString()); } @Test public void testValue() throws Exception { final Map<String, String> value = new HashMap<String, String>(1); value.put("key1", "value1"); presenter.setValue(value); assertEquals(value, presenter.getValue()); assertSetViewValue(1); } @Test public void testUpdateKey() throws Exception { final Map<String, String> value = new HashMap<String, String>(1); value.put("key1", "value1"); presenter.value = value; Map.Entry<String, String> entry = mock(Map.Entry.class); when(entry.getKey()).thenReturn("key1"); presenter.update(0, 0, entry, "key2"); assertEquals(1, presenter.getValue().size()); assertEquals("value1", presenter.getValue().get("key2")); verify( valueChangeEvent, times( 1 ) ).fire(any(ValueChangeEvent.class)); assertSetViewValue(1); } @Test public void testUpdateValue() throws Exception { final Map<String, String> value = new HashMap<String, String>(1); value.put("key1", "value1"); presenter.value = value; Map.Entry<String, String> entry = mock(Map.Entry.class); when(entry.getKey()).thenReturn("key1"); when(entry.getValue()).thenReturn("value1"); presenter.update(1, 0, entry, "value2"); assertEquals(1, presenter.getValue().size()); assertEquals("value2", presenter.getValue().get("key1")); verify( valueChangeEvent, times( 1 ) ).fire(any(ValueChangeEvent.class)); assertSetViewValue(1); } @Test public void testRemoveEntry() throws Exception { final Map<String, String> value = new HashMap<String, String>(1); value.put("key1", "value1"); presenter.value = value; Map.Entry<String, String> entry = mock(Map.Entry.class); when(entry.getKey()).thenReturn("key1"); presenter.update(2, 0, entry, null); assertEquals(0, presenter.getValue().size()); verify( valueChangeEvent, times( 1 ) ).fire(any(ValueChangeEvent.class)); assertSetViewValue(0); } @Test public void testAddEntry() throws Exception { presenter.addEntry(); assertEquals(1, presenter.getValue().size()); verify( valueChangeEvent, times( 1 ) ).fire(any(ValueChangeEvent.class)); assertSetViewValue(1); } protected void assertSetViewValue(final int size) { verify(view, times(3)).removeColumn(0); verify(view, times(1)).clearError(); verify(view, times(1)).addButtonColumn(anyInt(), anyString(), anyInt()); verify(view, times(2)).addTextColumn(anyInt(), anyString(), anyBoolean(), anyInt()); verify(view, times(1)).setEmptyText(anyString()); verify(view, times(1)).setRowCount(size); final ArgumentCaptor<List> dataCaptor = ArgumentCaptor.forClass(List.class); verify(view, times(1)).setData(dataCaptor.capture()); final List dataValue = dataCaptor.getValue(); assertNotNull(dataValue); assertEquals(size, dataValue.size()); verify(view, times(0)).init(presenter); verify(view, times(0)).showError(any(SafeHtml.class)); verify(view, times(0)).setAddText(anyString()); } }