// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Mvc.ModelBinding; using Xunit; namespace Microsoft.AspNetCore.Mvc.Rendering { /// /// 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(expression: string.Empty); // 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 provider = new TestModelMetadataProvider(); provider.ForType().DisplayDetails(dd => { dd.NullDisplayText = "Null display Text"; }); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null, provider: provider); // Act var result = helper.DisplayText(expression: string.Empty); // Assert Assert.Equal("Null display Text", result); } [Fact] public void DisplayTextFor_ReturnsNullDisplayText_IfSetAndValueNull() { // Arrange var provider = new TestModelMetadataProvider(); provider.ForType().DisplayDetails(dd => { dd.NullDisplayText = "Null display Text"; }); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null, provider: provider); // 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(expression: string.Empty); var nullResult = helper.DisplayText(expression: null); // null is another alias for current model // Assert Assert.Equal("Model value", result); Assert.Equal("Model value", nullResult); } [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") { SimpleDisplay = "Simple display text", }; var provider = new TestModelMetadataProvider(); provider.ForType().DisplayDetails(dd => { dd.SimpleDisplayProperty = nameof(OverriddenToStringModel.SimpleDisplay); }); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: model, provider: provider); // Act var result = helper.DisplayText(expression: string.Empty); // Assert Assert.Equal("Simple display text", result); } [Fact] public void DisplayTextFor_ReturnsSimpleDisplayText_IfSetAndValueNonNull() { // Arrange var model = new OverriddenToStringModel("Ignored text") { SimpleDisplay = "Simple display text", }; var provider = new TestModelMetadataProvider(); provider.ForType().DisplayDetails(dd => { dd.SimpleDisplayProperty = nameof(OverriddenToStringModel.SimpleDisplay); }); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: model, provider: provider); // 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", SimpleDisplay = "Simple display text", }; var provider = new TestModelMetadataProvider(); provider.ForType().DisplayDetails(dd => { dd.SimpleDisplayProperty = nameof(OverriddenToStringModel.SimpleDisplay); }); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: model, provider: provider); // 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_IgnoresModelStateEntry_ReturnsViewDataEntry() { // Arrange var model = new OverriddenToStringModel("Model value") { Name = "Property value", }; var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); var viewData = helper.ViewData; viewData["FieldPrefix.Name"] = "View data dictionary value"; viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; viewData.ModelState.SetModelValue( "FieldPrefix.Name", "Attempted name value", "Attempted name value"); // 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"; viewData.ModelState.SetModelValue( "FieldPrefix.Name", "Attempted name value", "Attempted name value"); // 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 SimpleDisplay { get; set; } public string Name { get; set; } public override string ToString() { return _simpleDisplayText; } } } }