]> source.dussan.org Git - vaadin-framework.git/commitdiff
Reset selection on DataProvider change in RadioButtonGroup (#11526)
authorAnastasia Smirnova <anasmi@utu.fi>
Thu, 4 Apr 2019 11:45:38 +0000 (14:45 +0300)
committerSun Zhe <31067185+ZheSun88@users.noreply.github.com>
Thu, 4 Apr 2019 11:45:38 +0000 (14:45 +0300)
* Reset selection on DataProvider change in RadioButtonGroup

Fixes #11454

Other components needing the same fix are ListSelect,NativeSelect,Combobox (The ones implementing HasDataProvider and extending AbstractSingleSelect. Grid is not affected as it extends AbstractListing and hadles selection differently)

* Added test case

Verify that ValueChangeListener is actually fired after value is reset setting new DataProvider

server/src/main/java/com/vaadin/ui/RadioButtonGroup.java
uitest/src/main/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupChangeDataProvider.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupChangeDataProviderTest.java [new file with mode: 0644]

index 649c35d736c1091966a4ff13791caa4342da0acd..c234d6cfb538a2d6e51b54330d3077ce77feab9d 100644 (file)
@@ -321,6 +321,7 @@ public class RadioButtonGroup<T> extends AbstractSingleSelect<T>
 
     @Override
     public void setDataProvider(DataProvider<T, ?> dataProvider) {
+        setSelectedItem(null);
         internalSetDataProvider(dataProvider);
     }
 }
diff --git a/uitest/src/main/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupChangeDataProvider.java b/uitest/src/main/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupChangeDataProvider.java
new file mode 100644 (file)
index 0000000..64fe81a
--- /dev/null
@@ -0,0 +1,25 @@
+package com.vaadin.tests.components.radiobuttongroup;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.RadioButtonGroup;
+import com.vaadin.ui.Button;
+
+public class RadioButtonGroupChangeDataProvider extends AbstractTestUIWithLog {
+    @Override
+    protected void setup(VaadinRequest request) {
+        RadioButtonGroup<String> radio = new RadioButtonGroup<>();
+        radio.setItems("aaa", "bbb", "ccc", "ddd");
+        radio.setId("radioButton");
+        radio.addValueChangeListener(event -> {
+            log("Selected value: " + event.getValue());
+        });
+
+        addComponent(radio);
+        Button changeProvider = new Button(
+                "New Data Provider - without selected item",
+                e -> radio.setItems("111", "222", "333", "444"));
+        changeProvider.setId("changeProvider");
+        addComponent(changeProvider);
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupChangeDataProviderTest.java b/uitest/src/test/java/com/vaadin/tests/components/radiobuttongroup/RadioButtonGroupChangeDataProviderTest.java
new file mode 100644 (file)
index 0000000..8648ea1
--- /dev/null
@@ -0,0 +1,51 @@
+package com.vaadin.tests.components.radiobuttongroup;
+
+import com.vaadin.testbench.elements.RadioButtonGroupElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+
+public class RadioButtonGroupChangeDataProviderTest extends MultiBrowserTest {
+    @Test
+    public void verifyOptionIsSelectable() {
+        openTestURL();
+
+        getRadioButtonGroupElement().selectByText("ccc");
+        isSelectedOnClientSide("ccc");
+        findElement(By.id("changeProvider")).click();
+        assertTrue(findElement(By.id("radioButton"))
+                .findElements(By.className("v-select-option-selected"))
+                .isEmpty());
+        isValueChangeListenerFired("null");
+        getRadioButtonGroupElement().selectByText("222");
+        isSelectedOnClientSide("222");
+    }
+
+    private RadioButtonGroupElement getRadioButtonGroupElement() {
+        RadioButtonGroupElement radioButtonGroup = $(
+                RadioButtonGroupElement.class).first();
+        return radioButtonGroup;
+    }
+
+    private void isSelectedOnClientSide(String selectedText) {
+        List<WebElement> selectOptions = findElement(By.id("radioButton"))
+                .findElements(By.className("v-select-option-selected"));
+        assertEquals("One item should be selected", selectOptions.size(), 1);
+        String value = selectOptions.get(0).getText();
+        assertTrue(String.format("Expected value was %s, but %s is selected",
+                selectedText, value), value.equals(selectedText));
+        isValueChangeListenerFired(selectedText);
+    }
+
+    private void isValueChangeListenerFired(String value) {
+        assertTrue(String.format(
+                "ValueChangeListener was not fired. Current value: %s ", value),
+                findElement(By.id("Log_row_0")).getText().contains(value));
+    }
+}