File: Rendering\HtmlHelperDisplayTextTest.cs
Web Access
Project: src\src\Mvc\Mvc.ViewFeatures\test\Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj (Microsoft.AspNetCore.Mvc.ViewFeatures.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc.ModelBinding;
 
namespace Microsoft.AspNetCore.Mvc.Rendering;
 
/// <summary>
/// Test the <see cref="IHtmlHelper.DisplayText"/> and
/// <see cref="IHtmlHelper{TModel}.DisplayTextFor{TValue}"/> methods.
/// </summary>
public class HtmlHelperDisplayTextTest
{
    [Fact]
    public void DisplayText_ReturnsEmpty_IfValueNull()
    {
        // Arrange
        var helper = DefaultTemplatesUtilities.GetHtmlHelper<OverriddenToStringModel>(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<OverriddenToStringModel>(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<OverriddenToStringModel>().DisplayDetails(dd =>
        {
            dd.NullDisplayText = "Null display Text";
        });
 
        var helper = DefaultTemplatesUtilities.GetHtmlHelper<OverriddenToStringModel>(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<OverriddenToStringModel>().DisplayDetails(dd =>
        {
            dd.NullDisplayText = "Null display Text";
        });
 
        var helper = DefaultTemplatesUtilities.GetHtmlHelper<OverriddenToStringModel>(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<OverriddenToStringModel>().DisplayDetails(dd =>
        {
            dd.SimpleDisplayProperty = nameof(OverriddenToStringModel.SimpleDisplay);
        });
 
        var helper = DefaultTemplatesUtilities.GetHtmlHelper<OverriddenToStringModel>(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<OverriddenToStringModel>().DisplayDetails(dd =>
        {
            dd.SimpleDisplayProperty = nameof(OverriddenToStringModel.SimpleDisplay);
        });
 
        var helper = DefaultTemplatesUtilities.GetHtmlHelper<OverriddenToStringModel>(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<OverriddenToStringModel>().DisplayDetails(dd =>
        {
            dd.SimpleDisplayProperty = nameof(OverriddenToStringModel.SimpleDisplay);
        });
 
        var helper = DefaultTemplatesUtilities.GetHtmlHelper<OverriddenToStringModel>(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);
    }
 
    [Fact]
    public void DisplayTextFor_EnumDisplayAttribute_WhenPresent()
    {
        // Arrange
        var model = EnumWithDisplayAttribute.Value1;
        var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
 
        // Act
        var result = helper.DisplayText(expression: string.Empty);
        var forResult = helper.DisplayTextFor(m => m);
 
        // Assert
        Assert.Equal("Value One", result);
        Assert.Equal("Value One", forResult);
    }
 
    [Fact]
    public void DisplayTextFor_EnumDisplayAttribute_WhenPresentOnProperty()
    {
        // Arrange
        var model = new EnumWithDisplayAttributeContainer { EnumValue = EnumWithDisplayAttribute.Value1 };
        var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
 
        // Act
        var result = helper.DisplayText(expression: nameof(EnumWithDisplayAttributeContainer.EnumValue));
        var forResult = helper.DisplayTextFor(m => m.EnumValue);
 
        // Assert
        Assert.Equal("Value One", result);
        Assert.Equal("Value One", forResult);
    }
 
    [Fact]
    public void DisplayTextFor_EnumDisplayAttribute_WhenNotPresent()
    {
        // Arrange
        var model = EnumWithoutDisplayAttribute.Value1;
        var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
 
        // Act
        var result = helper.DisplayText(expression: null);
        var forResult = helper.DisplayTextFor(m => m);
 
        // Assert
        Assert.Equal("Value1", result);
        Assert.Equal("Value1", forResult);
    }
 
    // 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;
        }
    }
 
    private enum EnumWithDisplayAttribute
    {
        [Display(Name = "Value One")]
        Value1
    }
 
    private enum EnumWithoutDisplayAttribute
    {
        Value1
    }
 
    private class EnumWithDisplayAttributeContainer
    {
        public EnumWithDisplayAttribute EnumValue { get; set; }
    }
}