File: Infrastructure\ClientErrorResultFilterTest.cs
Web Access
Project: src\src\Mvc\Mvc.Core\test\Microsoft.AspNetCore.Mvc.Core.Test.csproj (Microsoft.AspNetCore.Mvc.Core.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.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
 
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
 
public class ClientErrorResultFilterTest
{
    private static readonly IActionResult Result = new EmptyResult();
 
    [Fact]
    public void OnResultExecuting_DoesNothing_IfActionIsNotClientErrorActionResult()
    {
        // Arrange
        var actionResult = new NotFoundObjectResult(new object());
        var context = GetContext(actionResult);
        var filter = GetFilter();
 
        // Act
        filter.OnResultExecuting(context);
 
        // Assert
        Assert.Same(actionResult, context.Result);
    }
 
    [Fact]
    public void OnResultExecuting_DoesNothing_IfTransformedValueIsNull()
    {
        // Arrange
        var actionResult = new NotFoundResult();
        var context = GetContext(actionResult);
        var factory = new Mock<IClientErrorFactory>();
        factory
            .Setup(f => f.GetClientError(It.IsAny<ActionContext>(), It.IsAny<IClientErrorActionResult>()))
            .Returns((IActionResult)null)
            .Verifiable();
 
        var filter = new ClientErrorResultFilter(factory.Object, NullLogger<ClientErrorResultFilter>.Instance);
 
        // Act
        filter.OnResultExecuting(context);
 
        // Assert
        Assert.Same(actionResult, context.Result);
        factory.Verify();
    }
 
    [Fact]
    public void OnResultExecuting_TransformsClientErrors()
    {
        // Arrange
        var actionResult = new NotFoundResult();
        var context = GetContext(actionResult);
        var filter = GetFilter();
 
        // Act
        filter.OnResultExecuting(context);
 
        // Assert
        Assert.Same(Result, context.Result);
    }
 
    [Theory]
    [InlineData(400)]
    [InlineData(409)]
    [InlineData(503)]
    public void OnResultExecuting_Transforms4XXStatusCodeResult(int statusCode)
    {
        // Arrange
        var actionResult = new StatusCodeResult(statusCode);
        var context = GetContext(actionResult);
        var filter = GetFilter();
 
        // Act
        filter.OnResultExecuting(context);
 
        // Assert
        Assert.Same(Result, context.Result);
    }
 
    [Theory]
    [InlineData(201)]
    [InlineData(302)]
    [InlineData(399)]
    public void OnResultExecuting_DoesNotTransformStatusCodesLessThan400(int statusCode)
    {
        // Arrange
        var actionResult = new StatusCodeResult(statusCode);
        var context = GetContext(actionResult);
        var filter = GetFilter();
 
        // Act
        filter.OnResultExecuting(context);
 
        // Assert
        Assert.Same(actionResult, context.Result);
    }
 
    private static ClientErrorResultFilter GetFilter()
    {
        var factory = Mock.Of<IClientErrorFactory>(
            f => f.GetClientError(It.IsAny<ActionContext>(), It.IsAny<IClientErrorActionResult>()) == Result);
 
        return new ClientErrorResultFilter(factory, NullLogger<ClientErrorResultFilter>.Instance);
    }
 
    private static ResultExecutingContext GetContext(IActionResult actionResult)
    {
        return new ResultExecutingContext(
            new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()),
            Array.Empty<IFilterMetadata>(),
            actionResult,
            new object());
    }
}