From 064d64ea14f4315eb0f63f27113bf7c77e9fc9f1 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Fri, 2 Jan 2026 19:16:58 +0400 Subject: [PATCH 1/4] Revert "fix: Ignore ComboBox client-side filter in data view items getters (#336)" This reverts commit 6565c016ae8d63050c95d6356030d8f78dc73695. --- .../combobox/dataview/ComboBoxDataView.java | 8 +- .../dataview/ComboBoxLazyDataView.java | 10 +- .../dataview/ComboBoxListDataView.java | 12 +- .../combobox/dataview/ItemFetchHelper.java | 120 ---------------- .../dataview/ComboBoxDataViewTest.java | 91 +++--------- .../dataview/ComboBoxDataViewTestHelper.java | 50 ------- .../dataview/ComboBoxLazyDataViewTest.java | 132 ++---------------- .../dataview/ComboBoxListDataViewTest.java | 29 +++- 8 files changed, 73 insertions(+), 379 deletions(-) delete mode 100644 vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ItemFetchHelper.java delete mode 100644 vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTestHelper.java diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java index 315b7183ac7..fd2413d9d7e 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java @@ -72,7 +72,10 @@ public ComboBoxDataView(DataCommunicator dataCommunicator, */ @Override public T getItem(int index) { - return ItemFetchHelper.getItem(dataCommunicator, index); + // TODO: change the implementation to make the returned item not depend + // on client-side filter applied + // https://github.com/vaadin/vaadin-flow-components/issues/282 + return dataCommunicator.getItem(index); } @Override @@ -91,7 +94,8 @@ protected Class getSupportedDataProviderType() { */ @Override public Stream getItems() { - return ItemFetchHelper.getItems(dataCommunicator); + return dataCommunicator.getDataProvider() + .fetch(dataCommunicator.buildQuery(0, Integer.MAX_VALUE)); } @Override diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java index e1301eff714..35cb92c9fe4 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java @@ -149,7 +149,10 @@ public Registration addItemCountChangeListener( */ @Override public T getItem(int index) { - return ItemFetchHelper.getItem(getDataCommunicator(), index); + // TODO: change the implementation to make the returned item not depend + // on client-side filter applied + // https://github.com/vaadin/vaadin-flow-components/issues/282 + return super.getItem(index); } /** @@ -163,6 +166,9 @@ public T getItem(int index) { */ @Override public Stream getItems() { - return ItemFetchHelper.getItems(getDataCommunicator()); + // TODO: change the implementation to make the returned item not depend + // on client-side filter applied + // https://github.com/vaadin/vaadin-flow-components/issues/282 + return super.getItems(); } } diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java index e3fda53d955..8ca7baa3792 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java @@ -26,6 +26,7 @@ import com.vaadin.flow.data.provider.ItemCountChangeEvent; import com.vaadin.flow.function.SerializableBiConsumer; import com.vaadin.flow.function.SerializableComparator; +import com.vaadin.flow.data.provider.Query; import com.vaadin.flow.function.SerializablePredicate; import com.vaadin.flow.shared.Registration; @@ -74,8 +75,7 @@ public ComboBoxListDataView(DataCommunicator dataCommunicator, @SuppressWarnings("unchecked") @Override public Stream getItems() { - return getDataProvider() - .fetch(ItemFetchHelper.getQuery(dataCommunicator)); + return getDataProvider().fetch(getQuery()); } /** @@ -93,8 +93,7 @@ public Stream getItems() { @SuppressWarnings("unchecked") @Override public int getItemCount() { - return getDataProvider() - .size(ItemFetchHelper.getQuery(dataCommunicator)); + return getDataProvider().size(getQuery()); } @Override @@ -192,4 +191,9 @@ public ComboBoxListDataView removeFilters() { public ComboBoxListDataView setFilter(SerializablePredicate filter) { return (ComboBoxListDataView) super.setFilter(filter); } + + @SuppressWarnings("rawtypes") + private Query getQuery() { + return dataCommunicator.buildQuery(0, Integer.MAX_VALUE); + } } diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ItemFetchHelper.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ItemFetchHelper.java deleted file mode 100644 index d9c518abe60..00000000000 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ItemFetchHelper.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2000-2026 Vaadin Ltd. - * - * Licensed 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 com.vaadin.flow.component.combobox.dataview; - -import java.io.Serializable; -import java.util.stream.Stream; - -import com.vaadin.flow.data.provider.DataCommunicator; -import com.vaadin.flow.data.provider.Query; - -/** - * Helper methods for fetching the ComboBox's items in data views. - */ -final class ItemFetchHelper implements Serializable { - - private ItemFetchHelper() { - } - - /** - * Gets the items available in the ComboBox's service-side by requesting the - * data provider directly, and not using the data communicator's cache. - * - * @param dataCommunicator - * data communicator of the ComboBox - * @param - * item type - * @return stream of items available for the ComboBox - */ - @SuppressWarnings("unchecked") - static Stream getItems(DataCommunicator dataCommunicator) { - return dataCommunicator.getDataProvider() - .fetch(getQuery(dataCommunicator)); - } - - /** - * Gets the item at the given index from the data available in the - * ComboBox's server-side by requesting the data provider directly, and not - * using the data communicator's cache. - * - * @param dataCommunicator - * data communicator of the ComboBox - * @param index - * item index number - * @param - * item type - * @return item on index - * @throws IndexOutOfBoundsException - * requested index is outside of the data set - */ - @SuppressWarnings("unchecked") - static T getItem(DataCommunicator dataCommunicator, int index) { - if (index < 0) { - throw new IndexOutOfBoundsException("Index must be non-negative"); - } - if (dataCommunicator.isDefinedSize()) { - final int itemCount = dataCommunicator.getDataProviderSize(); - if (itemCount == 0) { - throw new IndexOutOfBoundsException(String - .format("Requested index %d on empty data.", index)); - } else if (index >= itemCount) { - throw new IndexOutOfBoundsException(String.format( - "Given index %d should be less than the item count '%d'", - index, itemCount)); - } - } - return (T) dataCommunicator.getDataProvider() - .fetch(getQuery(dataCommunicator, index, 1)).findFirst() - .orElse(null); - } - - /** - * Creates a query to be used by data provider for fetching a whole range of - * items taking into account the filtering and sorting of a given data - * communicator. - * - * @param dataCommunicator - * data communicator of the ComboBox - * @param - * item type - * @return query object - */ - @SuppressWarnings("rawtypes") - static Query getQuery(DataCommunicator dataCommunicator) { - return getQuery(dataCommunicator, 0, Integer.MAX_VALUE); - } - - /** - * Creates a query to be used by data provider for fetching a given range of - * items taking into account the filtering and sorting of a given data - * communicator. - * - * @param dataCommunicator - * data communicator of the ComboBox - * @param offset - * offset for data request - * @param limit - * number of items to fetch - * @param - * item type - * @return query object - */ - @SuppressWarnings("rawtypes") - static Query getQuery(DataCommunicator dataCommunicator, int offset, - int limit) { - return dataCommunicator.buildQuery(offset, limit); - } -} diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTest.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTest.java index 2b4ea0b6372..46729b39dcc 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTest.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTest.java @@ -42,12 +42,10 @@ import com.vaadin.flow.shared.Registration; import com.vaadin.tests.dataprovider.AbstractComponentDataViewTest; import com.vaadin.tests.dataprovider.CustomInMemoryDataProvider; -import com.vaadin.tests.dataprovider.MockUI; public class ComboBoxDataViewTest extends AbstractComponentDataViewTest { private ComboBox comboBox; - private MockUI ui; @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -57,8 +55,6 @@ public void init() { items = new ArrayList<>(Arrays.asList("first", "middle", "last")); dataProvider = new CustomInMemoryDataProvider<>(items); comboBox = getComponent(); - ui = new MockUI(); - ui.add(comboBox); dataView = comboBox.setItems(dataProvider, textFilter -> item -> true); component = comboBox; } @@ -147,7 +143,22 @@ public Registration addDataProviderListener( Assert.assertFalse(keyMapper.has(new Item(1L, "non-present"))); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Test + public void getItem_itemRequested_dataCommunicatorInvoked() { + // Open the comboBox explicitly, because it is not initialized + // eagerly with in-memory data provider + comboBox.setOpened(true); + DataCommunicator dataCommunicator = Mockito + .mock(DataCommunicator.class); + Mockito.when(dataCommunicator.getDataProvider()) + .thenReturn((DataProvider) DataProvider.ofItems()); + ComboBoxDataView dataView = new ComboBoxDataView<>( + dataCommunicator, new ComboBox<>()); + dataView.getItem(42); + Mockito.verify(dataCommunicator).getItem(42); + } + @Test public void setInMemoryDataProvider_convertsToGenericDataProviderAndAppliesFilterCorrectly() { final String[] items = { "bar", "banana", "iguana" }; @@ -256,76 +267,6 @@ public void setInMemoryDataProviderWithNoConverter_throws() { component.setItems(dataProvider); } - @Test - public void getItems_noClientSideFilter_returnsNotFilteredItems() { - Stream filteredItems = dataView.getItems(); - - Assert.assertArrayEquals("Unexpected items obtained", - new String[] { "first", "middle", "last" }, - filteredItems.toArray()); - } - - @Test - public void getItems_withClientSideFilter_returnsNotFilteredItems() { - ComboBoxDataViewTestHelper.setClientSideFilter(comboBox, "middle"); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); - - Stream filteredItems = dataView.getItems(); - - // Check that the client filter does not affect the item handling API - // in data view - Assert.assertArrayEquals("The client filter shouldn't impact the items", - new String[] { "first", "middle", "last" }, - filteredItems.toArray()); - - // Reset the client filter and check again - ComboBoxDataViewTestHelper.setClientSideFilter(comboBox, ""); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); - filteredItems = dataView.getItems(); - Assert.assertArrayEquals( - "The client filter reset shouldn't impact the items", - new String[] { "first", "middle", "last" }, - filteredItems.toArray()); - } - - @Test - public void getItem_noClientSideFilter_returnsItemFromNotFilteredSet() { - Assert.assertEquals("Invalid item on index 1", "middle", - dataView.getItem(1)); - } - - @Test - public void getItem_withClientSideFilter_returnsItemFromNotFilteredSet() { - ComboBoxDataViewTestHelper.setClientSideFilter(comboBox, "middle"); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); - Assert.assertEquals("Invalid item on index 0", "first", - dataView.getItem(0)); - } - - @Test - public void getItem_negativeIndex_throws() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage("Index must be non-negative"); - dataView.getItem(-1); - } - - @Test - public void getItem_emptyData_throws() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage("Requested index 0 on empty data."); - dataView = comboBox.setItems(); - - dataView.getItem(0); - } - - @Test - public void getItem_outsideOfRange_throws() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage( - "Given index 3 should be less than the item count '3'"); - dataView.getItem(3); - } - @Override protected ComboBox getComponent() { return new ComboBox<>(); diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTestHelper.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTestHelper.java deleted file mode 100644 index 092925f6842..00000000000 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataViewTestHelper.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2000-2026 Vaadin Ltd. - * - * Licensed 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 com.vaadin.flow.component.combobox.dataview; - -import java.lang.reflect.Method; - -import com.vaadin.flow.component.UI; -import com.vaadin.flow.component.combobox.ComboBox; -import com.vaadin.flow.component.combobox.ComboBoxBase; - -final class ComboBoxDataViewTestHelper { - - private ComboBoxDataViewTestHelper() { - } - - static void setClientSideFilter(ComboBox comboBox, - String clientFilter) { - try { - // Reset the client filter on server side as though it's sent from - // client - Method setViewportRangeMethod = ComboBoxBase.class - .getDeclaredMethod("setViewportRange", int.class, int.class, - String.class); - setViewportRangeMethod.setAccessible(true); - setViewportRangeMethod.invoke(comboBox, 0, comboBox.getPageSize(), - clientFilter); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - static void fakeClientCommunication(UI ui) { - ui.getInternals().getStateTree().runExecutionsBeforeClientResponse(); - ui.getInternals().getStateTree().collectChanges(ignore -> { - }); - } -} diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataViewTest.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataViewTest.java index 344d6a6b542..31a304f48ba 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataViewTest.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataViewTest.java @@ -19,8 +19,6 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import java.util.stream.Stream; import org.junit.Assert; @@ -37,7 +35,6 @@ import com.vaadin.flow.data.provider.DataCommunicator; import com.vaadin.flow.data.provider.DataKeyMapper; import com.vaadin.flow.data.provider.DataProvider; -import com.vaadin.flow.function.SerializableConsumer; import com.vaadin.tests.dataprovider.MockUI; import tools.jackson.databind.JsonNode; @@ -56,19 +53,6 @@ public class ComboBoxLazyDataViewTest { private MockUI ui; private DataCommunicator dataCommunicator; private ArrayUpdater arrayUpdater; - private SerializableConsumer> filterSlot; - - private CallbackDataProvider undefinedItemCountDataProvider = DataProvider - .fromFilteringCallbacks( - query -> IntStream.range(0, 1000) - .mapToObj(index -> "Item " + index) - .filter(item -> item - .contains(query.getFilter().orElse(""))) - .skip(query.getOffset()).limit(query.getLimit()), - query -> { - Assert.fail("No item count query expected"); - return 0; - }); @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -79,12 +63,8 @@ public void setup() { .fromFilteringCallbacks(query -> { query.getOffset(); query.getLimit(); - return Stream.of(items).filter( - item -> item.contains(query.getFilter().orElse(""))) - .skip(query.getOffset()).limit(query.getLimit()); - }, query -> (int) Stream.of(items).filter( - item -> item.contains(query.getFilter().orElse(""))) - .count()); + return Stream.of(items); + }, query -> 3); comboBox = new ComboBox<>(); ui = new MockUI(); @@ -115,8 +95,7 @@ public void commit(int updateId) { dataCommunicator = new DataCommunicator<>((item, jsonObject) -> { }, arrayUpdater, null, comboBox.getElement().getNode()); - // set combo box client-side filter to empty by default - filterSlot = dataCommunicator.setDataProvider(dataProvider, "", true); + dataCommunicator.setDataProvider(dataProvider, null); dataView = new ComboBoxLazyDataView<>(dataCommunicator, comboBox); } @@ -139,21 +118,21 @@ public void setItemCountCallback_setAnotherCountCallback_itemCountChanged() { event -> itemCount.set(event.getItemCount())); dataCommunicator.setViewportRange(0, 50); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); + fakeClientCommunication(); Assert.assertEquals("Expected 3 items before setItemCountCallback()", 3, itemCount.getAndSet(0)); dataView.setItemCountCallback(query -> 2); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); + fakeClientCommunication(); Assert.assertEquals("Expected 2 items after setItemCountCallback()", 2, itemCount.get()); } @Test - public void getLazyDataView_defaultDataProvider_dataViewReturned() { + public void getLazyDataView_defaulDataProvider_dataViewReturned() { ComboBox comboBox = new ComboBox<>(); ComboBoxLazyDataView lazyDataView = comboBox.getLazyDataView(); @@ -237,101 +216,10 @@ public void getItemCountEstimateIncrease_lazyAPIWithDefaultDataProvider_throws() comboBox.getLazyDataView().getItemCountEstimateIncrease(); } - @Test - public void getItems_withDefinedItemCountAndNoClientSideFilter_returnsNotFilteredItems() { - Stream filteredItems = dataView.getItems(); - - Assert.assertArrayEquals("Unexpected items obtained", - new String[] { "foo", "bar", "baz" }, filteredItems.toArray()); - } - - @Test - public void getItems_withUnknownItemCountAndNoClientSideFilter_returnsNotFilteredItems() { - dataCommunicator.setDataProvider(undefinedItemCountDataProvider, "", - true); - dataView.setItemCountUnknown(); - - List items = dataView.getItems().collect(Collectors.toList()); - Assert.assertEquals(1000, items.size()); - Assert.assertEquals("Item 0", items.get(0)); - Assert.assertEquals("Item 999", items.get(items.size() - 1)); - } - - @Test - public void getItem_withDefinedItemCountAndNoClientSideFilter_returnsItemFromNotFilteredSet() { - Assert.assertEquals("Invalid item on index 1", "bar", - dataView.getItem(1)); - } - - @Test - public void getItem_withUnknownItemCountAndNoClientSideFilter_returnsItemFromNotFilteredSet() { - dataCommunicator.setDataProvider(undefinedItemCountDataProvider, "", - true); - dataView.setItemCountUnknown(); - - Assert.assertEquals("Invalid item on index 777", "Item 777", - dataView.getItem(777)); - } - - @Test - public void getItem_negativeIndex_throws() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage("Index must be non-negative"); - dataView.getItem(-1); - } - - @Test - public void getItem_definedItemCountAndEmptyData_throws() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage("Requested index 0 on empty data."); - dataCommunicator.setDataProvider(DataProvider.fromCallbacks(query -> { - query.getOffset(); - query.getLimit(); - return Stream.empty(); - }, query -> 0), null); - - dataView.getItem(0); - } - - @Test - public void getItem_undefinedItemCountAndEmptyData_returnEmptyItem() { - dataCommunicator.setDataProvider(DataProvider.fromCallbacks(query -> { - query.getOffset(); - query.getLimit(); - return Stream.empty(); - }, query -> 0), null); - dataView.setItemCountUnknown(); - - Assert.assertNull(dataView.getItem(1234567)); - } - - @Test - public void getItem_definedItemCountAndOutsideOfRange_throws() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage( - "Given index 3 should be less than the item count '3'"); - dataView.getItem(3); - } - - @Test - public void getItem_undefinedItemCountAndOutsideOfRange_returnEmptyItem() { - dataCommunicator.setDataProvider(undefinedItemCountDataProvider, "", - true); - dataView.setItemCountUnknown(); - - Assert.assertNull(dataView.getItem(1234567)); - } - - @Test - public void getItem_withCountCallbackAndOutsideOfRange_throw() { - expectedException.expect(IndexOutOfBoundsException.class); - expectedException.expectMessage( - "Given index 1234567 should be less than the item count '1000'"); - dataCommunicator.setDataProvider(undefinedItemCountDataProvider, "", - true); - dataView.setItemCountCallback(query -> 1000); - - dataView.getItem(1234567); + private void fakeClientCommunication() { + ui.getInternals().getStateTree().runExecutionsBeforeClientResponse(); + ui.getInternals().getStateTree().collectChanges(ignore -> { + }); } @Test diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java index d7095353e3e..4835c6cb7b8 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java @@ -15,6 +15,7 @@ */ package com.vaadin.flow.component.combobox.dataview; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -60,10 +61,10 @@ public void getItems_withInMemoryAndTextFilter_itemsFilteredWithOnlyInMemoryFilt items = Arrays.asList("foo", "bar", "banana"); dataView = component.setItems(items); - ComboBoxDataViewTestHelper.setClientSideFilter(component, "ba"); + setClientFilter(component, "ba"); // Close combo box drop down to trigger the filter erase component.setOpened(false); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); + fakeClientCommunication(); Stream filteredItems = dataView.getItems(); @@ -98,10 +99,10 @@ public void getItemCount_withInMemoryAndTextFilter_itemsFilteredWithOnlyInMemory items = Arrays.asList("foo", "bar", "banana"); dataView = component.setItems(items); - ComboBoxDataViewTestHelper.setClientSideFilter(component, "ba"); + setClientFilter(component, "ba"); // Close combo box drop down to trigger the filter erase component.setOpened(false); - ComboBoxDataViewTestHelper.fakeClientCommunication(ui); + fakeClientCommunication(); int itemCount = dataView.getItemCount(); @@ -152,4 +153,24 @@ protected HasListDataView> getComponent() { return new ComboBox<>(); } + private void setClientFilter(ComboBox comboBox, + String clientFilter) { + try { + // Reset the client filter on server side as though it's sent from + // client + Method setRequestedRangeMethod = ComboBox.class.getDeclaredMethod( + "setRequestedRange", int.class, int.class, String.class); + setRequestedRangeMethod.setAccessible(true); + setRequestedRangeMethod.invoke(comboBox, 0, comboBox.getPageSize(), + clientFilter); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private void fakeClientCommunication() { + ui.getInternals().getStateTree().runExecutionsBeforeClientResponse(); + ui.getInternals().getStateTree().collectChanges(ignore -> { + }); + } } From 93111a458fce9cf0853f673d7da41d42864546b1 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Fri, 2 Jan 2026 19:26:07 +0400 Subject: [PATCH 2/4] format code --- .../component/combobox/dataview/ComboBoxDataView.java | 4 ++-- .../combobox/dataview/ComboBoxLazyDataView.java | 8 ++++---- .../combobox/dataview/ComboBoxListDataView.java | 2 +- .../combobox/dataview/ComboBoxListDataViewTest.java | 10 ++++++---- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java index fd2413d9d7e..9d3d66ddc4a 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxDataView.java @@ -73,8 +73,8 @@ public ComboBoxDataView(DataCommunicator dataCommunicator, @Override public T getItem(int index) { // TODO: change the implementation to make the returned item not depend - // on client-side filter applied - // https://github.com/vaadin/vaadin-flow-components/issues/282 + // on client-side filter applied + // https://github.com/vaadin/vaadin-flow-components/issues/282 return dataCommunicator.getItem(index); } diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java index 35cb92c9fe4..13dc91c5d99 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxLazyDataView.java @@ -150,8 +150,8 @@ public Registration addItemCountChangeListener( @Override public T getItem(int index) { // TODO: change the implementation to make the returned item not depend - // on client-side filter applied - // https://github.com/vaadin/vaadin-flow-components/issues/282 + // on client-side filter applied + // https://github.com/vaadin/vaadin-flow-components/issues/282 return super.getItem(index); } @@ -167,8 +167,8 @@ public T getItem(int index) { @Override public Stream getItems() { // TODO: change the implementation to make the returned item not depend - // on client-side filter applied - // https://github.com/vaadin/vaadin-flow-components/issues/282 + // on client-side filter applied + // https://github.com/vaadin/vaadin-flow-components/issues/282 return super.getItems(); } } diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java index 8ca7baa3792..d845020e21f 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/main/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataView.java @@ -24,9 +24,9 @@ import com.vaadin.flow.data.provider.DataProvider; import com.vaadin.flow.data.provider.IdentifierProvider; import com.vaadin.flow.data.provider.ItemCountChangeEvent; +import com.vaadin.flow.data.provider.Query; import com.vaadin.flow.function.SerializableBiConsumer; import com.vaadin.flow.function.SerializableComparator; -import com.vaadin.flow.data.provider.Query; import com.vaadin.flow.function.SerializablePredicate; import com.vaadin.flow.shared.Registration; diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java index 4835c6cb7b8..a6d4481296b 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow/src/test/java/com/vaadin/flow/component/combobox/dataview/ComboBoxListDataViewTest.java @@ -26,6 +26,7 @@ import org.junit.Test; import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.combobox.ComboBoxBase; import com.vaadin.flow.data.provider.DataCommunicator; import com.vaadin.flow.data.provider.DataKeyMapper; import com.vaadin.flow.data.provider.HasListDataView; @@ -158,10 +159,11 @@ private void setClientFilter(ComboBox comboBox, try { // Reset the client filter on server side as though it's sent from // client - Method setRequestedRangeMethod = ComboBox.class.getDeclaredMethod( - "setRequestedRange", int.class, int.class, String.class); - setRequestedRangeMethod.setAccessible(true); - setRequestedRangeMethod.invoke(comboBox, 0, comboBox.getPageSize(), + Method setViewportRangeMethod = ComboBoxBase.class + .getDeclaredMethod("setViewportRange", int.class, int.class, + String.class); + setViewportRangeMethod.setAccessible(true); + setViewportRangeMethod.invoke(comboBox, 0, comboBox.getPageSize(), clientFilter); } catch (Exception e) { throw new RuntimeException(e); From b0a9846ad855df1e69f2ca5601bf3bba04a3dc1f Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Sat, 3 Jan 2026 19:30:17 +0400 Subject: [PATCH 3/4] remove more wrong tests --- .../test/ComboBoxLazyDataViewPage.java | 75 -------- .../test/ComboBoxListDataViewPage.java | 15 +- .../combobox/test/ComboBoxLazyDataViewIT.java | 174 ------------------ .../combobox/test/ComboBoxListDataViewIT.java | 92 --------- .../component/combobox/test/FilteringIT.java | 19 ++ 5 files changed, 20 insertions(+), 355 deletions(-) delete mode 100644 vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewPage.java delete mode 100644 vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewIT.java diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewPage.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewPage.java deleted file mode 100644 index 1604e70b45f..00000000000 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewPage.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2000-2026 Vaadin Ltd. - * - * Licensed 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 com.vaadin.flow.component.combobox.test; - -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import com.vaadin.flow.component.combobox.ComboBox; -import com.vaadin.flow.component.combobox.dataview.ComboBoxLazyDataView; -import com.vaadin.flow.component.html.Div; -import com.vaadin.flow.component.html.NativeButton; -import com.vaadin.flow.component.html.Span; -import com.vaadin.flow.router.Route; - -@Route("vaadin-combo-box/combobox-lazy-data-view-page") -public class ComboBoxLazyDataViewPage extends Div { - - static final String COMBO_BOX_ID = "combo-box-get-items-page"; - static final String ITEMS_LIST_ID = "items-list"; - static final String GET_ITEMS_BUTTON_ID = "get-items-button"; - static final String GET_ITEM_BUTTON_ID = "get-item-button"; - static final String SWITCH_TO_UNKNOWN_COUNT_BUTTON_ID = "switch-to-unknown-button"; - - public ComboBoxLazyDataViewPage() { - - ComboBox comboBox = new ComboBox<>(); - ComboBoxLazyDataView dataView = comboBox.setItems( - query -> IntStream.range(0, 1000) - .mapToObj(index -> "Item " + index) - .filter(item -> item - .contains(query.getFilter().orElse(""))) - .skip(query.getOffset()).limit(query.getLimit()), - query -> (int) IntStream.range(0, 1000) - .mapToObj(index -> "Item " + index) - .filter(item -> item - .contains(query.getFilter().orElse(""))) - .count()); - - comboBox.setId(COMBO_BOX_ID); - - Span itemsList = new Span("Items shown here"); - itemsList.setId(ITEMS_LIST_ID); - - NativeButton getItemsButton = new NativeButton("Get Items", click -> { - itemsList.setText( - dataView.getItems().collect(Collectors.joining(","))); - }); - getItemsButton.setId(GET_ITEMS_BUTTON_ID); - - NativeButton getItemButton = new NativeButton("Get Item", - click -> itemsList.setText(dataView.getItem(0))); - getItemButton.setId(GET_ITEM_BUTTON_ID); - - NativeButton switchToUnknown = new NativeButton( - "Switch To Unknown Item Count", - click -> dataView.setItemCountUnknown()); - switchToUnknown.setId(SWITCH_TO_UNKNOWN_COUNT_BUTTON_ID); - - add(comboBox, switchToUnknown, getItemButton, getItemsButton, - itemsList); - } -} diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java index a8d68b41c4d..8f0265f2e28 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java @@ -42,8 +42,6 @@ public class ComboBoxListDataViewPage extends Div { static final String SHOW_ITEM_DATA = "showItemData"; static final String SHOW_NEXT_DATA = "showNextData"; static final String SHOW_PREVIOUS_DATA = "showPreviousData"; - static final String SHOW_ITEM_COUNT = "showItemCount"; - static final String SHOW_ITEMS = "showItems"; static final String AGE_FILTER = "ageFilter"; static final String REMOVE_ITEM = "removeItem"; static final String REVERSE_SORTING = "reverseSorting"; @@ -96,17 +94,6 @@ public ComboBoxListDataViewPage() { .getItem(itemSelect.getValue()).getFirstName())); showItemData.setId(SHOW_ITEM_DATA); - NativeButton showItemCount = new NativeButton("Show Item Count", - click -> count - .setText(String.valueOf(dataView.getItemCount()))); - showItemCount.setId(SHOW_ITEM_COUNT); - - NativeButton showItems = new NativeButton("Show Items", - click -> itemData - .setText(dataView.getItems().map(Person::toString) - .collect(Collectors.joining(",")))); - showItems.setId(SHOW_ITEMS); - // Navigation NativeButton showNextData = new NativeButton("Next person", event -> { itemData.setText("Item: " + dataView @@ -170,7 +157,7 @@ public ComboBoxListDataViewPage() { add(comboBox, itemSelect, filterByAge, reverseSorting, selectItemOnIndex, showItemData, showNextData, showPreviousData, - removePerson, count, itemData, showItemCount, showItems, + removePerson, count, itemData, secondComboBox); } diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewIT.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewIT.java deleted file mode 100644 index 108f07c5c11..00000000000 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxLazyDataViewIT.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright 2000-2026 Vaadin Ltd. - * - * Licensed 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 com.vaadin.flow.component.combobox.test; - -import static com.vaadin.flow.component.combobox.test.ComboBoxLazyDataViewPage.COMBO_BOX_ID; -import static com.vaadin.flow.component.combobox.test.ComboBoxLazyDataViewPage.GET_ITEMS_BUTTON_ID; -import static com.vaadin.flow.component.combobox.test.ComboBoxLazyDataViewPage.GET_ITEM_BUTTON_ID; -import static com.vaadin.flow.component.combobox.test.ComboBoxLazyDataViewPage.ITEMS_LIST_ID; -import static com.vaadin.flow.component.combobox.test.ComboBoxLazyDataViewPage.SWITCH_TO_UNKNOWN_COUNT_BUTTON_ID; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.openqa.selenium.By; - -import com.vaadin.flow.component.combobox.testbench.ComboBoxElement; -import com.vaadin.flow.testutil.TestPath; -import com.vaadin.testbench.TestBenchElement; - -@TestPath("vaadin-combo-box/combobox-lazy-data-view-page") -public class ComboBoxLazyDataViewIT extends AbstractComboBoxIT { - - private ComboBoxElement comboBox; - private TestBenchElement itemsList; - - @Before - public void init() { - open(); - waitUntil(driver -> findElements(By.tagName("vaadin-combo-box")) - .size() > 0); - comboBox = $(ComboBoxElement.class).id(COMBO_BOX_ID); - itemsList = $("span").id(ITEMS_LIST_ID); - } - - @Test - public void getItem_withDefinedItemCountAndClientSideFilter_returnsItemFromNotFilteredSet() { - comboBox.setFilter("777"); - - waitForItems(comboBox, items -> items.size() == 1 - && "Item 777".equals(getItemLabel(items, 0))); - - clickButton(GET_ITEM_BUTTON_ID); - - // Checks the filter has been cleared after closing the drop down. - // ComboBox clears the cache after closing, so the item's values are - // not checked here - waitForItems(comboBox, items -> items.size() == 1000); - - Assert.assertEquals("The client filter shouldn't impact the items", - "Item 0", itemsList.getText()); - - comboBox.openPopup(); - - waitForItems(comboBox, items -> items.size() == 1000 - && "Item 0".equals(getItemLabel(items, 0))); - - clickButton(GET_ITEM_BUTTON_ID); - - Assert.assertEquals("The client filter shouldn't impact the items", - "Item 0", itemsList.getText()); - } - - @Test - public void getItem_withUnknownItemCountAndClientSideFilter_returnsItemFromNotFilteredSet() { - clickButton(SWITCH_TO_UNKNOWN_COUNT_BUTTON_ID); - comboBox.setFilter("777"); - - waitForItems(comboBox, items -> items.size() == 1 - && "Item 777".equals(getItemLabel(items, 0))); - - clickButton(GET_ITEM_BUTTON_ID); - - // Checks the filter has been cleared after closing the drop down - // ComboBox clears the cache after closing, so the item's values are - // not checked here - waitForItems(comboBox, items -> items.size() == 200); - - Assert.assertEquals("The client filter shouldn't impact the items", - "Item 0", itemsList.getText()); - - comboBox.openPopup(); - - waitForItems(comboBox, items -> items.size() == 200 - && "Item 0".equals(getItemLabel(items, 0))); - - clickButton(GET_ITEM_BUTTON_ID); - - Assert.assertEquals("The client filter shouldn't impact the items", - "Item 0", itemsList.getText()); - } - - @Test - public void getItems_withUnknownItemCountAndClientSideFilter_returnsNotFilteredItems() { - clickButton(SWITCH_TO_UNKNOWN_COUNT_BUTTON_ID); - comboBox.setFilter("777"); - - waitForItems(comboBox, items -> items.size() == 1 - && "Item 777".equals(getItemLabel(items, 0))); - - clickButton(GET_ITEMS_BUTTON_ID); - - // Checks the filter has been cleared after closing the drop down - // ComboBox clears the cache after closing, so the item's values are - // not checked here - waitForItems(comboBox, items -> items.size() == 200); - - Assert.assertTrue("The client filter shouldn't impact the items", - itemsList.getText().startsWith("Item 0,Item 1,Item 2") - && itemsList.getText() - .endsWith("Item 997,Item 998,Item 999")); - - comboBox.openPopup(); - - waitForItems(comboBox, - items -> items.size() == 200 - && "Item 0".equals(getItemLabel(items, 0)) - && "Item 49".equals(getItemLabel(items, 49))); - - clickButton(GET_ITEMS_BUTTON_ID); - - Assert.assertTrue("The client filter shouldn't impact the items", - itemsList.getText().startsWith("Item 0,Item 1,Item 2") - && itemsList.getText() - .endsWith("Item 997,Item 998,Item 999")); - } - - @Test - public void getItems_withDefinedItemCountAndClientSideFilter_returnsNotFilteredItems() { - comboBox.setFilter("777"); - - waitForItems(comboBox, items -> items.size() == 1 - && "Item 777".equals(getItemLabel(items, 0))); - - clickButton(GET_ITEMS_BUTTON_ID); - - // Checks the filter has been cleared after closing the drop down - // ComboBox clears the cache after closing, so the item's values are - // not checked here - waitForItems(comboBox, items -> items.size() == 1000); - - Assert.assertTrue("The client filter shouldn't impact the items", - itemsList.getText().startsWith("Item 0,Item 1,Item 2") - && itemsList.getText() - .endsWith("Item 997,Item 998,Item 999")); - - comboBox.openPopup(); - - waitForItems(comboBox, - items -> items.size() == 1000 - && "Item 0".equals(getItemLabel(items, 0)) - && "Item 49".equals(getItemLabel(items, 49))); - - clickButton(GET_ITEMS_BUTTON_ID); - - Assert.assertTrue("The client filter shouldn't impact the items", - itemsList.getText().startsWith("Item 0,Item 1,Item 2") - && itemsList.getText() - .endsWith("Item 997,Item 998,Item 999")); - } - -} diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewIT.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewIT.java index 8bcf71fb1fb..58b9c1e4a2c 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewIT.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewIT.java @@ -24,8 +24,6 @@ import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.REMOVE_ITEM; import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.REVERSE_SORTING; import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.SECOND_COMBO_BOX_ID; -import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.SHOW_ITEMS; -import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.SHOW_ITEM_COUNT; import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.SHOW_ITEM_DATA; import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.SHOW_NEXT_DATA; import static com.vaadin.flow.component.combobox.test.ComboBoxListDataViewPage.SHOW_PREVIOUS_DATA; @@ -201,92 +199,6 @@ public void setSortOrder_itemsSortedByName() { assertItem(getItems(secondComboBox), 0, "Person 0 lastName"); } - @Test - public void getItemCount_withClientSideFilter_returnsItemFromNotFilteredSet() { - firstComboBox.setFilter("222"); - - waitForItems(firstComboBox, items -> items.size() == 1 - && "Person 222".equals(getItemLabel(items, 0))); - - clickButton(SHOW_ITEM_COUNT); - Assert.assertEquals("The client filter shouldn't impact the item count", - "250", getItemCount()); - - firstComboBox.openPopup(); - - waitForItems(firstComboBox, - items -> items.size() == 250 - && "Person 0".equals(getItemLabel(items, 0)) - && "Person 49".equals(getItemLabel(items, 49))); - - clickButton(SHOW_ITEM_COUNT); - Assert.assertEquals("The client filter shouldn't impact the item count", - "250", getItemCount()); - } - - @Test - public void getItem_withClientSideFilter_returnsItemFromNotFilteredSet() { - firstComboBox.setFilter("222"); - - waitForItems(firstComboBox, items -> items.size() == 1 - && "Person 222".equals(getItemLabel(items, 0))); - - selectItem(0); - showSelectedPerson(); - verifySelectedPerson(0); - - selectItem(249); - showSelectedPerson(); - verifySelectedPerson(249); - - firstComboBox.openPopup(); - - waitForItems(firstComboBox, - items -> items.size() == 250 - && "Person 0".equals(getItemLabel(items, 0)) - && "Person 49".equals(getItemLabel(items, 49))); - - selectItem(0); - showSelectedPerson(); - verifySelectedPerson(0); - - selectItem(249); - showSelectedPerson(); - verifySelectedPerson(249); - } - - @Test - public void getItems_withClientSideFilter_returnsNotFilteredItems() { - firstComboBox.setFilter("222"); - - waitForItems(firstComboBox, items -> items.size() == 1 - && "Person 222".equals(getItemLabel(items, 0))); - - clickButton(SHOW_ITEMS); - - // Checks the filter has been cleared after closing the drop down - // ComboBox clears the cache after closing, so the item's values are - // not checked here - waitForItems(firstComboBox, items -> items.size() == 250); - - Assert.assertTrue("The client filter shouldn't impact the items", - getItemData().startsWith("Person 0 lastName,Person 1 lastName") - && getItemData().endsWith("Person 249 lastName")); - - firstComboBox.openPopup(); - - waitForItems(firstComboBox, - items -> items.size() == 250 - && "Person 0".equals(getItemLabel(items, 0)) - && "Person 49".equals(getItemLabel(items, 49))); - - clickButton(SHOW_ITEMS); - - Assert.assertTrue("The client filter shouldn't impact the items", - getItemData().startsWith("Person 0 lastName,Person 1 lastName") - && getItemData().endsWith("Person 249 lastName")); - } - private void showSelectedPerson() { clickButton(SHOW_ITEM_DATA); } @@ -315,10 +227,6 @@ private String getItemData() { return $("span").id(ITEM_DATA).getText(); } - private String getItemCount() { - return $("span").id(ITEM_COUNT).getText(); - } - private void setTextFilter(ComboBoxElement comboBox, String filter) { comboBox.setFilter(filter); } diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java index e90459af85f..88db4fbddd8 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java @@ -140,6 +140,25 @@ public void changeFilterFromEmptyAndBackToEmptyWithinDebounceTimeout_itemsLoaded assertRendered(box, "Item 0"); } + @Test + public void setFilter_close_filterReset() { + comboBoxWithFilteredItems.openPopup(); + + comboBoxWithFilteredItems.setFilter("444"); + waitForItems(comboBoxWithFilteredItems, + items -> items.size() == 1 + && "Item 444".equals(getItemLabel(items, 0))); + + comboBoxWithFilteredItems.closePopup(); + waitForItems(comboBoxWithFilteredItems, items -> items.size() == 500); + + comboBoxWithFilteredItems.openPopup(); + waitForItems(comboBoxWithFilteredItems, + items -> items.size() == 500 + && "Item 0".equals(getItemLabel(items, 0)) + && "Item 49".equals(getItemLabel(items, 49))); + } + @Test public void configureFilterInDataProvider_setDataProvider_serverSideFiltering() { box = $(ComboBoxElement.class).id("filterable-data-provider"); From 0964a6171d32924d85ec1ae8baa1ced51e83c5c4 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Sat, 3 Jan 2026 19:47:57 +0400 Subject: [PATCH 4/4] format code --- .../component/combobox/test/ComboBoxListDataViewPage.java | 3 +-- .../com/vaadin/flow/component/combobox/test/FilteringIT.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java index 8f0265f2e28..7bf4c15994d 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/main/java/com/vaadin/flow/component/combobox/test/ComboBoxListDataViewPage.java @@ -157,8 +157,7 @@ public ComboBoxListDataViewPage() { add(comboBox, itemSelect, filterByAge, reverseSorting, selectItemOnIndex, showItemData, showNextData, showPreviousData, - removePerson, count, itemData, - secondComboBox); + removePerson, count, itemData, secondComboBox); } private List generatePersonItems() { diff --git a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java index 88db4fbddd8..9eb555f6095 100644 --- a/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java +++ b/vaadin-combo-box-flow-parent/vaadin-combo-box-flow-integration-tests/src/test/java/com/vaadin/flow/component/combobox/test/FilteringIT.java @@ -145,9 +145,8 @@ public void setFilter_close_filterReset() { comboBoxWithFilteredItems.openPopup(); comboBoxWithFilteredItems.setFilter("444"); - waitForItems(comboBoxWithFilteredItems, - items -> items.size() == 1 - && "Item 444".equals(getItemLabel(items, 0))); + waitForItems(comboBoxWithFilteredItems, items -> items.size() == 1 + && "Item 444".equals(getItemLabel(items, 0))); comboBoxWithFilteredItems.closePopup(); waitForItems(comboBoxWithFilteredItems, items -> items.size() == 500);