File: Publishing\MultiEnvironmentPublishTests.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.Radius.Publishing.Constructs;
using Aspire.Hosting.Utils;
using Microsoft.Extensions.DependencyInjection;
 
namespace Aspire.Hosting.Radius.Tests.Publishing;
 
public class MultiEnvironmentPublishTests
{
    [Fact]
    public void SingleEnvironment_AllResourcesScoped()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv");
        builder.AddRedis("cache");
        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);
 
        Assert.Contains("name: 'cache'", bicep);
        Assert.Contains("name: 'api'", bicep);
    }
 
    [Fact]
    public void RadiusEnvironment_ExcludesItself_FromResources()
    {
        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 options = context.BuildOptions(model);
 
        // The RadiusEnvironmentResource should not appear in resource type instances or containers
        Assert.DoesNotContain(options.ResourceTypeInstances.OfType<RadiusResourceTypeConstruct>(),
            r => r.ResourceName.Value == "myenv");
        Assert.DoesNotContain(options.Containers.OfType<RadiusContainerConstruct>(),
            r => r.ContainerName.Value == "myenv");
    }
 
    [Fact]
    public void EnvironmentName_AppearsInBicep()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("production");
        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);
 
        Assert.Contains("name: 'production'", bicep);
    }
 
    [Fact]
    public void MultipleEnvironments_ProduceSeparateBicepOutputs()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        var dev = builder.AddRadiusEnvironment("dev");
        var staging = builder.AddRadiusEnvironment("staging");
        // Pin each container to its environment. In production the per-environment
        // prepare step + ValidateComputeEnvironments enforce a single DeploymentTarget
        // per compute resource; the canonical GetDeploymentTargetAnnotation lookup the
        // publishing context now uses is strict about that contract.
        builder.AddContainer("api-dev", "myapp/api", "latest").WithComputeEnvironment(dev);
        builder.AddContainer("api-staging", "myapp/api", "latest").WithComputeEnvironment(staging);
 
        using var app = builder.Build();
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
 
        var environments = model.Resources.OfType<RadiusEnvironmentResource>().ToArray();
        Assert.Equal(2, environments.Length);
 
        foreach (var env in environments)
        {
            RadiusTestHelper.AttachDeploymentTargets(env, model);
            var context = new RadiusBicepPublishingContext(env);
            var bicep = context.GenerateBicep(model);
 
            Assert.NotNull(bicep);
            Assert.Contains($"name: '{env.Name}'", bicep);
            Assert.Contains("extension radius", bicep);
        }
    }
}