aspnetcore/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/Metadata/DefaultModelMetadataProvide...

194 lines
6.4 KiB
C#

// 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 System;
using System.Linq;
using System.Reflection;
using Xunit;
namespace Microsoft.AspNet.Mvc.ModelBinding.Metadata
{
public class DefaultModelMetadataProviderTest
{
[Fact]
public void GetMetadataForType_IncludesAttributes()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata = provider.GetMetadataForType(typeof(ModelType));
// Assert
var defaultMetadata = Assert.IsType<DefaultModelMetadata>(metadata);
var attribute = Assert.IsType<ModelAttribute>(Assert.Single(defaultMetadata.Attributes.Attributes));
Assert.Equal("OnType", attribute.Value);
}
[Fact]
public void GetMetadataForType_Cached()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata1 = Assert.IsType<DefaultModelMetadata>(provider.GetMetadataForType(typeof(ModelType)));
var metadata2 = Assert.IsType<DefaultModelMetadata>(provider.GetMetadataForType(typeof(ModelType)));
// Assert
Assert.Same(metadata1, metadata2);
Assert.Same(metadata1.Attributes, metadata2.Attributes);
Assert.Same(metadata1.BindingMetadata, metadata2.BindingMetadata);
Assert.Same(metadata1.DisplayMetadata, metadata2.DisplayMetadata);
Assert.Same(metadata1.ValidationMetadata, metadata2.ValidationMetadata);
}
[Fact]
public void GetMetadataForProperties_IncludesAllProperties()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata = provider.GetMetadataForProperties(typeof(ModelType)).ToArray();
// Assert
Assert.Equal(2, metadata.Length);
Assert.Single(metadata, m => m.PropertyName == "Property1");
Assert.Single(metadata, m => m.PropertyName == "Property2");
}
[Fact]
public void GetMetadataForProperties_IncludesAllProperties_ExceptIndexer()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata = provider.GetMetadataForProperties(typeof(ModelTypeWithIndexer)).ToArray();
// Assert
Assert.Equal(1, metadata.Length);
Assert.Single(metadata, m => m.PropertyName == "Property1");
}
[Fact]
public void GetMetadataForProperties_Cached()
{
// Arrange
var provider = CreateProvider();
// Act
var properties1 = provider.GetMetadataForProperties(typeof(ModelType)).Cast<DefaultModelMetadata>().ToArray();
var properties2 = provider.GetMetadataForProperties(typeof(ModelType)).Cast<DefaultModelMetadata>().ToArray();
// Assert
Assert.Equal(properties1.Length, properties2.Length);
for (var i = 0; i < properties1.Length; i++)
{
Assert.Same(properties1[i], properties2[i]);
Assert.Same(properties1[i].Attributes, properties2[i].Attributes);
Assert.Same(properties1[i].BindingMetadata, properties2[i].BindingMetadata);
Assert.Same(properties1[i].DisplayMetadata, properties2[i].DisplayMetadata);
Assert.Same(properties1[i].ValidationMetadata, properties2[i].ValidationMetadata);
}
}
[Fact]
public void GetMetadataForType_PropertiesCollection_Cached()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata1 = Assert.IsType<DefaultModelMetadata>(provider.GetMetadataForType(typeof(ModelType)));
var metadata2 = Assert.IsType<DefaultModelMetadata>(provider.GetMetadataForType(typeof(ModelType)));
// Assert
Assert.Same(metadata1.Properties, metadata2.Properties);
}
[Fact]
public void GetMetadataForProperties_IncludesMergedAttributes()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata = provider.GetMetadataForProperties(typeof(ModelType)).First();
// Assert
var defaultMetadata = Assert.IsType<DefaultModelMetadata>(metadata);
var attributes = defaultMetadata.Attributes.Attributes.ToArray();
Assert.Equal("OnProperty", Assert.IsType<ModelAttribute>(attributes[0]).Value);
Assert.Equal("OnPropertyType", Assert.IsType<ModelAttribute>(attributes[1]).Value);
}
[Fact]
public void GetMetadataForProperties_ExcludesHiddenProperties()
{
// Arrange
var provider = CreateProvider();
// Act
var metadata = provider.GetMetadataForProperties(typeof(DerivedModelWithHiding));
// Assert
var propertyMetadata = Assert.Single(metadata);
Assert.Equal(typeof(string), propertyMetadata.ModelType);
}
private static DefaultModelMetadataProvider CreateProvider()
{
return new DefaultModelMetadataProvider(new EmptyCompositeMetadataDetailsProvider());
}
[Model("OnType")]
private class ModelType
{
[Model("OnProperty")]
public PropertyType Property1 { get; }
public PropertyType Property2 { get; set; }
}
[Model("OnPropertyType")]
private class PropertyType
{
}
private class ModelAttribute : Attribute
{
public ModelAttribute(string value)
{
Value = value;
}
public string Value { get; }
}
private class ModelTypeWithIndexer
{
public PropertyType this[string key] { get { return null; } }
public PropertyType Property1 { get; set; }
}
private void GetMetadataForParameterTestMethod([Model("OnParameter")] ModelType parameter)
{
}
private class BaseModelWithHiding
{
public int Property { get; set; }
}
private class DerivedModelWithHiding : BaseModelWithHiding
{
public new string Property { get; set; }
}
}
}