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;