File: Utils\NpmInstallDetectionTests.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Cli.Utils;
 
namespace Aspire.Cli.Tests.Utils;
 
public class NpmInstallDetectionTests
{
    [Fact]
    public void IsRunningFromNpm_ReturnsTrueWhenPackageEnvironmentVariableMatches()
    {
        using var scope = NpmInstallDetection.UseEnvironmentForTesting(new Dictionary<string, string?>
        {
            [NpmInstallDetection.PackageEnvironmentVariableName] = NpmInstallDetection.ExpectedPackageName,
            [NpmInstallDetection.PackageVersionEnvironmentVariableName] = "9.4.0",
            [NpmInstallDetection.PackageRidEnvironmentVariableName] = "linux-x64",
        });
 
        Assert.True(NpmInstallDetection.IsRunningFromNpm());
        Assert.Equal(
            $"npm install -g {NpmInstallDetection.ExpectedPackageName}@latest",
            NpmInstallDetection.GetNpmUpdateCommand());
        Assert.Equal("9.4.0", NpmInstallDetection.GetNpmPackageVersion());
        Assert.Equal("linux-x64", NpmInstallDetection.GetNpmPackageRid());
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    [InlineData("@some-other-scope/aspire-cli")]
    [InlineData("aspire-cli")]
    [InlineData("@Microsoft/Aspire-Cli")]
    public void IsRunningFromNpm_ReturnsFalseWhenPackageEnvironmentVariableMissingOrMismatched(string? packageName)
    {
        using var scope = NpmInstallDetection.UseEnvironmentForTesting(new Dictionary<string, string?>
        {
            [NpmInstallDetection.PackageEnvironmentVariableName] = packageName,
            [NpmInstallDetection.PackageVersionEnvironmentVariableName] = "9.4.0",
            [NpmInstallDetection.PackageRidEnvironmentVariableName] = "linux-x64",
        });
 
        Assert.False(NpmInstallDetection.IsRunningFromNpm());
        Assert.Null(NpmInstallDetection.GetNpmUpdateCommand());
    }
 
    [Fact]
    public void GetNpmPackageVersion_ReturnsNullWhenVariableMissing()
    {
        using var scope = NpmInstallDetection.UseEnvironmentForTesting(new Dictionary<string, string?>
        {
            [NpmInstallDetection.PackageEnvironmentVariableName] = NpmInstallDetection.ExpectedPackageName,
        });
 
        Assert.Null(NpmInstallDetection.GetNpmPackageVersion());
        Assert.Null(NpmInstallDetection.GetNpmPackageRid());
    }
 
    [Fact]
    public void UseEnvironmentForTesting_RestoresPreviousValueOnDispose()
    {
        // Establish a known baseline that does NOT match, so the test result is
        // independent of whatever ASPIRE_NPM_PACKAGE the test host may inherit.
        using var baseline = NpmInstallDetection.UseEnvironmentForTesting(new Dictionary<string, string?>());
        Assert.False(NpmInstallDetection.IsRunningFromNpm());
 
        using (NpmInstallDetection.UseEnvironmentForTesting(new Dictionary<string, string?>
        {
            [NpmInstallDetection.PackageEnvironmentVariableName] = NpmInstallDetection.ExpectedPackageName,
        }))
        {
            Assert.True(NpmInstallDetection.IsRunningFromNpm());
        }
 
        Assert.False(NpmInstallDetection.IsRunningFromNpm());
    }
}