/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package de.unioninvestment.eai.portal.support.vaadin.container; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import com.vaadin.data.Container; import com.vaadin.data.Container.ItemSetChangeEvent; import com.vaadin.data.Container.ItemSetChangeListener; import com.vaadin.data.util.filter.Compare; @SuppressWarnings("unchecked") public class GenericVaadinContainerTest { @Mock private GenericDelegate delegateMock; @Mock private MetaData metaDataMock; private GenericVaadinContainer container; @Mock private ItemSetChangeListener listenerMock; @Captor private ArgumentCaptor<ItemSetChangeEvent> itemSetChangeEventCaptor; @Before public void setUp() { MockitoAnnotations.initMocks(this); Column col1 = new Column("COL1", String.class, false, false, true, null); Column col2 = new Column("COL2", String.class, false, false, false, null); metaDataMock = new MetaData(asList(col1, col2), false, false, false, false, false); when(delegateMock.getMetaData()).thenReturn(metaDataMock); when(delegateMock.getRows()).thenReturn( asList(new Object[] { "1", "2" }, new Object[] { "3", "4" })); container = new GenericVaadinContainer(delegateMock); } @Test public void shouldReturnPropertyIdsFromMetaData() { when(delegateMock.getMetaData()).thenReturn(metaDataMock); container = new GenericVaadinContainer(delegateMock); List<String> ids = asList("COL1", "COL2"); when(metaDataMock.getColumnNames()).thenReturn(ids); assertThat((List<String>) container.getContainerPropertyIds(), is(ids)); } @Test public void shouldReturnTypeFromMetaData() { when(delegateMock.getMetaData()).thenReturn(metaDataMock); container = new GenericVaadinContainer(delegateMock); MetaDataTest.mockType(metaDataMock, "COL1", String.class); assertThat((Class<String>) container.getType("COL1"), equalTo(String.class)); } @Test public void shouldCreateItemIdFromBackendRow() { GenericItemId itemId = container.createItemId(new Object[] { "abc", "def" }); assertThat(itemId.getId(), is(new Object[] { "abc" })); } @Test public void shouldCreateItemFromBackendRow() { GenericItem item = container.createItem(new GenericItemId( new Object[] { "def" }), new Object[] { "abc", "def" }); assertThat((String) item.getItemProperty("COL1").getValue(), is("abc")); assertThat((String) item.getItemProperty("COL2").getValue(), is("def")); } @Test public void shouldStoreItem() { assertThat( (String) container .getUnfilteredItem( new GenericItemId(new Object[] { "3" })) .getItemProperty("COL2").getValue(), is("4")); } @Test public void shouldAddNewItem() { GenericItemId newItemId = (GenericItemId) container.addItem(); assertThat(newItemId.isNewId(), is(true)); } @Test public void shouldNotBeModifiedAfterConstruction() { assertThat(container.isModified(), is(false)); } @Test public void shouldBeModifiedAfterAddingNewItem() { container.addItem(); assertThat(container.isModified(), is(true)); } @Test public void shouldBeModifiedAfterDeletingItem() { GenericItemId deletedItemId = new GenericItemId(new Object[] { "3" }); container.removeItem(deletedItemId); assertThat(container.isModified(), is(true)); } @Test public void shouldBeModifiedAfterChangingItem() { GenericItem changedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); changedItem.getItemProperty("COL2").setValue("5"); assertThat(container.isModified(), is(true)); } @Test public void shouldDeleteExistingItem() { GenericItemId deletedItemId = new GenericItemId(new Object[] { "3" }); container.removeItem(deletedItemId); assertThat(container.getItem(deletedItemId), nullValue()); } @Test public void shouldDeleteAddedItem() { Object newItem = container.addItem(); container.removeItem(newItem); container.commit(); verify(delegateMock, never()).update(anyList(), any(UpdateContext.class)); } @Test public void shouldReturnDeletedFlag() { GenericItemId deletedItemId = new GenericItemId(new Object[] { "3" }); container.removeItem(deletedItemId); assertThat(container.isDeleted(deletedItemId), is(true)); } @Test public void shouldCallDelegateOnDeletedItem() { GenericItemId deletedItemId = new GenericItemId(new Object[] { "3" }); GenericItem deletedItem = container.getItem(deletedItemId); container.removeItem(deletedItemId); container.commit(); verify(delegateMock).update(eq(asList(deletedItem)), any(UpdateContext.class)); } @Test public void shouldSortDescending() { container.sort(new Object[] { "COL2" }, new boolean[] { false }); container.commit(); GenericItemId firstItemId = container.firstItemId(); assertThat( (String) container.getItem(firstItemId).getItemProperty("COL2") .getValue(), is("4")); assertThat( (String) container.getItem(container.nextItemId(firstItemId)) .getItemProperty("COL2").getValue(), is("2")); } @Test public void shouldKeepModifiedItemsOnRefresh() { GenericItem changedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); changedItem.getItemProperty("COL2").setValue("5"); container.refresh(); GenericItem refreshedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); assertThat((String) refreshedItem.getItemProperty("COL2").getValue(), is("5")); } @Test public void shouldDropOrphanedModifiedItemsOnRefresh() { GenericItem changedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); changedItem.getItemProperty("COL2").setValue("5"); when(delegateMock.getRows()).thenReturn( singletonList(new Object[] { "1", "2" })); container.refresh(); assertThat(container.getUnfilteredItem(new GenericItemId( new Object[] { "3" })), nullValue()); container.commit(); verify(delegateMock, never()).update(anyList(), any(UpdateContext.class)); } @Test public void shouldCallDelegateUpdateWithNewItemsOnCommit() { GenericItemId newItemId = (GenericItemId) container.addItem(); GenericItem newItem = container.getItem(newItemId); container.commit(); verify(delegateMock).update(eq(asList(newItem)), any(UpdateContext.class)); } @Test public void shouldFireContentChangeEventOnCommit() { container.addItemSetChangeListener(listenerMock); container.commit(); verify(listenerMock).containerItemSetChange( itemSetChangeEventCaptor.capture()); assertThat(itemSetChangeEventCaptor.getValue().getContainer(), is((Container) container)); } @Test public void shouldRefreshTheContainerAfterUpdateIfRequestedByDelegate() { reset(delegateMock); container.addItem(); doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { UpdateContext context = (UpdateContext) invocation .getArguments()[1]; context.requireRefresh(); return null; } }).when(delegateMock).update(any(List.class), any(UpdateContext.class)); container.commit(); verify(delegateMock).getRows(); } @Test public void shouldCallDelegateUpdateWithModifiedItemsOnCommit() { GenericItem changedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); changedItem.getItemProperty("COL2").setValue("5"); container.commit(); verify(delegateMock).update(eq(asList(changedItem)), any(UpdateContext.class)); } @Test public void shouldFilterRows() { container.addContainerFilter(new Compare.Equal("COL1", "1")); assertThat(container.firstItemId(), is(new GenericItemId( new Object[] { "1" }))); assertThat(container.nextItemId(container.firstItemId()), nullValue()); } @Test public void shouldNotFilterNewRows() { GenericItemId newItemId = (GenericItemId) container.addItem(); container.addContainerFilter(new Compare.Equal("COL1", "OTHER")); assertThat(container.firstItemId(), is(newItemId)); } @Test public void shouldNotCommitAddedItemsTwice() { GenericItemId newItemId = (GenericItemId) container.addItem(); GenericItem newItem = container.getItem(newItemId); container.commit(); container.commit(); verify(delegateMock, times(1)).update(eq(asList(newItem)), any(UpdateContext.class)); } @Test public void shouldNotCommitModifiedItemsTwice() { GenericItem changedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); changedItem.getItemProperty("COL2").setValue("5"); container.commit(); container.commit(); verify(delegateMock, times(1)).update(eq(asList(changedItem)), any(UpdateContext.class)); } @Test public void shouldNotCommitDeletedItemsTwice() { GenericItemId deletedItemId = new GenericItemId(new Object[] { "3" }); GenericItem deletedItem = container.getItem(deletedItemId); container.removeItem(deletedItemId); container.commit(); container.commit(); verify(delegateMock, times(1)).update(eq(asList(deletedItem)), any(UpdateContext.class)); } @Test public void shouldClearModificationsOnRollback() { GenericItemId deletedItemId = new GenericItemId(new Object[] { "3" }); container.getItem(deletedItemId); GenericItem changedItem = container .getUnfilteredItem(new GenericItemId(new Object[] { "3" })); changedItem.getItemProperty("COL2").setValue("5"); GenericItemId newItemId = (GenericItemId) container.addItem(); container.getItem(newItemId); container.rollback(); container.commit(); assertThat(container.isModified(), is(false)); verify(delegateMock, never()).update(anyList(), any(UpdateContext.class)); changedItem = container.getUnfilteredItem(new GenericItemId( new Object[] { "3" })); assertThat((String) changedItem.getItemProperty("COL2").getValue(), is("4")); } }