File: Publishing\ConnectionStringPropagationTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Radius.Tests\Aspire.Hosting.Radius.Tests.csproj (Aspire.Hosting.Radius.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.Hosting.ApplicationModel;
using Aspire.Hosting.Radius.Publishing;
using Aspire.Hosting.Utils;
using Microsoft.Extensions.DependencyInjection;
 
namespace Aspire.Hosting.Radius.Tests.Publishing;
 
public class ConnectionStringPropagationTests
{
    [Fact]
    public void WithReference_CreatesConnectionBlock_OnContainer()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv");
        var cache = builder.AddRedis("cache");
        builder.AddContainer("api", "myapp/api", "latest")
            .WithReference(cache);
 
        using var app = builder.Build();
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var radiusEnv = model.Resources.OfType<RadiusEnvironmentResource>().First();
        RadiusTestHelper.AttachDeploymentTargets(radiusEnv, model);
        var context = new RadiusBicepPublishingContext(radiusEnv);
        var bicep = context.GenerateBicep(model);
 
        // Container should have a connections block with cache reference
        Assert.Contains("connections: {", bicep);
        Assert.Contains("source: cache.id", bicep);
    }
 
    [Fact]
    public void MultipleReferences_AllPresentInConnectionsBlock()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv");
        var cache = builder.AddRedis("cache");
        var sql = builder.AddSqlServer("sqlserver");
        builder.AddContainer("api", "myapp/api", "latest")
            .WithReference(cache)
            .WithReference(sql);
 
        using var app = builder.Build();
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var radiusEnv = model.Resources.OfType<RadiusEnvironmentResource>().First();
        RadiusTestHelper.AttachDeploymentTargets(radiusEnv, model);
        var context = new RadiusBicepPublishingContext(radiusEnv);
        var bicep = context.GenerateBicep(model);
 
        Assert.Contains("source: cache.id", bicep);
        Assert.Contains("source: sqlserver.id", bicep);
    }
 
    [Fact]
    public void NoReferences_OmitsConnectionsBlock()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv");
        builder.AddContainer("api", "myapp/api", "latest");
 
        using var app = builder.Build();
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var radiusEnv = model.Resources.OfType<RadiusEnvironmentResource>().First();
        RadiusTestHelper.AttachDeploymentTargets(radiusEnv, model);
        var context = new RadiusBicepPublishingContext(radiusEnv);
        var bicep = context.GenerateBicep(model);
 
        // Container without references should NOT have a connections block. This AppHost
        // has only the single container, so asserting the whole Bicep output contains no
        // "connections:" block is sufficient.
        Assert.DoesNotContain("connections:", bicep);
    }
 
    [Fact]
    public void ChildResource_ResolvesToParent_InConnections()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv");
        var sql = builder.AddSqlServer("sqlserver").AddDatabase("mydb");
        builder.AddContainer("api", "myapp/api", "latest")
            .WithReference(sql);
 
        using var app = builder.Build();
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var radiusEnv = model.Resources.OfType<RadiusEnvironmentResource>().First();
        RadiusTestHelper.AttachDeploymentTargets(radiusEnv, model);
        var context = new RadiusBicepPublishingContext(radiusEnv);
        var bicep = context.GenerateBicep(model);
 
        // Child resource (mydb) should resolve to parent (sqlserver) in connections
        Assert.Contains("source: sqlserver.id", bicep);
    }
 
}