File: SpaServicesExtensionsTests.cs
Web Access
Project: src\src\Middleware\Spa\SpaServices.Extensions\test\Microsoft.AspNetCore.SpaServices.Extensions.Tests.csproj (Microsoft.AspNetCore.SpaServices.Extensions.Tests)
// 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.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.SpaServices.AngularCli;
using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer;
using Microsoft.AspNetCore.SpaServices.StaticFiles;
using Microsoft.AspNetCore.InternalTesting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DiagnosticAdapter;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Moq;
using Xunit;
 
namespace Microsoft.AspNetCore.SpaServices.Extensions.Tests;
 
public class SpaServicesExtensionsTests
{
    [Fact]
    public void UseSpa_ThrowsInvalidOperationException_IfRootpathNotSet()
    {
        // Arrange
        var applicationbuilder = GetApplicationBuilder(GetServiceProvider());
 
        // Act & Assert
        var exception = Assert.Throws<InvalidOperationException>(
            () => applicationbuilder.UseSpa(rb => { }));
 
        Assert.Equal("No RootPath was set on the SpaStaticFilesOptions.", exception.Message);
    }
 
    private IApplicationBuilder GetApplicationBuilder(IServiceProvider serviceProvider = null)
    {
        if (serviceProvider == null)
        {
            serviceProvider = new Mock<IServiceProvider>(MockBehavior.Strict).Object;
        }
 
        var applicationbuilderMock = new Mock<IApplicationBuilder>();
        applicationbuilderMock
            .Setup(s => s.ApplicationServices)
            .Returns(serviceProvider);
 
        return applicationbuilderMock.Object;
    }
 
    private IServiceProvider GetServiceProvider(Action<SpaStaticFilesOptions> configuration = null)
    {
        var services = new ServiceCollection();
        services.AddLogging();
        services.AddSpaStaticFiles(configuration);
        services.AddSingleton<ILoggerFactory>(ListLoggerFactory);
        services.AddSingleton(typeof(IHostApplicationLifetime), new TestHostApplicationLifetime());
        services.AddSingleton(typeof(IWebHostEnvironment), new TestWebHostEnvironment());
 
        var listener = new DiagnosticListener("Microsoft.AspNetCore");
        services.AddSingleton(listener);
        services.AddSingleton<DiagnosticSource>(listener);
 
        return services.BuildServiceProvider();
    }
 
    private ListLoggerFactory ListLoggerFactory { get; } = new ListLoggerFactory(c => c == "Microsoft.AspNetCore.SpaServices");
 
    private class TestHostApplicationLifetime : IHostApplicationLifetime
    {
        CancellationTokenSource _applicationStoppingSource;
        CancellationTokenSource _applicationStoppedSource;
 
        public TestHostApplicationLifetime()
        {
            _applicationStoppingSource = new CancellationTokenSource();
            ApplicationStopping = _applicationStoppingSource.Token;
 
            _applicationStoppedSource = new CancellationTokenSource();
            ApplicationStopped = _applicationStoppedSource.Token;
        }
 
        public CancellationToken ApplicationStarted => CancellationToken.None;
 
        public CancellationToken ApplicationStopping { get; }
 
        public CancellationToken ApplicationStopped { get; }
 
        public void StopApplication()
        {
            _applicationStoppingSource.Cancel();
            _applicationStoppedSource.Cancel();
        }
    }
 
    private class TestWebHostEnvironment : IWebHostEnvironment
    {
        public string EnvironmentName { get; set; }
        public string ApplicationName { get; set; }
        public string ContentRootPath { get; set; } = Directory.GetCurrentDirectory();
        public string WebRootPath { get; set; } = Directory.GetCurrentDirectory();
        public IFileProvider ContentRootFileProvider { get; set; }
        public IFileProvider WebRootFileProvider { get; set; }
    }
}