File: CommandTests\Workload\Install\WorkloadInstallAspireDeprecationTests.cs
Web Access
Project: ..\..\..\test\dotnet.Tests\dotnet.Tests.csproj (dotnet.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 ManifestReaderTests;
using Microsoft.DotNet.Cli.Commands.Workload.Install;
using Microsoft.DotNet.Cli.NuGetPackageDownloader;
using Microsoft.NET.Sdk.WorkloadManifestReader;
 
namespace Microsoft.DotNet.Cli.Workload.Install.Tests
{
    public class WorkloadInstallAspireDeprecationTests : SdkTest
    {
        private readonly BufferedReporter _reporter;
 
        public WorkloadInstallAspireDeprecationTests(ITestOutputHelper log) : base(log)
        {
            _reporter = new BufferedReporter();
        }
 
        [Fact]
        public void GivenOnlyAspireWorkloadItShowsDeprecationMessage()
        {
            var testDirectory = _testAssetsManager.CreateTestDirectory().Path;
            var dotnetRoot = Path.Combine(testDirectory, "dotnet");
            var userProfileDir = Path.Combine(testDirectory, "user-profile");
 
            var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot);
            var workloadResolverFactory = new MockWorkloadResolverFactory(dotnetRoot, "6.0.100", workloadResolver, userProfileDir);
            var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot);
            var manifestUpdater = new MockWorkloadManifestUpdater();
            var workloadInstaller = new MockPackWorkloadInstaller();
 
            var parseResult = Parser.Parse(new string[] { "dotnet", "workload", "install", "aspire" });
 
            var command = new WorkloadInstallCommand(
                parseResult,
                reporter: _reporter,
                workloadResolverFactory: workloadResolverFactory,
                workloadInstaller: workloadInstaller,
                nugetPackageDownloader: nugetDownloader,
                workloadManifestUpdater: manifestUpdater,
                tempDirPath: testDirectory);
 
            var exitCode = command.Execute();
 
            // Should exit successfully but show deprecation message
            exitCode.Should().Be(0);
            _reporter.Lines.Should().Contain(line => line.Contains("Aspire workload is deprecated"));
            _reporter.Lines.Should().Contain(line => line.Contains("https://aka.ms/aspire/support-policy"));
 
            // Should not have installed any workloads
            workloadInstaller.InstallationRecordRepository.InstalledWorkloads.Should().BeEmpty();
        }
 
        [Fact]
        public void GivenAspireWithOtherWorkloadsItShowsDeprecationAndInstallsOthers()
        {
            var testDirectory = _testAssetsManager.CreateTestDirectory().Path;
            var dotnetRoot = Path.Combine(testDirectory, "dotnet");
            var userProfileDir = Path.Combine(testDirectory, "user-profile");
 
            var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot);
            var workloadResolverFactory = new MockWorkloadResolverFactory(dotnetRoot, "6.0.100", workloadResolver, userProfileDir);
            var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot);
            var manifestUpdater = new MockWorkloadManifestUpdater();
            var workloadInstaller = new MockPackWorkloadInstaller();
 
            var parseResult = Parser.Parse(new string[] { "dotnet", "workload", "install", "aspire", "xamarin-android" });
 
            var command = new WorkloadInstallCommand(
                parseResult,
                reporter: _reporter,
                workloadResolverFactory: workloadResolverFactory,
                workloadInstaller: workloadInstaller,
                nugetPackageDownloader: nugetDownloader,
                workloadManifestUpdater: manifestUpdater,
                tempDirPath: testDirectory);
 
            var exitCode = command.Execute();
 
            // Should exit successfully, show deprecation message, but install android workload
            exitCode.Should().Be(0);
            _reporter.Lines.Should().Contain(line => line.Contains("Aspire workload is deprecated"));
            _reporter.Lines.Should().Contain(line => line.Contains("https://aka.ms/aspire/support-policy"));
 
            // Should have installed android but not aspire
            workloadInstaller.InstallationRecordRepository.InstalledWorkloads.Should().Contain(new WorkloadId("xamarin-android"));
            workloadInstaller.InstallationRecordRepository.InstalledWorkloads.Should().NotContain(new WorkloadId("aspire"));
        }
 
        [Fact]
        public void GivenAspireWorkloadDeprecationMessageIsShownOnlyOnce()
        {
            var testDirectory = _testAssetsManager.CreateTestDirectory().Path;
            var dotnetRoot = Path.Combine(testDirectory, "dotnet");
            var userProfileDir = Path.Combine(testDirectory, "user-profile");
 
            var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot);
            var workloadResolverFactory = new MockWorkloadResolverFactory(dotnetRoot, "6.0.100", workloadResolver, userProfileDir);
            var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot);
            var manifestUpdater = new MockWorkloadManifestUpdater();
            var workloadInstaller = new MockPackWorkloadInstaller();
 
            var parseResult = Parser.Parse(new string[] { "dotnet", "workload", "install", "aspire", "xamarin-android" });
 
            var command = new WorkloadInstallCommand(
                parseResult,
                reporter: _reporter,
                workloadResolverFactory: workloadResolverFactory,
                workloadInstaller: workloadInstaller,
                nugetPackageDownloader: nugetDownloader,
                workloadManifestUpdater: manifestUpdater,
                tempDirPath: testDirectory);
 
            var exitCode = command.Execute();
 
            // Should exit successfully and show deprecation message only once
            exitCode.Should().Be(0);
 
            // Count occurrences of the deprecation message
            var deprecationLines = _reporter.Lines.Where(line => line.Contains("Aspire workload is deprecated")).ToList();
            deprecationLines.Should().HaveCount(1, "deprecation message should be shown exactly once");
        }
 
        private string _manifestPath => Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "Sample.json");
    }
}