File: DefaultUserSecretsManagerTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Azure.Tests\Aspire.Hosting.Azure.Tests.csproj (Aspire.Hosting.Azure.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json.Nodes;
using Aspire.Hosting.Azure.Provisioning.Internal;
 
namespace Aspire.Hosting.Azure.Tests;
 
public class DefaultUserSecretsManagerTests
{
    [Fact]
    public void FlattenJsonObject_HandlesNestedStructures()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["Azure:SubscriptionId"] = "existing-flat-value",
            ["Azure"] = new JsonObject
            {
                ["Tenant"] = "microsoft.onmicrosoft.com",
                ["Deployments"] = new JsonObject
                {
                    ["MyStorage"] = new JsonObject
                    {
                        ["Id"] = "/subscriptions/123/deployments/MyStorage",
                        ["Parameters"] = "{ \"param\": \"value\" }"
                    }
                }
            }
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Equal("existing-flat-value", result["Azure:SubscriptionId"]!.ToString());
        Assert.Equal("microsoft.onmicrosoft.com", result["Azure:Tenant"]!.ToString());
        Assert.Equal("/subscriptions/123/deployments/MyStorage", result["Azure:Deployments:MyStorage:Id"]!.ToString());
        Assert.Equal("{ \"param\": \"value\" }", result["Azure:Deployments:MyStorage:Parameters"]!.ToString());
        
        // Verify no nested structures remain
        Assert.False(result.ContainsKey("Azure"), "Should not have nested 'Azure' object");
    }
 
    [Fact]
    public void FlattenJsonObject_HandlesSimpleFlatStructure()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["Azure:SubscriptionId"] = "07268dd7-4c50-434b-b1ff-67b8164edb41",
            ["Azure:Tenant"] = "microsoft.onmicrosoft.com",
            ["Azure:Location"] = "eastus2"
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Equal(3, result.Count);
        Assert.Equal("07268dd7-4c50-434b-b1ff-67b8164edb41", result["Azure:SubscriptionId"]!.ToString());
        Assert.Equal("microsoft.onmicrosoft.com", result["Azure:Tenant"]!.ToString());
        Assert.Equal("eastus2", result["Azure:Location"]!.ToString());
    }
 
    [Fact]
    public void FlattenJsonObject_HandlesEmptyObject()
    {
        // Arrange
        var userSecrets = new JsonObject();
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Empty(result);
    }
 
    [Fact]
    public void FlattenJsonObject_HandlesDeeplyNestedStructures()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["Level1"] = new JsonObject
            {
                ["Level2"] = new JsonObject
                {
                    ["Level3"] = new JsonObject
                    {
                        ["DeepValue"] = "nested-value"
                    }
                }
            }
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Single(result);
        Assert.Equal("nested-value", result["Level1:Level2:Level3:DeepValue"]!.ToString());
    }
 
    [Fact]
    public void FlattenJsonObject_PreservesNullAndPrimitiveValues()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["StringValue"] = "text",
            ["NumberValue"] = 42,
            ["BoolValue"] = true,
            ["NullValue"] = null,
            ["Nested"] = new JsonObject
            {
                ["InnerString"] = "inner-text",
                ["InnerNull"] = null
            }
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Equal("text", result["StringValue"]!.ToString());
        Assert.Equal("42", result["NumberValue"]!.ToString());
        Assert.Equal("true", result["BoolValue"]!.ToString());
        Assert.Null(result["NullValue"]);
        Assert.Equal("inner-text", result["Nested:InnerString"]!.ToString());
        Assert.Null(result["Nested:InnerNull"]);
    }
 
    [Fact]
    public void FlattenJsonObject_HandlesArraysWithPrimitiveValues()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["SimpleArray"] = new JsonArray("value1", "value2", "value3"),
            ["NumberArray"] = new JsonArray(1, 2, 3),
            ["MixedArray"] = new JsonArray("text", 42, true, null)
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Equal("value1", result["SimpleArray:0"]!.ToString());
        Assert.Equal("value2", result["SimpleArray:1"]!.ToString());
        Assert.Equal("value3", result["SimpleArray:2"]!.ToString());
        
        Assert.Equal("1", result["NumberArray:0"]!.ToString());
        Assert.Equal("2", result["NumberArray:1"]!.ToString());
        Assert.Equal("3", result["NumberArray:2"]!.ToString());
        
        Assert.Equal("text", result["MixedArray:0"]!.ToString());
        Assert.Equal("42", result["MixedArray:1"]!.ToString());
        Assert.Equal("true", result["MixedArray:2"]!.ToString());
        Assert.Null(result["MixedArray:3"]);
    }
 
    [Fact]
    public void FlattenJsonObject_HandlesArraysWithObjects()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["ObjectArray"] = new JsonArray(
                new JsonObject { ["Name"] = "Item1", ["Value"] = "Value1" },
                new JsonObject { ["Name"] = "Item2", ["Value"] = "Value2" }
            ),
            ["NestedConfig"] = new JsonObject
            {
                ["Items"] = new JsonArray(
                    new JsonObject
                    {
                        ["Id"] = "1",
                        ["Settings"] = new JsonObject { ["Enabled"] = true }
                    }
                )
            }
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Equal("Item1", result["ObjectArray:0:Name"]!.ToString());
        Assert.Equal("Value1", result["ObjectArray:0:Value"]!.ToString());
        Assert.Equal("Item2", result["ObjectArray:1:Name"]!.ToString());
        Assert.Equal("Value2", result["ObjectArray:1:Value"]!.ToString());
        
        Assert.Equal("1", result["NestedConfig:Items:0:Id"]!.ToString());
        Assert.Equal("true", result["NestedConfig:Items:0:Settings:Enabled"]!.ToString());
    }
 
    [Fact]
    public void FlattenJsonObject_HandlesEmptyArrays()
    {
        // Arrange
        var userSecrets = new JsonObject
        {
            ["EmptyArray"] = new JsonArray(),
            ["OtherValue"] = "test"
        };
 
        // Act
        var result = DefaultUserSecretsManager.FlattenJsonObject(userSecrets);
 
        // Assert
        Assert.Single(result);
        Assert.Equal("test", result["OtherValue"]!.ToString());
        Assert.False(result.ContainsKey("EmptyArray"));
    }
}