File: MapPredicateMiddlewareTests.cs
Web Access
Project: src\src\Http\Http.Abstractions\test\Microsoft.AspNetCore.Http.Abstractions.Tests.csproj (Microsoft.AspNetCore.Http.Abstractions.Tests)
// 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;
 
namespace Microsoft.AspNetCore.Builder.Extensions;
 
using Predicate = Func<HttpContext, bool>;
 
public class MapPredicateMiddlewareTests
{
    private static readonly Predicate NotImplementedPredicate = new Predicate(environment => { throw new NotImplementedException(); });
 
    private static Task Success(HttpContext context)
    {
        context.Response.StatusCode = 200;
        return Task.FromResult<object>(null!);
    }
 
    private static void UseSuccess(IApplicationBuilder app)
    {
        app.Run(Success);
    }
 
    private static Task NotImplemented(HttpContext context)
    {
        throw new NotImplementedException();
    }
 
    private static void UseNotImplemented(IApplicationBuilder app)
    {
        app.Run(NotImplemented);
    }
 
    private bool TruePredicate(HttpContext context)
    {
        return true;
    }
 
    private bool FalsePredicate(HttpContext context)
    {
        return false;
    }
 
    [Fact]
    public void NullArguments_ArgumentNullException()
    {
        var builder = new ApplicationBuilder(serviceProvider: null!);
        var noMiddleware = new ApplicationBuilder(serviceProvider: null!).Build();
        var noOptions = new MapWhenOptions();
        Assert.Throws<ArgumentNullException>(() => builder.MapWhen(null!, UseNotImplemented));
        Assert.Throws<ArgumentNullException>(() => builder.MapWhen(NotImplementedPredicate, configuration: null!));
        Assert.Throws<ArgumentNullException>(() => new MapWhenMiddleware(null!, noOptions));
        Assert.Throws<ArgumentNullException>(() => new MapWhenMiddleware(noMiddleware, null!));
        Assert.Throws<ArgumentNullException>(() => new MapWhenMiddleware(null!, noOptions));
        Assert.Throws<ArgumentNullException>(() => new MapWhenMiddleware(noMiddleware, null!));
    }
 
    [Fact]
    public async Task PredicateTrue_BranchTaken()
    {
        HttpContext context = CreateRequest();
        var builder = new ApplicationBuilder(serviceProvider: null!);
        builder.MapWhen(TruePredicate, UseSuccess);
        var app = builder.Build();
        await app.Invoke(context);
 
        Assert.Equal(200, context.Response.StatusCode);
    }
 
    [Fact]
    public async Task PredicateTrueAction_BranchTaken()
    {
        HttpContext context = CreateRequest();
        var builder = new ApplicationBuilder(serviceProvider: null!);
        builder.MapWhen(TruePredicate, UseSuccess);
        var app = builder.Build();
        await app.Invoke(context);
 
        Assert.Equal(200, context.Response.StatusCode);
    }
 
    [Fact]
    public async Task PredicateFalseAction_PassThrough()
    {
        HttpContext context = CreateRequest();
        var builder = new ApplicationBuilder(serviceProvider: null!);
        builder.MapWhen(FalsePredicate, UseNotImplemented);
        builder.Run(Success);
        var app = builder.Build();
        await app.Invoke(context);
 
        Assert.Equal(200, context.Response.StatusCode);
    }
 
    [Fact]
    public async Task ChainedPredicates_Success()
    {
        var builder = new ApplicationBuilder(serviceProvider: null!);
        builder.MapWhen(TruePredicate, map1 =>
        {
            map1.MapWhen((Predicate)FalsePredicate, UseNotImplemented);
            map1.MapWhen((Predicate)TruePredicate, map2 => map2.MapWhen((Predicate)TruePredicate, UseSuccess));
            map1.Run(NotImplemented);
        });
        var app = builder.Build();
 
        HttpContext context = CreateRequest();
        await app.Invoke(context);
        Assert.Equal(200, context.Response.StatusCode);
    }
 
    private HttpContext CreateRequest()
    {
        HttpContext context = new DefaultHttpContext();
        return context;
    }
}