File: Hosting\WebAssemblyHostConfigurationTest.cs
Web Access
Project: src\src\Components\WebAssembly\WebAssembly\test\Microsoft.AspNetCore.Components.WebAssembly.Tests.csproj (Microsoft.AspNetCore.Components.WebAssembly.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Memory;
 
namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting;
 
public class WebAssemblyHostConfigurationTest
{
    [Fact]
    public void CanSetAndGetConfigurationValue()
    {
        // Arrange
        var initialData = new Dictionary<string, string>() {
                { "color", "blue" },
                { "type", "car" },
                { "wheels:year", "2008" },
                { "wheels:count", "4" },
                { "wheels:brand", "michelin" },
                { "wheels:brand:type", "rally" },
            };
        var memoryConfig = new MemoryConfigurationSource { InitialData = initialData };
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(memoryConfig);
        configuration["type"] = "car";
        configuration["wheels:count"] = "6";
 
        // Assert
        Assert.Equal("car", configuration["type"]);
        Assert.Equal("blue", configuration["color"]);
        Assert.Equal("6", configuration["wheels:count"]);
    }
 
    [Fact]
    public void SettingValueUpdatesAllProviders()
    {
        // Arrange
        var initialData = new Dictionary<string, string>() { { "color", "blue" } };
        var source1 = new MemoryConfigurationSource { InitialData = initialData };
        var source2 = new CustomizedTestConfigurationSource();
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(source1);
        configuration.Add(source2);
        configuration["type"] = "car";
 
        // Assert
        Assert.Equal("car", configuration["type"]);
        IConfigurationRoot root = configuration;
        Assert.All(root.Providers, provider =>
        {
            provider.TryGet("type", out var value);
            Assert.Equal("car", value);
        });
    }
 
    [Fact]
    public void CanGetChildren()
    {
        // Arrange
        var initialData = new Dictionary<string, string>() { { "color", "blue" } };
        var memoryConfig = new MemoryConfigurationSource { InitialData = initialData };
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(memoryConfig);
        IConfiguration readableConfig = configuration;
        var children = readableConfig.GetChildren();
 
        // Assert
        Assert.NotNull(children);
        Assert.NotEmpty(children);
    }
 
    [Fact]
    public void CanGetSection()
    {
        // Arrange
        var initialData = new Dictionary<string, string>() {
                { "color", "blue" },
                { "type", "car" },
                { "wheels:year", "2008" },
                { "wheels:count", "4" },
                { "wheels:brand", "michelin" },
                { "wheels:brand:type", "rally" },
            };
        var memoryConfig = new MemoryConfigurationSource { InitialData = initialData };
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(memoryConfig);
        var section = configuration.GetSection("wheels").AsEnumerable(makePathsRelative: true).ToDictionary(k => k.Key, v => v.Value);
 
        // Assert
        Assert.Equal(4, section.Count);
        Assert.Equal("2008", section["year"]);
        Assert.Equal("4", section["count"]);
        Assert.Equal("michelin", section["brand"]);
        Assert.Equal("rally", section["brand:type"]);
    }
 
    [Fact]
    public void CanDisposeProviders()
    {
        // Arrange
        var initialData = new Dictionary<string, string>() { { "color", "blue" } };
        var memoryConfig = new MemoryConfigurationSource { InitialData = initialData };
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(memoryConfig);
        Assert.Equal("blue", configuration["color"]);
        var exception = Record.Exception(() => configuration.Dispose());
 
        // Assert
        Assert.Null(exception);
    }
 
    [Fact]
    public void CanSupportDeeplyNestedConfigs()
    {
        // Arrange
        var dic1 = new Dictionary<string, string>()
            {
                {"Mem1", "Value1"},
                {"Mem1:", "NoKeyValue1"},
                {"Mem1:KeyInMem1", "ValueInMem1"},
                {"Mem1:KeyInMem1:Deep1", "ValueDeep1"}
            };
        var dic2 = new Dictionary<string, string>()
            {
                {"Mem2", "Value2"},
                {"Mem2:", "NoKeyValue2"},
                {"Mem2:KeyInMem2", "ValueInMem2"},
                {"Mem2:KeyInMem2:Deep2", "ValueDeep2"}
            };
        var dic3 = new Dictionary<string, string>()
            {
                {"Mem3", "Value3"},
                {"Mem3:", "NoKeyValue3"},
                {"Mem3:KeyInMem3", "ValueInMem3"},
                {"Mem3:KeyInMem4", "ValueInMem4"},
                {"Mem3:KeyInMem3:Deep3", "ValueDeep3"},
                {"Mem3:KeyInMem3:Deep4", "ValueDeep4"}
            };
        var memConfigSrc1 = new MemoryConfigurationSource { InitialData = dic1 };
        var memConfigSrc2 = new MemoryConfigurationSource { InitialData = dic2 };
        var memConfigSrc3 = new MemoryConfigurationSource { InitialData = dic3 };
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(memConfigSrc1);
        configuration.Add(memConfigSrc2);
        configuration.Add(memConfigSrc3);
 
        // Assert
        var dict = configuration.GetSection("Mem1").AsEnumerable(makePathsRelative: true).ToDictionary(k => k.Key, v => v.Value);
        Assert.Equal(3, dict.Count);
        Assert.Equal("NoKeyValue1", dict[""]);
        Assert.Equal("ValueInMem1", dict["KeyInMem1"]);
        Assert.Equal("ValueDeep1", dict["KeyInMem1:Deep1"]);
 
        var dict2 = configuration.GetSection("Mem2").AsEnumerable(makePathsRelative: true).ToDictionary(k => k.Key, v => v.Value);
        Assert.Equal(3, dict2.Count);
        Assert.Equal("NoKeyValue2", dict2[""]);
        Assert.Equal("ValueInMem2", dict2["KeyInMem2"]);
        Assert.Equal("ValueDeep2", dict2["KeyInMem2:Deep2"]);
 
        var dict3 = configuration.GetSection("Mem3").AsEnumerable(makePathsRelative: true).ToDictionary(k => k.Key, v => v.Value);
        Assert.Equal(5, dict3.Count);
        Assert.Equal("NoKeyValue3", dict3[""]);
        Assert.Equal("ValueInMem3", dict3["KeyInMem3"]);
        Assert.Equal("ValueInMem4", dict3["KeyInMem4"]);
        Assert.Equal("ValueDeep3", dict3["KeyInMem3:Deep3"]);
        Assert.Equal("ValueDeep4", dict3["KeyInMem3:Deep4"]);
    }
 
    [Fact]
    public void NewConfigurationProviderOverridesOldOneWhenKeyIsDuplicated()
    {
        // Arrange
        var dic1 = new Dictionary<string, string>()
                {
                    {"Key1:Key2", "ValueInMem1"}
                };
        var dic2 = new Dictionary<string, string>()
                {
                    {"Key1:Key2", "ValueInMem2"}
                };
        var memConfigSrc1 = new MemoryConfigurationSource { InitialData = dic1 };
        var memConfigSrc2 = new MemoryConfigurationSource { InitialData = dic2 };
 
        var configuration = new WebAssemblyHostConfiguration();
 
        // Act
        configuration.Add(memConfigSrc1);
        configuration.Add(memConfigSrc2);
 
        // Assert
        Assert.Equal("ValueInMem2", configuration["Key1:Key2"]);
    }
 
    private class CustomizedTestConfigurationProvider : ConfigurationProvider
    {
        public CustomizedTestConfigurationProvider(string key, string value)
            => Data.Add(key, value.ToUpperInvariant());
 
        public override void Set(string key, string value)
        {
            Data[key] = value;
        }
    }
 
    private class CustomizedTestConfigurationSource : IConfigurationSource
    {
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new CustomizedTestConfigurationProvider("initialKey", "initialValue");
        }
    }
}