diff options
author | Marco Collovati <mcollovati@gmail.com> | 2018-09-07 10:06:03 +0200 |
---|---|---|
committer | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2018-09-07 11:06:03 +0300 |
commit | a3769ed12ee1456575ef491d59031c36243495b3 (patch) | |
tree | db3ce97cc2bc426734c4c3561cac20b30cdcd6d8 /uitest | |
parent | 78c6a7fbfb31101bb1d8e1fa42685d187e1a1e81 (diff) | |
download | vaadin-framework-a3769ed12ee1456575ef491d59031c36243495b3.tar.gz vaadin-framework-a3769ed12ee1456575ef491d59031c36243495b3.zip |
Fix handling of hidden Components in Grid(#10367)
Diffstat (limited to 'uitest')
-rw-r--r-- | uitest/src/main/java/com/vaadin/tests/components/grid/GridComponentsVisibility.java | 66 | ||||
-rw-r--r-- | uitest/src/test/java/com/vaadin/tests/components/grid/GridComponentsVisibilityTest.java | 90 |
2 files changed, 156 insertions, 0 deletions
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridComponentsVisibility.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridComponentsVisibility.java new file mode 100644 index 0000000000..8c8810f7a8 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridComponentsVisibility.java @@ -0,0 +1,66 @@ +package com.vaadin.tests.components.grid; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.stream.IntStream; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.Button; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Label; +import com.vaadin.ui.TextField; +import com.vaadin.ui.renderers.ComponentRenderer; + +@Widgetset("com.vaadin.DefaultWidgetSet") +public class GridComponentsVisibility extends AbstractTestUIWithLog { + + private Map<String, TextField> textFields = new HashMap<>(); + private int counter = 0; + + @Override + protected void setup(VaadinRequest request) { + Grid<String> grid = new Grid<>(); + grid.addColumn(string -> new Label(string), new ComponentRenderer()) + .setId("label").setCaption("Column 0"); + grid.getDefaultHeaderRow().getCell("label") + .setComponent(new Label("Label")); + grid.addComponentColumn(string -> { + if (textFields.containsKey(string)) { + log("Reusing old text field for: " + string); + return textFields.get(string); + } + TextField textField = new TextField(); + textField.setValue(string); + textField.setWidth("100%"); + textFields.put(string, textField); + return textField; + }).setId("textField").setCaption("TextField"); + grid.addColumn(string -> { + + Button button = new Button("Click Me!", + event -> toggleFieldVisibility(string)); + button.setId(string.replace(' ', '_').toLowerCase(Locale.ROOT)); + return button; + }, new ComponentRenderer()).setId("button").setCaption("Button"); + // make sure the buttons and focus outlines fit completely in a row + grid.setRowHeight(40); + + grid.getDefaultHeaderRow().join("textField", "button") + .setText("Other Components"); + + addComponent(grid); + grid.setSizeFull(); + + grid.setItems(IntStream.range(0, 5).boxed() + .map(i -> "Row " + (i + (counter * 1000)))); + + } + + private void toggleFieldVisibility(String string) { + textFields.get(string).setVisible(!textFields.get(string).isVisible()); + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridComponentsVisibilityTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridComponentsVisibilityTest.java new file mode 100644 index 0000000000..14fa82a58e --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridComponentsVisibilityTest.java @@ -0,0 +1,90 @@ +package com.vaadin.tests.components.grid; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.stream.IntStream; + +import com.vaadin.testbench.By; +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.testbench.elements.TextFieldElement; +import com.vaadin.tests.tb3.MultiBrowserTest; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class GridComponentsVisibilityTest extends MultiBrowserTest { + + @Test + public void changingVisibilityOfComponentInFirstRowShouldNotThrowClientSideExceptions() { + testHideComponent(grid -> 0); + } + + @Test + public void changingVisibilityOfComponentShouldNotThrowClientSideExceptions() { + testHideComponent(grid -> ThreadLocalRandom.current().nextInt(1, (int) grid.getRowCount() - 1)); + } + + @Test + public void changingVisibilityOfComponentInLastRowShouldNotThrowClientSideExceptions() { + testHideComponent(grid -> (int) grid.getRowCount() - 1); + } + + private void testHideComponent(Function<GridElement, Integer> rowUnderTestSupplier) { + openTestURL("debug"); + GridElement grid = $(GridElement.class).first(); + int rowUnderTest = rowUnderTestSupplier.apply(grid); + assertTrue("Text field should be visible", grid.getCell(rowUnderTest, 1) + .isElementPresent(TextFieldElement.class)); + assertOtherConnectorsArePresent(grid, rowUnderTest); + + clearDebugMessages(); + clickVisibilityToggleButton(grid, rowUnderTest); + assertNotClientSideErrors(); + assertOnlyTextFieldOnTestedRowIsNotPresent(grid, rowUnderTest); + + clearDebugMessages(); + clickVisibilityToggleButton(grid, rowUnderTest); + assertNotClientSideErrors(); + assertAllTextFieldsArePresent(grid, rowUnderTest); + + clearDebugMessages(); + clickVisibilityToggleButton(grid, rowUnderTest); + assertNotClientSideErrors(); + assertOnlyTextFieldOnTestedRowIsNotPresent(grid, rowUnderTest); + + clickVisibilityToggleButton(grid, rowUnderTest); + } + + private void assertOnlyTextFieldOnTestedRowIsNotPresent(GridElement grid, int rowUnderTest) { + assertFalse("Text field should not be visible", grid.getCell(rowUnderTest, 1) + .isElementPresent(TextFieldElement.class)); + assertOtherConnectorsArePresent(grid, rowUnderTest); + } + + private void assertAllTextFieldsArePresent(GridElement grid, int rowUnderTest) { + assertTrue("Text field should be visible", grid.getCell(rowUnderTest, 1) + .isElementPresent(TextFieldElement.class)); + assertOtherConnectorsArePresent(grid, rowUnderTest); + } + + private void assertNotClientSideErrors() { + assertNoErrorNotifications(); + // Should not log "Widget is still attached to the DOM ..." error message + assertNoDebugMessage(Level.SEVERE); + } + + private void clickVisibilityToggleButton(GridElement grid, int rowUnderTest) { + grid.getRow(rowUnderTest).getCell(2).findElement(By.className("v-button")).click(); + } + + private void assertOtherConnectorsArePresent(GridElement grid, int rowUnderTest) { + IntStream.range(1, (int) grid.getRowCount()) + .filter(row -> row != rowUnderTest) + .forEach(row -> + assertTrue("Text field should be visible", grid.getCell(row, 1) + .isElementPresent(TextFieldElement.class)) + ); + } +} |