// 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 System.Threading; using System.Xml; using System.Xml.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.DataAnnotations.Internal; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Internal; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; using Moq; using Newtonsoft.Json.Linq; using Xunit; namespace Microsoft.AspNetCore.Mvc { public class MvcOptionsSetupTest { [Fact] public void Setup_SetsUpViewEngines() { // Arrange & Act var options = GetOptions(AddViewEngineOptionsServices); // Assert var viewEngine = Assert.Single(options.ViewEngines); Assert.IsType(viewEngine); } [Fact] public void Setup_SetsUpModelBinders() { // Arrange & Act var options = GetOptions(); // Assert Assert.Collection(options.ModelBinders, binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder), binder => Assert.IsType(binder)); } [Fact] public void Setup_SetsUpValueProviders() { // Arrange & Act var options = GetOptions(); // Assert var valueProviders = options.ValueProviderFactories; Assert.Collection(valueProviders, provider => Assert.IsType(provider), provider => Assert.IsType(provider), provider => Assert.IsType(provider), provider => Assert.IsType(provider)); } [Fact] public void Setup_SetsUpOutputFormatters() { // Arrange & Act var options = GetOptions(); // Assert Assert.Collection(options.OutputFormatters, formatter => Assert.IsType(formatter), formatter => Assert.IsType(formatter), formatter => Assert.IsType(formatter), formatter => Assert.IsType(formatter)); } [Fact] public void Setup_SetsUpInputFormatters() { // Arrange & Act var options = GetOptions(); // Assert Assert.Collection(options.InputFormatters, formatter => Assert.IsType(formatter), formatter => Assert.IsType(formatter)); } [Fact] public void Setup_SetsUpModelValidatorProviders() { // Arrange & Act var options = GetOptions(); // Assert Assert.Collection(options.ModelValidatorProviders, validator => Assert.IsType(validator), validator => Assert.IsType(validator)); } [Fact] public void Setup_SetsUpClientModelValidatorProviders() { // Arrange & Act var options = GetOptions(AddViewEngineOptionsServices); // Assert Assert.Collection(options.ClientModelValidatorProviders, validator => Assert.IsType(validator), validator => Assert.IsType(validator), validator => Assert.IsType(validator)); } [Fact] public void Setup_IgnoresAcceptHeaderHavingWildCardMediaAndSubMediaTypes() { // Arrange & Act var options = GetOptions(); // Assert Assert.False(options.RespectBrowserAcceptHeader); } [Fact] public void Setup_SetsUpMetadataDetailsProviders() { // Arrange & Act var options = GetOptions(services => { var builder = new MvcCoreBuilder(services); builder.AddXmlDataContractSerializerFormatters(); }); // Assert var providers = options.ModelMetadataDetailsProviders; Assert.Collection(providers, provider => Assert.IsType(provider), provider => Assert.IsType(provider), provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(Type), excludeFilter.Type); }, provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(Uri), excludeFilter.Type); }, provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(CancellationToken), excludeFilter.Type); }, provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(IFormFile), excludeFilter.Type); }, provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(IFormCollection), excludeFilter.Type); }, provider => Assert.IsType(provider), provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(JToken), excludeFilter.Type); }, provider => Assert.IsType(provider), provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(XObject).FullName, excludeFilter.FullTypeName); }, provider => { var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(XmlNode).FullName, excludeFilter.FullTypeName); }); } [Fact] public void Setup_JsonFormattersUseSerializerSettings() { // Arrange var services = GetServiceProvider(s => { s.AddTransient(); }); // Act var options = services.GetRequiredService>().Value; var jsonOptions = services.GetRequiredService>().Value; // Assert var jsonInputFormatters = options.InputFormatters.OfType(); foreach (var jsonInputFormatter in jsonInputFormatters) { Assert.Same(jsonOptions.SerializerSettings, jsonInputFormatter.SerializerSettings); } var jsonOuputFormatters = options.OutputFormatters.OfType(); foreach (var jsonOuputFormatter in jsonOuputFormatters) { Assert.Same(jsonOptions.SerializerSettings, jsonOuputFormatter.SerializerSettings); } } private static T GetOptions(Action action = null) where T : class, new() { var serviceProvider = GetServiceProvider(action); return serviceProvider.GetRequiredService>().Value; } private static IServiceProvider GetServiceProvider(Action action = null) { var serviceCollection = new ServiceCollection(); serviceCollection.AddMvc(); serviceCollection .AddSingleton() .AddTransient(); if (action != null) { action(serviceCollection); } var serviceProvider = serviceCollection.BuildServiceProvider(); return serviceProvider; } private static void AddViewEngineOptionsServices(IServiceCollection serviceCollection) { var hostingEnvironment = new Mock(); hostingEnvironment.SetupGet(e => e.ApplicationName) .Returns(typeof(MvcOptionsSetupTest).GetTypeInfo().Assembly.GetName().Name); hostingEnvironment.SetupGet(e => e.ContentRootFileProvider) .Returns(Mock.Of()); serviceCollection.AddSingleton(hostingEnvironment.Object); } } }