File: WasmBuildLazyLoadTest.cs
Web Access
Project: ..\..\..\test\Microsoft.NET.Sdk.BlazorWebAssembly.Tests\Microsoft.NET.Sdk.BlazorWebAssembly.Tests.csproj (Microsoft.NET.Sdk.BlazorWebAssembly.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using System.Text.Json;
using Microsoft.NET.Sdk.WebAssembly;
 
namespace Microsoft.NET.Sdk.BlazorWebAssembly.Tests
{
    public class WasmBuildLazyLoadTest : AspNetSdkTest
    {
        public WasmBuildLazyLoadTest(ITestOutputHelper log) : base(log) { }
 
        [RequiresMSBuildVersionFact("17.12", Reason = "Needs System.Text.Json 8.0.5")]
        public void Build_LazyLoadExplicitAssembly_Debug_Works()
        {
            // Arrange
            var testAppName = "BlazorWasmWithLibrary";
            var testInstance = CreateAspNetSdkTestAsset(testAppName);
 
            testInstance.WithProjectChanges((project) =>
            {
                var ns = project.Root.Name.Namespace;
                var itemGroup = new XElement(ns + "ItemGroup");
                itemGroup.Add(new XElement("BlazorWebAssemblyLazyLoad",
                    new XAttribute("Include", "RazorClassLibrary.wasm")));
                project.Root.Add(itemGroup);
 
                var propertyGroup = new XElement("PropertyGroup");
                propertyGroup.Add(new XElement("WasmFingerprintAssets", false));
                project.Root.Add(propertyGroup);
            });
 
            // Act
            var buildCommand = CreateBuildCommand(testInstance, "blazorwasm");
            ExecuteCommand(buildCommand)
                .Should().Pass();
 
            var outputDirectory = buildCommand.GetOutputDirectory(DefaultTfm);
 
            // Assert
            var expectedFiles = new[]
            {
                $"wwwroot/_framework/{WasmBootConfigFileName}",
                "wwwroot/_framework/RazorClassLibrary.wasm"
            };
 
            outputDirectory.Should().HaveFiles(expectedFiles);
 
            var bootJson = ReadBootJsonData(Path.Combine(outputDirectory.ToString(), "wwwroot", "_framework", WasmBootConfigFileName));
 
            // And that it has been labelled as a dynamic assembly in the boot.json
            var lazyAssemblies = bootJson.resources.lazyAssembly;
            var assemblies = bootJson.resources.assembly;
 
            lazyAssemblies.Should().NotBeNull();
 
            lazyAssemblies.Keys.Should().Contain("RazorClassLibrary.wasm");
            assemblies.Keys.Should().NotContain("RazorClassLibrary.wasm");
 
            // App assembly should not be lazy loaded
            lazyAssemblies.Keys.Should().NotContain("blazorwasm.wasm");
            assemblies.Keys.Should().Contain("blazorwasm.wasm");
        }
 
        [RequiresMSBuildVersionFact("17.12", Reason = "Needs System.Text.Json 8.0.5")]
        public void Build_LazyLoadExplicitAssembly_Release_Works()
        {
            // Arrange
            var testAppName = "BlazorWasmWithLibrary";
            var testInstance = CreateAspNetSdkTestAsset(testAppName);
 
            testInstance.WithProjectChanges((project) =>
            {
                var ns = project.Root.Name.Namespace;
                var itemGroup = new XElement(ns + "ItemGroup");
                itemGroup.Add(new XElement("BlazorWebAssemblyLazyLoad",
                    new XAttribute("Include", "RazorClassLibrary.wasm")));
                project.Root.Add(itemGroup);
 
                var propertyGroup = new XElement("PropertyGroup");
                propertyGroup.Add(new XElement("WasmFingerprintAssets", false));
                project.Root.Add(propertyGroup);
            });
 
            // Act
            var buildCommand = CreateBuildCommand(testInstance, "blazorwasm");
            buildCommand.Execute("/p:Configuration=Release")
                .Should().Pass();
 
            var outputDirectory = buildCommand.GetOutputDirectory(DefaultTfm, "Release");
 
            // Assert
            var expectedFiles = new[]
            {
                $"wwwroot/_framework/{WasmBootConfigFileName}",
                "wwwroot/_framework/RazorClassLibrary.wasm"
            };
 
            outputDirectory.Should().HaveFiles(expectedFiles);
 
            var bootJson = ReadBootJsonData(Path.Combine(outputDirectory.ToString(), "wwwroot", "_framework", WasmBootConfigFileName));
 
            // And that it has been labelled as a dynamic assembly in the boot.json
            var lazyAssemblies = bootJson.resources.lazyAssembly;
            var assemblies = bootJson.resources.assembly;
 
            lazyAssemblies.Should().NotBeNull();
 
            lazyAssemblies.Keys.Should().Contain("RazorClassLibrary.wasm");
            assemblies.Keys.Should().NotContain("RazorClassLibrary.wasm");
 
            // App assembly should not be lazy loaded
            lazyAssemblies.Keys.Should().NotContain("blazorwasm.wasm");
            assemblies.Keys.Should().Contain("blazorwasm.wasm");
        }
 
        [RequiresMSBuildVersionFact("17.12", Reason = "Needs System.Text.Json 8.0.5")]
        public void Publish_LazyLoadExplicitAssembly_Debug_Works()
        {
            // Arrange
            var testAppName = "BlazorWasmWithLibrary";
            var testInstance = CreateAspNetSdkTestAsset(testAppName);
 
            testInstance.WithProjectChanges((project) =>
            {
                var ns = project.Root.Name.Namespace;
                var itemGroup = new XElement(ns + "ItemGroup");
                itemGroup.Add(new XElement("BlazorWebAssemblyLazyLoad",
                    new XAttribute("Include", "RazorClassLibrary.wasm")));
                project.Root.Add(itemGroup);
 
                var propertyGroup = new XElement("PropertyGroup");
                propertyGroup.Add(new XElement("WasmFingerprintAssets", false));
                project.Root.Add(propertyGroup);
            });
 
            // Act
            var publishCommand = new PublishCommand(testInstance, "blazorwasm");
            publishCommand.Execute()
                .Should().Pass();
 
            var outputDirectory = publishCommand.GetOutputDirectory(DefaultTfm);
 
            // Assert
            var expectedFiles = new[]
            {
                $"wwwroot/_framework/{WasmBootConfigFileName}",
                "wwwroot/_framework/RazorClassLibrary.wasm"
            };
 
            outputDirectory.Should().HaveFiles(expectedFiles);
 
            var bootJson = ReadBootJsonData(Path.Combine(outputDirectory.ToString(), "wwwroot", "_framework", WasmBootConfigFileName));
 
            // And that it has been labelled as a dynamic assembly in the boot.json
            var lazyAssemblies = bootJson.resources.lazyAssembly;
            var assemblies = bootJson.resources.assembly;
 
            lazyAssemblies.Should().NotBeNull();
 
            lazyAssemblies.Keys.Should().Contain("RazorClassLibrary.wasm");
            assemblies.Keys.Should().NotContain("RazorClassLibrary.wasm");
 
            // App assembly should not be lazy loaded
            lazyAssemblies.Keys.Should().NotContain("blazorwasm.wasm");
            assemblies.Keys.Should().Contain("blazorwasm.wasm");
        }
 
        [RequiresMSBuildVersionFact("17.12", Reason = "Needs System.Text.Json 8.0.5")]
        public void Publish_LazyLoadExplicitAssembly_Release_Works()
        {
            // Arrange
            var testAppName = "BlazorWasmWithLibrary";
            var testInstance = CreateAspNetSdkTestAsset(testAppName);
 
            testInstance.WithProjectChanges((project) =>
            {
                var ns = project.Root.Name.Namespace;
                var itemGroup = new XElement(ns + "ItemGroup");
                itemGroup.Add(new XElement("BlazorWebAssemblyLazyLoad",
                    new XAttribute("Include", "RazorClassLibrary.wasm")));
                project.Root.Add(itemGroup);
 
                var propertyGroup = new XElement("PropertyGroup");
                propertyGroup.Add(new XElement("WasmFingerprintAssets", false));
                project.Root.Add(propertyGroup);
            });
 
            // Act
            var publishCommand = new PublishCommand(testInstance, "blazorwasm");
            publishCommand.Execute("/p:Configuration=Release")
                .Should().Pass();
 
            var outputDirectory = publishCommand.GetOutputDirectory(DefaultTfm, "Release");
 
            // Assert
            var expectedFiles = new[]
            {
                $"wwwroot/_framework/{WasmBootConfigFileName}",
                "wwwroot/_framework/RazorClassLibrary.wasm"
            };
 
            outputDirectory.Should().HaveFiles(expectedFiles);
 
            var bootJson = ReadBootJsonData(Path.Combine(outputDirectory.ToString(), "wwwroot", "_framework", WasmBootConfigFileName));
 
            // And that it has been labelled as a dynamic assembly in the boot.json
            var lazyAssemblies = bootJson.resources.lazyAssembly;
            var assemblies = bootJson.resources.assembly;
 
            lazyAssemblies.Should().NotBeNull();
 
            lazyAssemblies.Keys.Should().Contain("RazorClassLibrary.wasm");
            assemblies.Keys.Should().NotContain("RazorClassLibrary.wasm");
 
            // App assembly should not be lazy loaded
            lazyAssemblies.Keys.Should().NotContain("blazorwasm.wasm");
            assemblies.Keys.Should().Contain("blazorwasm.wasm");
        }
 
        [RequiresMSBuildVersionFact("17.12", Reason = "Needs System.Text.Json 8.0.5")]
        public void Build_LazyLoadExplicitAssembly_InvalidAssembly()
        {
            // Arrange
            var testAppName = "BlazorWasmWithLibrary";
            var testInstance = CreateAspNetSdkTestAsset(testAppName);
 
            testInstance.WithProjectChanges((project) =>
            {
                var ns = project.Root.Name.Namespace;
                var itemGroup = new XElement(ns + "ItemGroup");
                itemGroup.Add(new XElement("BlazorWebAssemblyLazyLoad",
                    new XAttribute("Include", "RazorClassLibraryInvalid.wasm")));
                project.Root.Add(itemGroup);
            });
 
            // Assert
            var buildCommand = CreateBuildCommand(testInstance, "blazorwasm");
            ExecuteCommand(buildCommand).Should().Fail().And.HaveStdOutContaining("BLAZORSDK1001");
        }
 
        [RequiresMSBuildVersionFact("17.12", Reason = "Needs System.Text.Json 8.0.5")]
        public void Publish_LazyLoadExplicitAssembly_InvalidAssembly()
        {
            // Arrange
            var testAppName = "BlazorWasmWithLibrary";
            var testInstance = CreateAspNetSdkTestAsset(testAppName);
 
            testInstance.WithProjectChanges((project) =>
            {
                var ns = project.Root.Name.Namespace;
                var itemGroup = new XElement(ns + "ItemGroup");
                itemGroup.Add(new XElement("BlazorWebAssemblyLazyLoad",
                    new XAttribute("Include", "RazorClassLibraryInvalid.wasm")));
                project.Root.Add(itemGroup);
            });
 
            // Assert
            var publishCommand = new PublishCommand(Log, Path.Combine(testInstance.TestRoot, "blazorwasm"));
            publishCommand.Execute("/p:Configuration=Release").Should().Fail().And.HaveStdOutContaining("BLAZORSDK1001");
        }
 
        private static BootJsonData ReadBootJsonData(string path)
        {
            return BootJsonDataLoader.ParseBootData(path);
        }
    }
}