File: Configuration\IntegrationReferenceTests.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.Configuration;
 
namespace Aspire.Cli.Tests.Configuration;
 
public class IntegrationReferenceTests
{
    [Fact]
    public void PackageReference_HasVersionAndNoProjectPath()
    {
        var reference = IntegrationReference.FromPackage("Aspire.Hosting.Redis", "13.2.0");
 
        Assert.True(reference.IsPackageReference);
        Assert.False(reference.IsProjectReference);
        Assert.Equal("13.2.0", reference.Version);
        Assert.Null(reference.ProjectPath);
    }
 
    [Fact]
    public void ProjectReference_HasProjectPathAndNoVersion()
    {
        var reference = IntegrationReference.FromProject("MyIntegration", "/path/to/MyIntegration.csproj");
 
        Assert.True(reference.IsProjectReference);
        Assert.False(reference.IsPackageReference);
        Assert.Null(reference.Version);
        Assert.Equal("/path/to/MyIntegration.csproj", reference.ProjectPath);
    }
 
    [Fact]
    public void GetIntegrationReferences_DetectsCsprojAsProjectReference()
    {
        var config = new AspireJsonConfiguration
        {
            SdkVersion = "13.2.0",
            Packages = new Dictionary<string, string>
            {
                ["Aspire.Hosting.Redis"] = "13.2.0",
                ["MyIntegration"] = "../src/MyIntegration/MyIntegration.csproj"
            }
        };
 
        var refs = config.GetIntegrationReferences("13.2.0", "/home/user/app").ToList();
 
        // Base Aspire.Hosting + Redis (packages) + MyIntegration (project ref) = 3
        Assert.Equal(3, refs.Count);
 
        var packageRefs = refs.Where(r => r.IsPackageReference).ToList();
        var projectRefs = refs.Where(r => r.IsProjectReference).ToList();
 
        Assert.Equal(2, packageRefs.Count);
        Assert.Single(projectRefs);
        Assert.Equal("MyIntegration", projectRefs[0].Name);
        Assert.EndsWith(".csproj", projectRefs[0].ProjectPath!);
    }
 
    [Fact]
    public void GetIntegrationReferences_ResolvesRelativeProjectPath()
    {
        var config = new AspireJsonConfiguration
        {
            SdkVersion = "13.2.0",
            Packages = new Dictionary<string, string>
            {
                ["MyIntegration"] = "../MyIntegration/MyIntegration.csproj"
            }
        };
 
        var refs = config.GetIntegrationReferences("13.2.0", "/home/user/app").ToList();
        var projectRef = refs.Single(r => r.IsProjectReference);
 
        // Path should be resolved to absolute
        Assert.True(Path.IsPathRooted(projectRef.ProjectPath!));
    }
 
    [Fact]
    public void GetIntegrationReferences_EmptyVersionDefaultsToSdkVersion()
    {
        var config = new AspireJsonConfiguration
        {
            SdkVersion = "13.2.0",
            Packages = new Dictionary<string, string>
            {
                ["Aspire.Hosting.Redis"] = ""
            }
        };
 
        var refs = config.GetIntegrationReferences("13.2.0", "/tmp").ToList();
        var redis = refs.Single(r => r.Name == "Aspire.Hosting.Redis");
 
        Assert.Equal("13.2.0", redis.Version);
        Assert.True(redis.IsPackageReference);
    }
 
    [Fact]
    public void GetIntegrationReferences_SkipsBasePackages()
    {
        var config = new AspireJsonConfiguration
        {
            SdkVersion = "13.2.0",
            Packages = new Dictionary<string, string>
            {
                ["Aspire.Hosting"] = "13.2.0",
                ["Aspire.Hosting.AppHost"] = "13.2.0",
                ["Aspire.Hosting.Redis"] = "13.2.0"
            }
        };
 
        var refs = config.GetIntegrationReferences("13.2.0", "/tmp").ToList();
 
        // Base Aspire.Hosting (auto-added) + Redis = 2
        // Aspire.Hosting from packages dict is skipped (duplicate)
        // Aspire.Hosting.AppHost is skipped (SDK-only)
        Assert.Equal(2, refs.Count);
        Assert.Contains(refs, r => r.Name == "Aspire.Hosting");
        Assert.Contains(refs, r => r.Name == "Aspire.Hosting.Redis");
    }
}