// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; using System.Linq.Expressions; using Moq; using Xunit; using Assert = Microsoft.TestCommon.AssertEx; namespace System.Web.Mvc.Html.Test { public class LabelExtensionsTest { Mock metadataProvider; Mock metadata; ViewDataDictionary viewData; Mock viewContext; Mock viewDataContainer; HtmlHelper html; public LabelExtensionsTest() { metadataProvider = new Mock(); metadata = new Mock(metadataProvider.Object, null, null, typeof(object), null); viewData = new ViewDataDictionary(); viewContext = new Mock(); viewContext.Setup(c => c.ViewData).Returns(viewData); viewDataContainer = new Mock(); viewDataContainer.Setup(c => c.ViewData).Returns(viewData); html = new HtmlHelper(viewContext.Object, viewDataContainer.Object); metadataProvider.Setup(p => p.GetMetadataForProperties(It.IsAny(), It.IsAny())) .Returns(new ModelMetadata[0]); metadataProvider.Setup(p => p.GetMetadataForProperty(It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(metadata.Object); metadataProvider.Setup(p => p.GetMetadataForType(It.IsAny>(), It.IsAny())) .Returns(metadata.Object); } // Label tests [Fact] public void LabelNullExpressionThrows() { // Act & Assert Assert.ThrowsArgumentNull( () => html.Label(null), "expression"); } [Fact] public void LabelViewDataNotFound() { // Act MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelViewDataNull() { // Act viewData["PropertyName"] = null; MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } class Model { public string PropertyName { get; set; } } [Fact] public void LabelViewDataFromPropertyGetsActualPropertyType() { // Arrange Model model = new Model { PropertyName = "propertyValue" }; HtmlHelper html = new HtmlHelper(viewContext.Object, viewDataContainer.Object); viewData.Model = model; metadataProvider.Setup(p => p.GetMetadataForProperty(It.IsAny>(), typeof(Model), "PropertyName")) .Returns(metadata.Object) .Verifiable(); // Act html.Label("PropertyName", null, null, metadataProvider.Object); // Assert metadataProvider.Verify(); } [Fact] public void LabelUsesTemplateInfoPrefix() { // Arrange viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; // Act MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelUsesLabelTextBeforeMetadata() { // Arrange metadata = new Mock(metadataProvider.Object, null, null, typeof(object), "Custom property name from metadata"); metadataProvider.Setup(p => p.GetMetadataForType(It.IsAny>(), It.IsAny())) .Returns(metadata.Object); //Act MvcHtmlString result = html.Label("PropertyName", "Label Text", null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelUsesMetadataForDisplayTextWhenLabelTextIsNull() { // Arrange metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); // Act MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelUsesMetadataForPropertyNameWhenDisplayNameIsNull() { // Arrange metadata = new Mock(metadataProvider.Object, null, null, typeof(object), "Custom property name from metadata"); metadataProvider.Setup(p => p.GetMetadataForType(It.IsAny>(), It.IsAny())) .Returns(metadata.Object); // Act MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelEmptyDisplayNameReturnsEmptyLabelText() { // Arrange metadata.Setup(m => m.DisplayName).Returns(String.Empty); // Act MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object); // Assert Assert.Equal(String.Empty, result.ToHtmlString()); } [Fact] public void LabelWithAnonymousValues() { // Act MvcHtmlString result = html.Label("PropertyName", null, new { @for = "attrFor" }, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelWithAnonymousValuesAndLabelText() { // Act MvcHtmlString result = html.Label("PropertyName", "Label Text", new { @for = "attrFor" }, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelWithTypedAttributes() { // Arrange Dictionary htmlAttributes = new Dictionary { { "foo", "bar" }, { "quux", "baz" } }; // Act MvcHtmlString result = html.Label("PropertyName", null, htmlAttributes, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelWithTypedAttributesAndLabelText() { // Arrange Dictionary htmlAttributes = new Dictionary { { "foo", "bar" }, { "quux", "baz" } }; // Act MvcHtmlString result = html.Label("PropertyName", "Label Text", htmlAttributes, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } // LabelFor tests [Fact] public void LabelForNullExpressionThrows() { // Act & Assert Assert.ThrowsArgumentNull( () => html.LabelFor((Expression>)null), "expression"); } [Fact] public void LabelForNonMemberExpressionThrows() { // Act & Assert Assert.Throws( () => html.LabelFor(model => new { foo = "Bar" }, null, metadataProvider.Object), "Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions."); } [Fact] public void LabelForViewDataNotFound() { // Arrange string unknownKey = "this is a dummy parameter value"; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForUsesTemplateInfoPrefix() { // Arrange viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; string unknownKey = "this is a dummy parameter value"; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForUsesLabelTextBeforeModelMetadata() { // Arrange metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); string unknownKey = "this is a dummy parameter value"; //Act MvcHtmlString result = html.LabelFor(model => unknownKey, "Label Text", null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForUsesModelMetadata() { // Arrange metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); string unknownKey = "this is a dummy parameter value"; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForEmptyDisplayNameReturnsEmptyLabelText() { // Arrange metadata.Setup(m => m.DisplayName).Returns(String.Empty); string unknownKey = "this is a dummy parameter value"; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object); // Assert Assert.Equal(String.Empty, result.ToHtmlString()); } [Fact] public void LabelForWithAnonymousValues() { //Arrange string unknownKey = "this is a dummy parameter value"; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, null, new { @for = "attrFor" }, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForWithAnonymousValuesAndLabelText() { //Arrange string unknownKey = "this is a dummy parameter value"; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, "Label Text", new { @for = "attrFor" }, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForWithTypedAttributes() { //Arrange string unknownKey = "this is a dummy parameter value"; Dictionary htmlAttributes = new Dictionary { { "foo", "bar" }, { "quux", "baz" } }; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, null, htmlAttributes, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForWithTypedAttributesAndLabelText() { //Arrange string unknownKey = "this is a dummy parameter value"; Dictionary htmlAttributes = new Dictionary { { "foo", "bar" }, { "quux", "baz" } }; // Act MvcHtmlString result = html.LabelFor(model => unknownKey, "Label Text", htmlAttributes, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForWithNestedClass() { // Dev10 Bug #936323 // Arrange HtmlHelper html = new HtmlHelper(viewContext.Object, viewDataContainer.Object); // Act MvcHtmlString result = html.LabelFor(nested => nested.product.Id, null, null, metadataProvider.Object); //Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForWithArrayExpression() { // Dev10 Bug #905780 // Arrange HtmlHelper html = new HtmlHelper(viewContext.Object, viewDataContainer.Object); // Act MvcHtmlString result = html.LabelFor(cart => cart.Products[0].Id, null, null, metadataProvider.Object); // Assert Assert.Equal(@"", result.ToHtmlString()); } private class Product { public int Id { get; set; } } private class Cart { public Product[] Products { get; set; } } private class NestedProduct { public Product product = new Product(); } // LabelForModel tests [Fact] public void LabelForModelUsesLabelTextBeforeModelMetadata() { // Arrange viewData.ModelMetadata = metadata.Object; viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); // Act MvcHtmlString result = html.LabelForModel("Label Text"); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForModelUsesModelMetadata() { // Arrange viewData.ModelMetadata = metadata.Object; viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); // Act MvcHtmlString result = html.LabelForModel(); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForModelWithAnonymousValues() { //Arrange viewData.ModelMetadata = metadata.Object; viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); // Act MvcHtmlString result = html.LabelForModel(new { @for = "attrFor" }); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForModelWithAnonymousValuesAndLabelText() { //Arrange viewData.ModelMetadata = metadata.Object; viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); // Act MvcHtmlString result = html.LabelForModel("Label Text", new { @for = "attrFor" }); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForModelWithTypedAttributes() { //Arrange viewData.ModelMetadata = metadata.Object; viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); Dictionary htmlAttributes = new Dictionary { { "foo", "bar" }, { "quux", "baz" } }; // Act MvcHtmlString result = html.LabelForModel(htmlAttributes); // Assert Assert.Equal(@"", result.ToHtmlString()); } [Fact] public void LabelForModelWithTypedAttributesAndLabelText() { //Arrange viewData.ModelMetadata = metadata.Object; viewData.TemplateInfo.HtmlFieldPrefix = "Prefix"; metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata"); Dictionary htmlAttributes = new Dictionary { { "foo", "bar" }, { "quux", "baz" } }; // Act MvcHtmlString result = html.LabelForModel("Label Text", htmlAttributes); // Assert Assert.Equal(@"", result.ToHtmlString()); } } }