File: Recipes\RecipePackParametersBicepTests.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.Recipes;
 
public class RecipePackParametersBicepTests
{
    private static string Publish(DistributedApplication app)
    {
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var radiusEnv = model.Resources.OfType<RadiusEnvironmentResource>().First();
        RadiusTestHelper.AttachDeploymentTargets(radiusEnv, model);
        var context = new RadiusBicepPublishingContext(radiusEnv);
        return context.GenerateBicep(model);
    }
 
    [Fact]
    public void EnvironmentWideParameters_EmittedOnRecipeEntry_WithBicepTypeFidelity()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv")
            .WithRecipeParameters(p =>
            {
                p["vpcId"] = "vpc-123";
                p["subnetIds"] = new[] { "subnet-a", "subnet-b" };
                p["port"] = 6379;
                p["tlsEnabled"] = true;
                p["settings"] = new Dictionary<string, object> { ["tier"] = "standard", ["replicas"] = 3 };
            });
        builder.AddRedis("cache");
 
        using var app = builder.Build();
        var bicep = Publish(app);
 
        Assert.Contains("parameters: {", bicep);
        Assert.Contains("vpcId: 'vpc-123'", bicep);
        // Array preserved as a Bicep array (not a quoted string).
        Assert.Contains("'subnet-a'", bicep);
        Assert.Contains("'subnet-b'", bicep);
        // Number and boolean literals (not quoted).
        Assert.Contains("port: 6379", bicep);
        Assert.Contains("tlsEnabled: true", bicep);
        // Nested object preserved.
        Assert.Contains("tier: 'standard'", bicep);
        Assert.Contains("replicas: 3", bicep);
        Assert.DoesNotContain("port: '6379'", bicep);
        Assert.DoesNotContain("tlsEnabled: 'true'", bicep);
    }
 
    [Fact]
    public void NoRecipeParameters_OmitsParametersKey()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv");
        builder.AddRedis("cache");
 
        using var app = builder.Build();
        var bicep = Publish(app);
 
        Assert.DoesNotContain("parameters: {", bicep);
    }
 
    // T021 — legacy inline-recipes shape carries the parameters block.
    [Fact]
    public void EnvironmentWideParameters_EmittedOnLegacyRecipeEntry()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        builder.AddRadiusEnvironment("myenv")
            .WithRecipeParameters(p => { p["region"] = "us-west-2"; p["replicas"] = 3; });
        // Redis falls back to the legacy Applications.* recipe shape.
        builder.AddRedis("cache");
 
        using var app = builder.Build();
        var bicep = Publish(app);
 
        Assert.Contains("Applications.Core/environments", bicep);
        Assert.Contains("parameters: {", bicep);
        Assert.Contains("region: 'us-west-2'", bicep);
        Assert.Contains("replicas: 3", bicep);
    }
}