From d0d7c6aef8d50406d6ea559e18f59e604039973a Mon Sep 17 00:00:00 2001 From: dougbu Date: Fri, 1 Aug 2014 19:27:11 -0700 Subject: [PATCH] Add `HtmlHelperDisplayTextTest` and `HtmlHelperValueExtensionsTest` classes --- .../Microsoft.AspNet.Mvc.Core.Test.kproj | 2 + .../Rendering/HtmlHelperDisplayTextTest.cs | 284 ++++++++++++++++++ .../HtmlHelperValueExtensionsTest.cs | 169 +++++++++++ 3 files changed, 455 insertions(+) create mode 100644 test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs create mode 100644 test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj b/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj index 0c51eb1351..448c9a3636 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj @@ -94,8 +94,10 @@ + + diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs new file mode 100644 index 0000000000..7df2f7e1c2 --- /dev/null +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs @@ -0,0 +1,284 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Globalization; +using Microsoft.AspNet.Mvc.ModelBinding; +using Xunit; + +namespace Microsoft.AspNet.Mvc.Core +{ + /// + /// Test the and methods. + /// + public class HtmlHelperDisplayTextTest + { + [Fact] + public void DisplayText_ReturnsEmpty_IfValueNull() + { + // Arrange + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null); + + // Act + var result = helper.DisplayText(""); + + // Assert + Assert.Empty(result); + } + + [Fact] + public void DisplayTextFor_ReturnsEmpty_IfValueNull() + { + // Arrange + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null); + + // Act + var result = helper.DisplayTextFor(m => m); + + // Assert + Assert.Empty(result); + } + + [Fact] + public void DisplayText_ReturnsNullDisplayText_IfSetAndValueNull() + { + // Arrange + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null); + helper.ViewData.ModelMetadata.NullDisplayText = "Null display Text"; + + // Act + var result = helper.DisplayText(""); + + // Assert + Assert.Equal("Null display Text", result); + } + + [Fact] + public void DisplayTextFor_ReturnsNullDisplayText_IfSetAndValueNull() + { + // Arrange + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null); + helper.ViewData.ModelMetadata.NullDisplayText = "Null display Text"; + + // Act + var result = helper.DisplayTextFor(m => m); + + // Assert + Assert.Equal("Null display Text", result); + } + + [Fact] + public void DisplayText_ReturnsValue_IfNameEmpty() + { + // Arrange + var model = new OverriddenToStringModel("Model value"); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + + // Act + var result = helper.DisplayText(""); + + // Assert + Assert.Equal("Model value", result); + } + + [Fact] + public void DisplayText_ReturnsEmpty_IfNameNotFound() + { + // Arrange + var model = new OverriddenToStringModel("Model value"); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + + // Act + var result = helper.DisplayText("NonExistentProperty"); + + // Assert + Assert.Empty(result); + } + + [Fact] + public void DisplayTextFor_ReturnsValue_IfIdentityExpression() + { + // Arrange + var model = new OverriddenToStringModel("Model value"); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + + // Act + var result = helper.DisplayTextFor(m => m); + + // Assert + Assert.Equal("Model value", result); + } + + [Fact] + public void DisplayText_ReturnsSimpleDisplayText_IfSetAndValueNonNull() + { + // Arrange + var model = new OverriddenToStringModel("Ignored text"); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + helper.ViewData.ModelMetadata.SimpleDisplayText = "Simple display text"; + + // Act + var result = helper.DisplayText(""); + + // Assert + Assert.Equal("Simple display text", result); + } + + [Fact] + public void DisplayTextFor_ReturnsSimpleDisplayText_IfSetAndValueNonNull() + { + // Arrange + var model = new OverriddenToStringModel("Ignored text"); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + helper.ViewData.ModelMetadata.SimpleDisplayText = "Simple display text"; + + // Act + var result = helper.DisplayTextFor(m => m); + + // Assert + Assert.Equal("Simple display text", result); + } + + [Fact] + public void DisplayText_ReturnsPropertyValue_IfNameFound() + { + // Arrange + var model = new OverriddenToStringModel("Ignored text") + { + Name = "Property value", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + helper.ViewData.ModelMetadata.SimpleDisplayText = "Simple display text"; + + // Act + var result = helper.DisplayText("Name"); + + // Assert + Assert.Equal("Property value", result); + } + + [Fact] + public void DisplayTextFor_ReturnsPropertyValue_IfPropertyExpression() + { + // Arrange + var model = new OverriddenToStringModel("ignored text") + { + Name = "Property value", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + + // Act + var result = helper.DisplayTextFor(m => m.Name); + + // Assert + Assert.Equal("Property value", result); + } + + [Fact] + public void DisplayText_ReturnsViewDataEntry() + { + // Arrange + var model = new OverriddenToStringModel("Model value") + { + Name = "Property value", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + helper.ViewData["Name"] = "View data dictionary value"; + + // Act + var result = helper.DisplayText("Name"); + + // Assert + Assert.Equal("View data dictionary value", result); + } + + [Fact] + public void DisplayTextFor_IgnoresViewDataEntry() + { + // Arrange + var model = new OverriddenToStringModel("Model value") + { + Name = "Property value", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + helper.ViewData["Name"] = "View data dictionary value"; + + // Act + var result = helper.DisplayTextFor(m => m.Name); + + // Assert + Assert.Equal("Property value", result); + } + + [Fact] + public void DisplayText_ReturnsModelStateEntry() + { + // Arrange + var model = new OverriddenToStringModel("Model value") + { + Name = "Property value", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + var viewData = helper.ViewData; + viewData["Name"] = "View data dictionary value"; + viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; + + var modelState = new ModelState(); + modelState.Value = new ValueProviderResult( + rawValue: new string[] { "Attempted name value" }, + attemptedValue: "Attempted name value", + culture: CultureInfo.InvariantCulture); + viewData.ModelState["FieldPrefix.Name"] = modelState; + + // Act + var result = helper.DisplayText("Name"); + + // Assert + Assert.Equal("View data dictionary value", result); + } + + [Fact] + public void DisplayTextFor_IgnoresModelStateEntry() + { + // Arrange + var model = new OverriddenToStringModel("Model value") + { + Name = "Property value", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + var viewData = helper.ViewData; + viewData["Name"] = "View data dictionary value"; + viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; + + var modelState = new ModelState(); + modelState.Value = new ValueProviderResult( + rawValue: new string[] { "Attempted name value" }, + attemptedValue: "Attempted name value", + culture: CultureInfo.InvariantCulture); + viewData.ModelState["FieldPrefix.Name"] = modelState; + + // Act + var result = helper.DisplayTextFor(m => m.Name); + + // Assert + Assert.Equal("Property value", result); + } + + // ModelMetadata.SimpleDisplayText returns ToString() result if that method has been overridden. + private sealed class OverriddenToStringModel + { + private readonly string _simpleDisplayText; + + public OverriddenToStringModel(string simpleDisplayText) + { + _simpleDisplayText = simpleDisplayText; + } + + public string Name { get; set; } + + public override string ToString() + { + return _simpleDisplayText; + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs new file mode 100644 index 0000000000..e8dbdfd082 --- /dev/null +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs @@ -0,0 +1,169 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.Testing; +using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.Rendering; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.Mvc.Core +{ + /// + /// Test the class. + /// + public class HtmlHelperValueExtensionsTest + { + // Value + + [Fact] + public void ValueGetsValueFromViewData() + { + // Arrange + var helper = GetHtmlHelper(); + + // Act + var html = helper.Value("StringProperty"); + + // Assert + Assert.Equal("ViewDataValue", html); + } + + // ValueFor + + [Fact] + public void ValueForGetsExpressionValueFromViewDataModel() + { + // Arrange + var helper = GetHtmlHelper(); + + // Act + var html = helper.ValueFor(m => m.StringProperty); + + // Assert + Assert.Equal("ModelStringPropertyValue", html); + } + + // All Value Helpers including ValueForModel + + [Fact] + public void ValueHelpersWithErrorsGetValueFromModelState() + { + // Arrange + var model = new TestModel() + { + StringProperty = "ModelStringPropertyValue", + ObjectProperty = "ModelObjectPropertyValue", + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + var viewData = helper.ViewData; + viewData["StringProperty"] = "ViewDataValue"; + viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; + + var modelState = new ModelState(); + modelState.Value = new ValueProviderResult( + rawValue: new string[] { "StringPropertyRawValue" }, + attemptedValue: "StringPropertyAttemptedValue", + culture: CultureInfo.InvariantCulture); + viewData.ModelState["FieldPrefix.StringProperty"] = modelState; + + modelState = new ModelState(); + modelState.Value = new ValueProviderResult( + rawValue: new string[] { "ModelRawValue" }, + attemptedValue: "ModelAttemptedValue", + culture: CultureInfo.InvariantCulture); + viewData.ModelState["FieldPrefix"] = modelState; + + // Act & Assert + Assert.Equal("StringPropertyRawValue", helper.Value("StringProperty")); + Assert.Equal("StringPropertyRawValue", helper.ValueFor(m => m.StringProperty)); + Assert.Equal("ModelRawValue", helper.ValueForModel()); + } + + [Fact] + [ReplaceCulture] + public void ValueHelpersWithEmptyNameConvertModelValueUsingCurrentCulture() + { + // Arrange + var helper = GetHtmlHelper(); + var expectedModelValue = + "{ StringProperty = ModelStringPropertyValue, ObjectProperty = 01/01/1900 00:00:00 }"; + + // Act & Assert + Assert.Equal(expectedModelValue, helper.Value(name: string.Empty)); + Assert.Equal(expectedModelValue, helper.ValueFor(m => m)); + Assert.Equal(expectedModelValue, helper.ValueForModel()); + } + + [Fact] + [ReplaceCulture] + public void ValueHelpersFormatValue() + { + // Arrange + var helper = GetHtmlHelper(); + var expectedModelValue = + "-{ StringProperty = ModelStringPropertyValue, ObjectProperty = 01/01/1900 00:00:00 }-"; + var expectedObjectPropertyValue = "-01/01/1900 00:00:00-"; + + // Act & Assert + Assert.Equal(expectedModelValue, helper.ValueForModel("-{0}-")); + Assert.Equal(expectedObjectPropertyValue, helper.Value("ObjectProperty", "-{0}-")); + Assert.Equal(expectedObjectPropertyValue, helper.ValueFor(m => m.ObjectProperty, "-{0}-")); + } + + [Fact] + public void ValueHelpersDoNotEncodeValue() + { + // Arrange + var model = new TestModel { StringProperty = "ModelStringPropertyValue <\"\">" }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + var viewData = helper.ViewData; + viewData["StringProperty"] = "ViewDataValue <\"\">"; + + var modelState = new ModelState(); + modelState.Value = new ValueProviderResult( + rawValue: new string[] { "ObjectPropertyRawValue <\"\">" }, + attemptedValue: "ObjectPropertyAttemptedValue <\"\">", + culture: CultureInfo.InvariantCulture); + viewData.ModelState["ObjectProperty"] = modelState; + + // Act & Assert + Assert.Equal( + "<{ StringProperty = ModelStringPropertyValue <\"\">, ObjectProperty = (null) }>", + helper.ValueForModel("<{0}>")); + Assert.Equal(">", helper.Value("StringProperty", "<{0}>")); + Assert.Equal(">", helper.ValueFor(m => m.StringProperty, "<{0}>")); + Assert.Equal("ObjectPropertyRawValue <\"\">", helper.ValueFor(m => m.ObjectProperty)); + } + + private sealed class TestModel + { + public string StringProperty { get; set; } + public object ObjectProperty { get; set; } + + public override string ToString() + { + return string.Format( + "{{ StringProperty = {0}, ObjectProperty = {1} }}", + StringProperty ?? "(null)", + ObjectProperty ?? "(null)"); + } + } + + private static HtmlHelper GetHtmlHelper() + { + var model = new TestModel + { + StringProperty = "ModelStringPropertyValue", + ObjectProperty = new DateTime(1900, 1, 1, 0, 0, 0), + }; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + helper.ViewData["StringProperty"] = "ViewDataValue"; + + return helper; + } + } +} \ No newline at end of file