File: AntiforgeryApplicationBuilderExtensionsTest.cs
Web Access
Project: src\src\Antiforgery\test\Microsoft.AspNetCore.Antiforgery.Test.csproj (Microsoft.AspNetCore.Antiforgery.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Moq;
 
namespace Microsoft.AspNetCore.Antiforgery.Internal;
 
public class AntiforgeryApplicationBuilderExtensionsTest
{
    [Fact]
    public async Task UseAntiforgery_HasRequiredServices_RegistersMiddleware()
    {
        var antiforgeryService = new Mock<IAntiforgery>();
        var services = CreateServices(antiforgeryService.Object);
        var builder = new ApplicationBuilder(services);
        var httpContext = AntiforgeryMiddlewareTest.GetHttpContext();
 
        Assert.False(builder.Properties.ContainsKey("__AntiforgeryMiddlewareSet"));
 
        builder.UseAntiforgery();
 
        Assert.True(builder.Properties.ContainsKey("__AntiforgeryMiddlewareSet"));
 
        var app = builder.Build();
 
        await app(httpContext);
 
        antiforgeryService.Verify(antiforgeryService => antiforgeryService.ValidateRequestAsync(httpContext), Times.AtMostOnce());
    }
 
    [Fact]
    public void UseAntiforgery_MissingRequiredServices_ThrowsException()
    {
        var services = CreateServices();
        var builder = new ApplicationBuilder(services);
 
        Assert.False(builder.Properties.ContainsKey("__AntiforgeryMiddlewareSet"));
        var exception = Assert.Throws<InvalidOperationException>(() => builder.UseAntiforgery());
        Assert.False(builder.Properties.ContainsKey("__AntiforgeryMiddlewareSet"));
 
        Assert.Equal(
            "Unable to find the required services. Please add all the required services by calling " +
            "'IServiceCollection.AddAntiforgery' in the application startup code.",
            exception.Message);
    }
 
    private IServiceProvider CreateServices(IAntiforgery? antiforgeryService = null)
    {
        var services = new ServiceCollection();
        if (antiforgeryService is not null)
        {
            services.AddSingleton(antiforgeryService);
        }
        var serviceProvider = services.BuildServiceProvider();
        return serviceProvider;
    }
}