aspnetcore/test/Microsoft.AspNetCore.Mvc.Vi.../DependencyInjection/MvcViewFeaturesMvcBuilderEx...

194 lines
6.9 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.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Options;
using Xunit;
namespace Microsoft.Extensions.DependencyInjection
{
public class MvcViewFeaturesMvcBuilderExtensionsTest
{
[Fact]
public void AddViewComponentsAsServices_ReplacesViewComponentActivator()
{
// Arrange
var builder = CreateBuilder();
MvcViewFeaturesMvcCoreBuilderExtensions.AddViewServices(builder.Services);
builder.ConfigureApplicationPartManager(manager =>
{
manager.ApplicationParts.Add(new TestApplicationPart());
manager.FeatureProviders.Add(new ViewComponentFeatureProvider());
});
// Act
builder.AddViewComponentsAsServices();
// Assert
var descriptor = Assert.Single(builder.Services.ToList(), d => d.ServiceType == typeof(IViewComponentActivator));
Assert.Equal(typeof(ServiceBasedViewComponentActivator), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider()
{
// Arrange
var builder = CreateBuilder();
// Act
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(builder.Services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_DoesNotRegisterOptionsConfiguration()
{
// Arrange
var builder = CreateBuilder();
// Act
builder.AddCookieTempDataProvider();
// Assert
Assert.DoesNotContain(
builder.Services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider()
{
// Arrange
var builder = CreateBuilder();
// Act
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(builder.Services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersOptionsConfiguration()
{
// Arrange
var builder = CreateBuilder();
// Act
builder.AddCookieTempDataProvider(options => { });
// Assert
Assert.Single(
builder.Services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider_IfCalledTwice()
{
// Arrange
var builder = CreateBuilder();
// Act
builder.AddCookieTempDataProvider();
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(builder.Services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider_IfCalledTwice()
{
// Arrange
var builder = CreateBuilder();
// Act
builder.AddCookieTempDataProvider(options => { });
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(builder.Services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddViewComponentsAsServices_RegistersDiscoveredViewComponents()
{
// Arrange
var services = new ServiceCollection();
var manager = new ApplicationPartManager();
manager.ApplicationParts.Add(new TestApplicationPart(
typeof(ConventionsViewComponent),
typeof(AttributeViewComponent)));
manager.FeatureProviders.Add(new TestProvider());
var builder = new MvcBuilder(services, manager);
// Act
builder.AddViewComponentsAsServices();
// Assert
var collection = services.ToList();
Assert.Equal(3, collection.Count);
Assert.Equal(typeof(ConventionsViewComponent), collection[0].ServiceType);
Assert.Equal(typeof(ConventionsViewComponent), collection[0].ImplementationType);
Assert.Equal(ServiceLifetime.Transient, collection[0].Lifetime);
Assert.Equal(typeof(AttributeViewComponent), collection[1].ServiceType);
Assert.Equal(typeof(AttributeViewComponent), collection[1].ImplementationType);
Assert.Equal(ServiceLifetime.Transient, collection[1].Lifetime);
Assert.Equal(typeof(IViewComponentActivator), collection[2].ServiceType);
Assert.Equal(typeof(ServiceBasedViewComponentActivator), collection[2].ImplementationType);
Assert.Equal(ServiceLifetime.Singleton, collection[2].Lifetime);
}
private static MvcBuilder CreateBuilder()
{
var services = new ServiceCollection();
var manager = new ApplicationPartManager();
var builder = new MvcBuilder(services, manager);
return builder;
}
public class ConventionsViewComponent
{
public string Invoke() => "Hello world";
}
[ViewComponent(Name = "AttributesAreGreat")]
public class AttributeViewComponent
{
public Task<string> InvokeAsync() => Task.FromResult("Hello world");
}
private class TestProvider : IApplicationFeatureProvider<ViewComponentFeature>
{
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ViewComponentFeature feature)
{
foreach (var type in parts.OfType<IApplicationPartTypeProvider>().SelectMany(p => p.Types))
{
feature.ViewComponents.Add(type);
}
}
}
}
}