From 99e99c167add2aed960a2df8ea3ea30b51c2f318 Mon Sep 17 00:00:00 2001
From: Ryan Nowak
Date: Tue, 9 Jul 2019 14:29:10 -0700
Subject: [PATCH] Add some tests for invalid data
---
src/Components/test/E2ETest/Tests/BindTest.cs | 143 +++++++++++++++++-
.../BasicTestApp/BindCasesComponent.razor | 36 +++++
2 files changed, 178 insertions(+), 1 deletion(-)
diff --git a/src/Components/test/E2ETest/Tests/BindTest.cs b/src/Components/test/E2ETest/Tests/BindTest.cs
index 172c6973bc..ce28c7891f 100644
--- a/src/Components/test/E2ETest/Tests/BindTest.cs
+++ b/src/Components/test/E2ETest/Tests/BindTest.cs
@@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
-using System.Globalization;
using BasicTestApp;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
@@ -877,5 +876,147 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
Browser.Equal(string.Empty, () => boundValue.Text);
Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
}
+
+ // For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
+ // Blazor have different formatting behaviour by default.
+ [Fact]
+ public void CanBindTextboxNullableDateTime_InvalidValue()
+ {
+ var target = Browser.FindElement(By.Id("textbox-nullable-datetime-invalid"));
+ var boundValue = Browser.FindElement(By.Id("textbox-nullable-datetime-invalid-value"));
+ var mirrorValue = Browser.FindElement(By.Id("textbox-nullable-datetime-invalid-mirror"));
+ Assert.Equal(string.Empty, target.GetAttribute("value"));
+ Assert.Equal(string.Empty, boundValue.Text);
+ Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
+
+ // Modify target; verify value is updated and that textboxes linked to the same data are updated
+ var expected = new DateTime(2000, 1, 2);
+ target.SendKeys("01/02/2000 00:00:00\t");
+ Browser.Equal(expected, () => DateTime.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value")));
+
+ // Modify target to something invalid - the invalid change is reverted
+ // back to the last valid value
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05/06A");
+ Browser.Equal("05/06A", () => target.GetAttribute("value"));
+ target.SendKeys("\t");
+ Browser.Equal(expected, () => DateTime.Parse(target.GetAttribute("value")));
+ Assert.Equal(expected, DateTime.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value")));
+
+ // Now change it to something valid
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05/06\t");
+ expected = new DateTime(DateTime.Now.Year, 5, 6);
+ Browser.Equal(expected, () => DateTime.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value")));
+ }
+
+ // For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
+ // Blazor have different formatting behaviour by default.
+ [Fact]
+ public void CanBindTextboxDateTimeOffset_InvalidValue()
+ {
+ var target = Browser.FindElement(By.Id("textbox-datetimeoffset-invalid"));
+ var boundValue = Browser.FindElement(By.Id("textbox-datetimeoffset-invalid-value"));
+ var mirrorValue = Browser.FindElement(By.Id("textbox-datetimeoffset-invalid-mirror"));
+ var expected = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
+ Assert.Equal(expected, DateTimeOffset.Parse(target.GetAttribute("value")));
+ Assert.Equal(expected, DateTimeOffset.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")));
+
+ // Modify target; verify value is updated and that textboxes linked to the same data are updated
+ expected = new DateTime(2000, 1, 2);
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("01/02/2000 00:00:00\t");
+ Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")).DateTime);
+
+ // Modify target to something invalid - the invalid change is reverted
+ // back to the last valid value
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05/06A");
+ Browser.Equal("05/06A", () => target.GetAttribute("value"));
+ target.SendKeys("\t");
+ Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(target.GetAttribute("value")).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(boundValue.Text).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")).DateTime);
+
+ // Now change it to something valid
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05/06\t");
+ expected = new DateTime(DateTime.Now.Year, 5, 6);
+ Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")).DateTime);
+ }
+
+ // For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
+ // Blazor have different formatting behaviour by default.
+ [Fact]
+ public void CanBindTextboxDateTimeWithFormat_InvalidValue()
+ {
+ var target = Browser.FindElement(By.Id("textbox-datetime-format-invalid"));
+ var boundValue = Browser.FindElement(By.Id("textbox-datetime-format-invalid-value"));
+ var mirrorValue = Browser.FindElement(By.Id("textbox-datetime-format-invalid-mirror"));
+ var expected = new DateTime(1985, 3, 4);
+ Assert.Equal("03-04", target.GetAttribute("value"));
+ Assert.Equal(expected, DateTime.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value")));
+
+ // Modify target to something invalid - the invalid change is reverted
+ // back to the last valid value
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05/06");
+ Browser.Equal("05/06", () => target.GetAttribute("value"));
+ target.SendKeys("\t");
+ Browser.Equal("03-04", () => target.GetAttribute("value"));
+ Assert.Equal(expected, DateTime.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value")));
+
+ // Now change it to something valid
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05-06\t");
+ expected = new DateTime(DateTime.Now.Year, 5, 6);
+ Browser.Equal(expected, () => DateTime.Parse(boundValue.Text));
+ Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value")));
+ }
+
+ // For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
+ // Blazor have different formatting behaviour by default.
+ [Fact]
+ public void CanBindTextboxNullableDateTimeOffsetWithFormat_InvalidValue()
+ {
+ var target = Browser.FindElement(By.Id("textbox-nullable-datetimeoffset-format-invalid"));
+ var boundValue = Browser.FindElement(By.Id("textbox-nullable-datetimeoffset-format-invalid-value"));
+ var mirrorValue = Browser.FindElement(By.Id("textbox-nullable-datetimeoffset-format-invalid-mirror"));
+ Assert.Equal(string.Empty, target.GetAttribute("value"));
+ Assert.Equal(string.Empty, boundValue.Text);
+ Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
+
+ // Modify target; verify value is updated and that textboxes linked to the same data are updated
+ var expected = new DateTimeOffset(new DateTime(DateTime.Now.Year, 1, 2));
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("01-02\t");
+ Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")).DateTime);
+
+ // Modify target to something invalid - the invalid change is reverted
+ // back to the last valid value
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05/06");
+ Browser.Equal("05/06", () => target.GetAttribute("value"));
+ target.SendKeys("\t");
+ Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(target.GetAttribute("value")).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(boundValue.Text).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")).DateTime);
+
+ // Now change it to something valid
+ target.SendKeys(Keys.Control + "a"); // select all
+ target.SendKeys("05-06\t");
+ expected = new DateTime(DateTime.Now.Year, 5, 6);
+ Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text).DateTime);
+ Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value")).DateTime);
+ }
}
}
diff --git a/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor b/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor
index 7b827d633f..6f132f6f6a 100644
--- a/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor
+++ b/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor
@@ -123,12 +123,24 @@
@textboxNullableDateTimeValue
+
+ Nullable DateTime (invalid input):
+
+ @textboxNullableDateTimeInvalidValue
+
+
DateTimeOffset:
@textboxDateTimeOffsetValue
+
+ DateTimeOffset (invalid input):
+
+ @textboxDateTimeOffsetInvalidValue
+
+
Nullable DateTimeOffset:
@@ -141,6 +153,18 @@
@textboxDateTimeFormatValue
+
+ DateTime (format):
+
+ @textboxDateTimeFormatValue
+
+
+
+ DateTime (format / invalid value):
+
+ @textboxDateTimeFormatInvalidValue
+
+
Nullable DateTime (format):
@@ -159,6 +183,12 @@
@textboxNullableDateTimeOffsetFormatValue
+
+ Nullable DateTimeOffset (format / invalid value):
+
+ @textboxNullableDateTimeOffsetFormatInvalidValue
+
+
Text Area
@@ -254,11 +284,17 @@
DateTimeOffset textboxDateTimeOffsetValue = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
DateTimeOffset? textboxNullableDateTimeOffsetValue = null;
+ DateTime? textboxNullableDateTimeInvalidValue = null;
+ DateTimeOffset textboxDateTimeOffsetInvalidValue = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
+
DateTime textboxDateTimeFormatValue = new DateTime(1985, 3, 4);
DateTime? textboxNullableDateTimeFormatValue = null;
DateTimeOffset textboxDateTimeOffsetFormatValue = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
DateTimeOffset? textboxNullableDateTimeOffsetFormatValue = null;
+ DateTime textboxDateTimeFormatInvalidValue = new DateTime(1985, 3, 4);
+ DateTimeOffset? textboxNullableDateTimeOffsetFormatInvalidValue = null;
+
bool includeFourthOption = false;
enum SelectableValue { First, Second, Third, Fourth }
SelectableValue selectValue = SelectableValue.Second;