File: HostingStartupTest.cs
Web Access
Project: ..\..\..\test\Microsoft.AspNetCore.Watch.BrowserRefresh.Tests\Microsoft.AspNetCore.Watch.BrowserRefresh.Tests.csproj (Microsoft.AspNetCore.Watch.BrowserRefresh.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.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
 
namespace Microsoft.AspNetCore.Watch.BrowserRefresh
{
    public class HostingStartupTest
    {
        [Fact]
        public async Task ClearSiteDataWorks()
        {
            // Arrange
            var requestDelegate = GetRequestDelegate();
            var context = new DefaultHttpContext();
            context.Request.Path = "/_framework/clear-browser-cache";
 
            // Act
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
            Assert.Equal("\"cache\"", context.Response.Headers["Clear-Site-Data"]);
        }
 
        [Fact]
        public async Task GetBlazorHotReloadMiddlewareWorks()
        {
            // Arrange
            var requestDelegate = GetRequestDelegate();
            var context = new DefaultHttpContext();
            context.Request.Method = "GET";
            context.Request.Path = "/_framework/blazor-hotreload";
            context.Response.Body = new MemoryStream();
 
            // Act
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status204NoContent, context.Response.StatusCode);
        }
 
        [Fact]
        public async Task PostBlazorHotReloadMiddlewareWorks()
        {
            var requestDelegate = GetRequestDelegate();
            var context = new DefaultHttpContext();
            context.Request.Path = "/_framework/blazor-hotreload";
            context.Request.Method = "POST";
 
            var updateJson = """
                {"id":0,"deltas":[{"moduleId":"9BBB9BBD-48F0-4EB2-B7A3-956CFC220CC4","metadataDelta":"","ilDelta":"","pdbDelta":"","updatedTypes":[1,2,3]}]}
                """;
 
            context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(updateJson));
 
            await requestDelegate(context);
 
            Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
 
            context.Request.Path = "/_framework/blazor-hotreload";
            context.Request.Method = "GET";
 
            var body = new MemoryStream();
            context.Response.Body = body;
 
            await requestDelegate(context);
 
            var bodyJson = Encoding.UTF8.GetString(body.ToArray());
 
            Assert.Equal($"[{updateJson}]", bodyJson);
        }
 
        [Fact]
        public async Task GetBlazorHotReloadJsWorks()
        {
            // Arrange
            var requestDelegate = GetRequestDelegate();
            var context = new DefaultHttpContext();
            context.Request.Path = "/_framework/blazor-hotreload.js";
            var responseBody = new MemoryStream();
            context.Response.Body = responseBody;
 
            // Act
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
            Assert.NotEmpty(responseBody.ToArray());
        }
 
        [Fact]
        public async Task GetAspNetCoreBrowserRefreshWorks()
        {
            // Arrange
            var requestDelegate = GetRequestDelegate();
            var context = new DefaultHttpContext();
            context.Request.Path = "/_framework/aspnetcore-browser-refresh.js";
            var responseBody = new MemoryStream();
            context.Response.Body = responseBody;
 
            // Act
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
            Assert.NotEmpty(responseBody.ToArray());
        }
 
        [Fact]
        public async Task GetUnknownUrlWorks()
        {
            // Arrange
            var requestDelegate = GetRequestDelegate();
            var context = new DefaultHttpContext();
            context.Request.Path = "/someurl";
 
            // Act
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status418ImATeapot, context.Response.StatusCode);
        }
 
        [Fact]
        public async Task GetUnknownFrameworkPathWorks()
        {
            // Arrange
            var requestDelegate = GetRequestDelegate(builder =>
            {
                builder.Use((context, next) =>
                {
                    var path = context.Request.Path;
                    if (path == "/_framework/blazor.webassembly.js")
                    {
                        context.Response.StatusCode = StatusCodes.Status206PartialContent;
                        return Task.CompletedTask;
                    }
                    else if (path == "/_framework/System.dll")
                    {
                        context.Response.StatusCode = StatusCodes.Status226IMUsed;
                        return Task.CompletedTask;
                    }
 
                    return next();
                });
            });
 
            var context = new DefaultHttpContext();
            context.Request.Path = "/_framework/blazor.webassembly.js";
 
            // Act
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status206PartialContent, context.Response.StatusCode);
 
 
            // Act - 2
            context.Request.Path = "/_framework/System.dll";
            await requestDelegate(context);
 
            // Assert
            Assert.Equal(StatusCodes.Status226IMUsed, context.Response.StatusCode);
        }
 
        private static RequestDelegate GetRequestDelegate(Action<IApplicationBuilder>? configureBuilder = null)
        {
            configureBuilder ??= static builder =>
            {
                builder.Run(context =>
                {
                    context.Response.StatusCode = StatusCodes.Status418ImATeapot;
                    return Task.CompletedTask;
                });
            };
 
            var action = new HostingStartup().Configure(configureBuilder);
 
            var serviceProvider = new ServiceCollection()
                .AddLogging()
                .BuildServiceProvider();
            var builder = new ApplicationBuilder(serviceProvider);
            action(builder);
            return builder.Build();
        }
    }
}