File: Logging\HttpUtilityExtensionsTests.cs
Web Access
Project: src\test\Libraries\Microsoft.AspNetCore.Diagnostics.Middleware.Tests\Microsoft.AspNetCore.Diagnostics.Middleware.Tests.csproj (Microsoft.AspNetCore.Diagnostics.Middleware.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#if NETCOREAPP3_1_OR_GREATER
using System;
#endif
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
#if NETCOREAPP3_1_OR_GREATER
using Microsoft.AspNetCore.Routing.Patterns;
#endif
using Microsoft.Extensions.DependencyInjection;
using Moq;
using Xunit;
#if !NETCOREAPP3_1_OR_GREATER
using Opt = Microsoft.Extensions.Options.Options;
#endif
 
namespace Microsoft.AspNetCore.Diagnostics.Logging.Test;
 
public class HttpUtilityExtensionsTests
{
    [Fact]
    public void AddHttpRouteUtilities_AddsIncomingHttpRouteUtility()
    {
        var sp = new ServiceCollection().AddHttpRouteUtilities().BuildServiceProvider();
 
        var routeUtilities = sp.GetService<IIncomingHttpRouteUtility>();
        Assert.NotNull(routeUtilities);
    }
 
#if NETCOREAPP3_1_OR_GREATER
    [Fact]
    public void GetRoute_ReturnsRouteWhenExists()
    {
        var metadata = new List<object>(1);
 
        var httpRoute = "v1/profile/users/{userId}/teams/{teamId}";
        var endpoint = new RouteEndpoint(
                c => throw new InvalidOperationException("Test"),
                RoutePatternFactory.Parse(httpRoute),
                0,
                new EndpointMetadataCollection(metadata),
                "Endpoint display name");
 
        Mock<HttpRequest> mockHttpRequest = new Mock<HttpRequest>();
        HttpContext context = new DefaultHttpContext();
        mockHttpRequest.Setup(m => m.HttpContext).Returns(context);
        context.SetEndpoint(endpoint);
 
        Assert.Equal(httpRoute, mockHttpRequest.Object.GetRoute());
    }
 
    [Fact]
    public void GetRoute_NullEndpoint_ReturnsEmpty()
    {
        Mock<HttpRequest> mockHttpRequest = new Mock<HttpRequest>();
        HttpContext context = new DefaultHttpContext();
        mockHttpRequest.Setup(m => m.HttpContext).Returns(context);
 
        Assert.Equal(string.Empty, mockHttpRequest.Object.GetRoute());
    }
 
    [Fact]
    public void GetRoute_NullRawText_ReturnsEmpty()
    {
        var metadata = new List<object>(1);
        var endpoint = new RouteEndpoint(
                c => throw new InvalidOperationException("Test"),
                RoutePatternFactory.Pattern(),
                0,
                new EndpointMetadataCollection(metadata),
                "Endpoint display name");
 
        Mock<HttpRequest> mockHttpRequest = new Mock<HttpRequest>();
        HttpContext context = new DefaultHttpContext();
        mockHttpRequest.Setup(m => m.HttpContext).Returns(context);
        context.SetEndpoint(endpoint);
 
        Assert.Equal(string.Empty, mockHttpRequest.Object.GetRoute());
    }
#else
    [Fact]
    public void GetRoute_NullRouteData_ReturnsEmpty()
    {
        Mock<HttpRequest> mockHttpRequest = new Mock<HttpRequest>();
        HttpContext context = new DefaultHttpContext();
        mockHttpRequest.SetupGet(x => x.HttpContext).Returns(context);
        Assert.Equal(string.Empty, mockHttpRequest.Object.GetRoute());
    }
 
    [Fact]
    public void GetRoute_WhenRouteExists_ShouldReturnCorrectRoute()
    {
        Mock<HttpRequest> mockHttpRequest = new Mock<HttpRequest>();
 
        var httpRoute = "v1/profile/users/{userId}/teams/{teamId}";
        var routeValues = new RouteValueDictionary
        {
            { "route", httpRoute }
        };
 
        var routeData = new RouteData(routeValues);
        Mock<IRouter> mockRouter = new Mock<IRouter>();
 
        var routerColl = new RouteCollection();
#pragma warning disable CS0618 // Type or member is obsolete
        routerColl.Add(new Route(
                mockRouter.Object,
                httpRoute,
                new RouteValueDictionary(),
                new Dictionary<string, object>(),
                new RouteValueDictionary(),
                new DefaultInlineConstraintResolver(Opt.Create(new RouteOptions()))));
#pragma warning restore CS0618 // Type or member is obsolete

        routeData.Routers.Add(routerColl);
 
        var context = new DefaultHttpContext();
 
        IRoutingFeature routingFeature = new RoutingFeature
        {
            RouteData = routeData
        };
        context.Features.Set(routingFeature);
        mockHttpRequest.SetupGet(x => x.HttpContext).Returns(context);
 
        Assert.Equal(httpRoute, mockHttpRequest.Object.GetRoute());
    }
#endif
}