File: Utils\DevCertsCheckFixRecommendationTests.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.Certificates;
using Aspire.Cli.Utils.EnvironmentChecker;
using Microsoft.AspNetCore.Certificates.Generation;
 
namespace Aspire.Cli.Tests.Utils;
 
public class DevCertsCheckFixRecommendationTests
{
    [Fact]
    public void EvaluateCertificateResults_NoCertificates_RecommendsTrust()
    {
        var results = DevCertsCheck.EvaluateCertificateResults([]);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Warning, result.Status);
        Assert.NotNull(result.Fix);
        Assert.Contains("aspire certs trust", result.Fix);
        Assert.DoesNotContain("aspire certs clean", result.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_SingleUntrustedCert_RecommendsTrust()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.None, "AABB1234", 4)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Warning, result.Status);
        Assert.NotNull(result.Fix);
        Assert.Contains("aspire certs trust", result.Fix);
        Assert.DoesNotContain("aspire certs clean", result.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_SingleFullyTrustedCert_ReportsPass()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.Full, "AABB1234", 4)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Pass, result.Status);
        Assert.Null(result.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_MultipleCerts_SomeUntrusted_RecommendsCleanAndTrust()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.Full, "AABB1234", 4),
            new(CertificateManager.TrustLevel.None, "CCDD5678", 4)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Warning, result.Status);
        Assert.NotNull(result.Fix);
        Assert.Contains("aspire certs clean", result.Fix);
        Assert.Contains("aspire certs trust", result.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_MultipleCerts_NoneUntrusted_RecommendsCleanAndTrust()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.None, "AABB1234", 4),
            new(CertificateManager.TrustLevel.None, "CCDD5678", 4)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Warning, result.Status);
        Assert.NotNull(result.Fix);
        Assert.Contains("aspire certs clean", result.Fix);
        Assert.Contains("aspire certs trust", result.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_OldVersionCert_RecommendsCleanAndTrust()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.Full, "AABB1234", 1)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        // Should have two results: pass for trust status, warning for old version
        Assert.Equal(2, results.Count);
        var versionWarning = results.First(r => r.Name == "dev-certs-version");
        Assert.Equal(EnvironmentCheckStatus.Warning, versionWarning.Status);
        Assert.NotNull(versionWarning.Fix);
        Assert.Contains("aspire certs clean", versionWarning.Fix);
        Assert.Contains("aspire certs trust", versionWarning.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_PartiallyTrustedCert_RecommendsSslCertDir()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.Partial, "AABB1234", 4)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Warning, result.Status);
        Assert.NotNull(result.Fix);
        // Partial trust fix involves SSL_CERT_DIR, not aspire certs commands
        Assert.DoesNotContain("aspire certs", result.Fix);
    }
 
    [Fact]
    public void EvaluateCertificateResults_MultipleAllTrusted_ReportsPass()
    {
        var certInfos = new List<CertificateInfo>
        {
            new(CertificateManager.TrustLevel.Full, "AABB1234", 4),
            new(CertificateManager.TrustLevel.Full, "CCDD5678", 4)
        };
 
        var results = DevCertsCheck.EvaluateCertificateResults(certInfos);
 
        var result = Assert.Single(results);
        Assert.Equal(EnvironmentCheckStatus.Pass, result.Status);
    }
 
    [Fact]
    public void IsSuccessfulTrustResult_SuccessResults_ReturnsTrue()
    {
        Assert.True(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.Succeeded));
        Assert.True(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.ValidCertificatePresent));
        Assert.True(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.ExistingHttpsCertificateTrusted));
        Assert.True(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.NewHttpsCertificateTrusted));
    }
 
    [Fact]
    public void IsSuccessfulTrustResult_FailureResults_ReturnsFalse()
    {
        Assert.False(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.FailedToTrustTheCertificate));
        Assert.False(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.ErrorCreatingTheCertificate));
        Assert.False(CertificateHelpers.IsSuccessfulTrustResult(EnsureCertificateResult.ErrorSavingTheCertificateIntoTheCurrentUserPersonalStore));
    }
}