File: src\Shared\ResultsTests\RedirectResultTestBase.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 System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Xunit;
 
namespace Microsoft.AspNetCore.Internal;
 
public abstract class RedirectResultTestBase
{
    protected abstract Task ExecuteAsync(HttpContext httpContext, string contentPath);
 
    [Theory]
    [InlineData("", "/Home/About", "/Home/About")]
    [InlineData("/myapproot", "/test", "/test")]
    public async Task Execute_ReturnsContentPath_WhenItDoesNotStartWithTilde(
        string appRoot,
        string contentPath,
        string expectedPath)
    {
        // Arrange
        var httpContext = GetHttpContext(appRoot);
 
        // Act
        await ExecuteAsync(httpContext, contentPath);
 
        // Assert
        // Verifying if Redirect was called with the specific Url and parameter flag.
        Assert.Equal(expectedPath, httpContext.Response.Headers.Location.ToString());
        Assert.Equal(StatusCodes.Status302Found, httpContext.Response.StatusCode);
    }
 
    [Theory]
    [InlineData(null, "~/Home/About", "/Home/About")]
    [InlineData("/", "~/Home/About", "/Home/About")]
    [InlineData("/", "~/", "/")]
    [InlineData("", "~/Home/About", "/Home/About")]
    [InlineData("/myapproot", "~/", "/myapproot/")]
    public async Task Execute_ReturnsAppRelativePath_WhenItStartsWithTilde(
        string appRoot,
        string contentPath,
        string expectedPath)
    {
        // Arrange
        var httpContext = GetHttpContext(appRoot);
 
        // Act
        await ExecuteAsync(httpContext, contentPath);
 
        // Assert
        // Verifying if Redirect was called with the specific Url and parameter flag.
        Assert.Equal(expectedPath, httpContext.Response.Headers.Location.ToString());
        Assert.Equal(StatusCodes.Status302Found, httpContext.Response.StatusCode);
    }
 
    private static IServiceProvider GetServiceProvider()
    {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddTransient<ILoggerFactory, NullLoggerFactory>();
        serviceCollection.AddTransient(typeof(ILogger<>), typeof(NullLogger<>));
        return serviceCollection.BuildServiceProvider();
    }
 
    private static HttpContext GetHttpContext(
        string appRoot)
    {
        var httpContext = new DefaultHttpContext();
        httpContext.RequestServices = GetServiceProvider();
        httpContext.Request.PathBase = new PathString(appRoot);
        return httpContext;
    }
}