summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/main/java/com/vaadin/ui/AbstractDateField.java2
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldValidationError.java31
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldValidationErrorTest.java57
3 files changed, 89 insertions, 1 deletions
diff --git a/server/src/main/java/com/vaadin/ui/AbstractDateField.java b/server/src/main/java/com/vaadin/ui/AbstractDateField.java
index 2ad976a7fe..bc6b5f49a8 100644
--- a/server/src/main/java/com/vaadin/ui/AbstractDateField.java
+++ b/server/src/main/java/com/vaadin/ui/AbstractDateField.java
@@ -249,8 +249,8 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster &
if (newDateString == null || newDateString.isEmpty()) {
uiHasValidDateString = true;
currentParseErrorMessage = null;
- setValue(newDate, true);
setComponentError(null);
+ setValue(newDate, true);
} else {
if (variables.get("lastInvalidDateString") != null) {
Result<T> parsedDate = handleUnparsableDateString(
diff --git a/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldValidationError.java b/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldValidationError.java
new file mode 100644
index 0000000000..0bc9e1438d
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldValidationError.java
@@ -0,0 +1,31 @@
+package com.vaadin.tests.components.datefield;
+
+import java.time.LocalDate;
+import java.util.Locale;
+
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.data.Binder;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.Notification;
+
+@Widgetset("com.vaadin.DefaultWidgetSet")
+public class DateFieldValidationError extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ DateField df = new DateField();
+ df.setLocale(Locale.US);
+ Binder<Void> binder = new Binder<>();
+ binder.forField(df)
+ .withValidator(localDate -> localDate != null && localDate.isAfter(LocalDate.now()), "Invalid date")
+ .bind(v -> LocalDate.now(), (v, t) -> {
+ /* NO-OP */
+ });
+ addComponent(df);
+ addComponent(new Button("Validate", e -> Notification.show(binder.validate().isOk() ? "OK" : "Fail")));
+ }
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldValidationErrorTest.java b/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldValidationErrorTest.java
new file mode 100644
index 0000000000..6bfa1d2e2b
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldValidationErrorTest.java
@@ -0,0 +1,57 @@
+package com.vaadin.tests.components.datefield;
+
+import java.time.LocalDate;
+
+import com.vaadin.testbench.elements.DateFieldElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+public class DateFieldValidationErrorTest extends MultiBrowserTest {
+
+ @Test
+ public void testComponentErrorShouldBeShownWhenEnteringInvalidDate() throws InterruptedException {
+ openTestURL();
+ DateFieldElement dateField = $(DateFieldElement.class).first();
+ dateField.getInputElement().click();
+ dateField.getInputElement().sendKeys("01/01/01", Keys.TAB);
+
+ assertHasErrorMessage(dateField);
+ }
+
+ @Test
+ public void testComponentErrorShouldBeShownWhenSelectingInvalidDate() throws InterruptedException {
+ openTestURL();
+ DateFieldElement dateField = $(DateFieldElement.class).first();
+ dateField.setDate(LocalDate.now());
+ dateField.openPopup();
+ waitUntil(ExpectedConditions.visibilityOfElementLocated(By.className("v-datefield-popup")));
+
+ WebElement popup = findElement(com.vaadin.testbench.By.className("v-datefield-popup"));
+ // select day before today
+ WebElement popupBody = popup.findElement(By.className("v-datefield-calendarpanel"));
+ popupBody.sendKeys(Keys.ARROW_LEFT, Keys.ENTER);
+
+ // move focus away otherwise tooltip is not shown
+ WebElement inputElement = dateField.getInputElement();
+ inputElement.click();
+ inputElement.sendKeys(Keys.TAB);
+
+ assertHasErrorMessage(dateField);
+ }
+
+ private void assertHasErrorMessage(DateFieldElement dateField) {
+ waitForElementPresent(By.className("v-errorindicator"));
+ dateField.showTooltip();
+ waitUntil(driver -> "Invalid date".equals(getTooltipErrorElement().getText()));
+ }
+
+ @Override
+ protected boolean requireWindowFocusForIE() {
+ return true;
+ }
+
+}