// 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 Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Mvc.Core
{
///
/// Test the class.
///
public class HtmlHelperLabelExtensionsTest
{
[Fact]
public void LabelHelpers_ReturnEmptyForModel()
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
// Act
var labelResult = helper.Label(expression: string.Empty);
var labelNullResult = helper.Label(expression: null); // null is another alias for current model
var labelForResult = helper.LabelFor(m => m);
var labelForModelResult = helper.LabelForModel();
// Assert
Assert.Empty(labelResult.ToString());
Assert.Empty(labelNullResult.ToString());
Assert.Empty(labelForResult.ToString());
Assert.Empty(labelForModelResult.ToString());
}
[Fact]
public void LabelHelpers_DisplayPropertyName()
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
// Act
var labelResult = helper.Label("Property1");
var labelForResult = helper.LabelFor(m => m.Property1);
// Assert
Assert.Equal("", labelResult.ToString());
Assert.Equal("", labelForResult.ToString());
}
[Fact]
public void LabelHelpers_DisplayPropertyName_ForNestedProperty()
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null);
// Act
var labelResult = helper.Label("Inner.Id");
var labelForResult = helper.LabelFor(m => m.Inner.Id);
// Assert
Assert.Equal("", labelResult.ToString());
Assert.Equal("", labelForResult.ToString());
}
[Fact]
public void LabelHelpers_ReturnEmptyForModel_IfMetadataPropertyNameEmpty()
{
// Arrange
var metadata = new ModelMetadata(
new DataAnnotationsModelMetadataProvider(),
containerType: null,
modelAccessor: null,
modelType: typeof(object),
propertyName: string.Empty);
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
helper.ViewData.ModelMetadata = metadata;
// Act
var labelResult = helper.Label(expression: string.Empty);
var labelNullResult = helper.Label(expression: null); // null is another alias for current model
var labelForResult = helper.LabelFor(m => m);
var labelForModelResult = helper.LabelForModel();
// Assert
Assert.Empty(labelResult.ToString());
Assert.Empty(labelNullResult.ToString());
Assert.Empty(labelForResult.ToString());
Assert.Empty(labelForModelResult.ToString());
}
[Theory]
[InlineData("MyProperty")]
[InlineData("Custom property name from metadata")]
public void LabelHelpers_DisplayMetadataPropertyName_IfOverridden(string propertyName)
{
// Arrange
var metadata = new ModelMetadata(
new DataAnnotationsModelMetadataProvider(),
containerType: null,
modelAccessor: null,
modelType: typeof(object),
propertyName: propertyName);
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
helper.ViewData.ModelMetadata = metadata;
// Act
var labelResult = helper.Label(expression: string.Empty);
var labelForResult = helper.LabelFor(m => m);
var labelForModelResult = helper.LabelForModel();
// Assert
Assert.Equal("", labelResult.ToString());
Assert.Equal("", labelForResult.ToString());
Assert.Equal("", labelForModelResult.ToString());
}
[Theory]
[InlineData("MyProperty")]
[InlineData("Custom property name from metadata")]
public void LabelHelpers_DisplayMetadataPropertyNameForProperty_IfOverridden(string propertyName)
{
// Arrange
var metadataHelper = new MetadataHelper();
var metadata = new ModelMetadata(
metadataHelper.MetadataProvider.Object,
containerType: null,
modelAccessor: null,
modelType: typeof(object),
propertyName: propertyName);
metadataHelper.MetadataProvider
.Setup(provider => provider.GetMetadataForProperty(It.IsAny>(), It.IsAny(), "Property1"))
.Returns(metadata);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(metadataHelper.MetadataProvider.Object);
// Act
var labelForResult = helper.LabelFor(m => m.Property1);
// Assert
Assert.Equal("", labelForResult.ToString());
}
[Fact]
public void LabelHelpers_ReturnEmptyForModel_IfDisplayNameEmpty()
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
helper.ViewData.ModelMetadata.DisplayName = string.Empty;
// Act
var labelResult = helper.Label(expression: string.Empty);
var labelNullResult = helper.Label(expression: null); // null is another alias for current model
var labelForResult = helper.LabelFor(m => m);
var labelForModelResult = helper.LabelForModel();
// Assert
Assert.Empty(labelResult.ToString());
Assert.Empty(labelNullResult.ToString());
Assert.Empty(labelForResult.ToString());
Assert.Empty(labelForModelResult.ToString());
}
[Theory]
[InlineData("DisplayName")]
[InlineData("Custom display name from metadata")]
public void LabelHelpers_DisplayDisplayName_IfNonNull(string displayName)
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
helper.ViewData.ModelMetadata.DisplayName = displayName;
// Act
var labelResult = helper.Label(expression: string.Empty);
var labelForResult = helper.LabelFor(m => m);
var labelForModelResult = helper.LabelForModel();
// Assert
Assert.Equal("", labelResult.ToString());
Assert.Equal("", labelForResult.ToString());
Assert.Equal("", labelForModelResult.ToString());
}
[Fact]
public void LabelHelpers_ReturnEmptyForProperty_IfDisplayNameEmpty()
{
// Arrange
var metadataHelper = new MetadataHelper(); // All properties will use the same metadata.
metadataHelper.Metadata
.Setup(metadata => metadata.DisplayName)
.Returns(string.Empty);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(metadataHelper.MetadataProvider.Object);
// Act
var labelResult = helper.Label(expression: string.Empty);
var labelNullResult = helper.Label(expression: null); // null is another alias for current model
var labelForResult = helper.LabelFor(m => m);
var labelForModelResult = helper.LabelForModel();
// Assert
Assert.Empty(labelResult.ToString());
Assert.Empty(labelNullResult.ToString());
Assert.Empty(labelForResult.ToString());
Assert.Empty(labelForModelResult.ToString());
}
[Theory]
[InlineData("DisplayName")]
[InlineData("Custom display name from metadata")]
public void LabelHelpers_DisplayDisplayNameForProperty_IfNonNull(string displayName)
{
// Arrange
var metadataHelper = new MetadataHelper(); // All properties will use the same metadata.
metadataHelper.Metadata
.Setup(metadata => metadata.DisplayName)
.Returns(displayName);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(metadataHelper.MetadataProvider.Object);
// Act
var labelResult = helper.Label("Property1");
var labelForResult = helper.LabelFor(m => m.Property1);
// Assert
Assert.Equal("", labelResult.ToString());
Assert.Equal("", labelForResult.ToString());
}
[Theory]
[InlineData("A", "A")]
[InlineData("A[23]", "A[23]")]
[InlineData("A[0].B", "B")]
[InlineData("A.B.C.D", "D")]
public void Label_DisplaysRightmostExpressionSegment_IfPropertiesNotFound(
string expression,
string expectedResult)
{
// Arrange
var metadataHelper = new MetadataHelper();
var helper = DefaultTemplatesUtilities.GetHtmlHelper(metadataHelper.MetadataProvider.Object);
// Act
var result = helper.Label(expression);
// Assert
// Label() falls back to expression name when DisplayName and PropertyName are null.
Assert.Equal("", result.ToString());
}
[Fact]
public void LabelFor_ConsultsMetadataProviderForMetadataAboutProperty()
{
// Arrange
var modelType = typeof(DefaultTemplatesUtilities.ObjectTemplateModel);
var metadataHelper = new MetadataHelper();
metadataHelper.MetadataProvider
.Setup(p => p.GetMetadataForProperty(It.IsAny>(), modelType, "Property1"))
.Returns(metadataHelper.Metadata.Object)
.Verifiable();
var helper = DefaultTemplatesUtilities.GetHtmlHelper(metadataHelper.MetadataProvider.Object);
// Act
var result = helper.LabelFor(m => m.Property1);
// Assert
metadataHelper.MetadataProvider.Verify();
// LabelFor() falls back to expression name when DisplayName and PropertyName are null.
Assert.Equal("", result.ToString());
}
[Fact]
public void LabelFor_ThrowsInvalidOperation_IfExpressionUnsupported()
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
// Act & Assert
var exception = Assert.Throws(
() => helper.LabelFor(model => new { foo = "Bar" }));
Assert.Equal(
"Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.",
exception.Message);
}
[Fact]
public void LabelFor_DisplaysVariableName()
{
// Arrange
var unknownKey = "this is a dummy parameter value";
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
// Act
var result = helper.LabelFor(model => unknownKey);
// Assert
Assert.Equal("", result.ToString());
}
private sealed class InnerClass
{
public int Id { get; set; }
}
private sealed class OuterClass
{
public InnerClass Inner { get; set; }
}
private sealed class MetadataHelper
{
public Mock Metadata { get; set; }
public Mock MetadataProvider { get; set; }
public MetadataHelper()
{
MetadataProvider = new Mock();
Metadata = new Mock(MetadataProvider.Object, null, null, typeof(object), null);
MetadataProvider.Setup(p => p.GetMetadataForProperties(It.IsAny