package com.vaadin.tests.data.selection; import java.util.List; import java.util.concurrent.Future; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.vaadin.data.provider.ReplaceListDataProvider; import com.vaadin.data.provider.StrBean; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinSession; import com.vaadin.tests.util.AlwaysLockedVaadinSession; import com.vaadin.ui.Grid; import com.vaadin.ui.Grid.SelectionMode; import com.vaadin.ui.UI; import com.vaadin.ui.components.grid.GridSelectionModel; public class GridStaleElementTest { private Grid<StrBean> grid = new Grid<>(); private ReplaceListDataProvider dataProvider; private List<StrBean> data = StrBean.generateRandomBeans(2); @Before public void setUp() { // Make Grid attached to UI to make DataCommunicator do it's magic. final VaadinSession application = new AlwaysLockedVaadinSession(null); final UI uI = new UI() { @Override protected void init(VaadinRequest request) { } @Override public VaadinSession getSession() { return application; } @Override public Future<Void> access(Runnable runnable) { runnable.run(); return null; } }; uI.setContent(grid); uI.attach(); dataProvider = new ReplaceListDataProvider(data); grid.setDataProvider(dataProvider); } @Test public void testGridMultiSelectionUpdateOnRefreshItem() { StrBean toReplace = data.get(0); assertNotStale(toReplace); GridSelectionModel<StrBean> model = grid .setSelectionMode(SelectionMode.MULTI); model.select(toReplace); StrBean replacement = new StrBean("Replacement bean", toReplace.getId(), -1); dataProvider.refreshItem(replacement); assertStale(toReplace); model.getSelectedItems() .forEach(item -> Assert.assertFalse( "Selection should not contain stale values", dataProvider.isStale(item))); Object oldId = dataProvider.getId(toReplace); Assert.assertTrue("Selection did not contain an item with matching Id.", model.getSelectedItems().stream().map(dataProvider::getId) .anyMatch(oldId::equals)); Assert.assertTrue("Stale element is not considered selected.", model.isSelected(toReplace)); } @Test public void testGridSingleSelectionUpdateOnRefreshItem() { StrBean toReplace = data.get(0); assertNotStale(toReplace); GridSelectionModel<StrBean> model = grid .setSelectionMode(SelectionMode.SINGLE); model.select(toReplace); StrBean replacement = new StrBean("Replacement bean", toReplace.getId(), -1); dataProvider.refreshItem(replacement); assertStale(toReplace); model.getSelectedItems() .forEach(i -> Assert.assertFalse( "Selection should not contain stale values", dataProvider.isStale(i))); Assert.assertTrue("Selection did not contain an item with matching Id.", model.getSelectedItems().stream().map(dataProvider::getId) .filter(i -> dataProvider.getId(toReplace).equals(i)) .findFirst().isPresent()); Assert.assertTrue("Stale element is not considered selected.", model.isSelected(toReplace)); } private void assertNotStale(StrBean bean) { Assert.assertFalse( "Bean with id " + bean.getId() + " should not be stale.", dataProvider.isStale(bean)); } private void assertStale(StrBean bean) { Assert.assertTrue("Bean with id " + bean.getId() + " should be stale.", dataProvider.isStale(bean)); } }