File: AspireAppConfigurationExtensionsTest.cs
Web Access
Project: src\tests\Aspire.Microsoft.Extensions.Configuration.AzureAppConfiguration.Tests\Aspire.Microsoft.Extensions.Configuration.AzureAppConfiguration.Tests.csproj (Aspire.Microsoft.Extensions.Configuration.AzureAppConfiguration.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.Azure;
using Azure.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System.Text;
using Xunit;
 
namespace Aspire.Microsoft.Extensions.Configuration.AzureAppConfiguration.Tests;
 
public class AspireAppConfigurationExtensionsTest
{
    [Fact]
    public void AppConfigEndpointCanBeSetInCode()
    {
        var endpoint = new Uri(ConformanceTests.Endpoint);
        var mockTransport = new MockTransport(CreateResponse("""{}"""));
 
        var builder = Host.CreateEmptyApplicationBuilder(null);
        builder.Configuration.AddInMemoryCollection([
            new KeyValuePair<string, string?>("ConnectionStrings:appConfig", "https://unused.azconfig.io/")
        ]);
 
        builder.AddAzureAppConfiguration(
            "appConfig",
            settings => {
                settings.Endpoint = endpoint;
                settings.Credential = new EmptyTokenCredential();
            },
            options => options.ConfigureClientOptions(clientOptions => clientOptions.Transport = mockTransport));
 
        Assert.NotEmpty(mockTransport.Requests);
        var request = mockTransport.Requests[0];
        Assert.StartsWith(endpoint.ToString(), request.Uri.ToString());
    }
 
    [Fact]
    public void ConnectionNameWinsOverConfiguration()
    {
        var mockTransport = new MockTransport(CreateResponse("""{}"""));
        var builder = Host.CreateEmptyApplicationBuilder(null);
        builder.Configuration.AddInMemoryCollection([
            new KeyValuePair<string, string?>(ConformanceTests.CreateConfigKey("Aspire:Microsoft:Extensions:Configuration:AzureAppConfiguration", null, "Endpoint"), "https://unused.azconfig.io/"),
            new KeyValuePair<string, string?>("ConnectionStrings:appConfig", ConformanceTests.Endpoint)
        ]);
 
        builder.AddAzureAppConfiguration(
            "appConfig",
            settings =>
            {
                settings.Credential = new EmptyTokenCredential();
            },
            options => options.ConfigureClientOptions(clientOptions => clientOptions.Transport = mockTransport));
 
        Assert.NotEmpty(mockTransport.Requests);
        var request = mockTransport.Requests[0];
        Assert.StartsWith(ConformanceTests.Endpoint, request.Uri.ToString());
    }
 
    [Fact]
    public void ConnectionStringWinsOverEndpoint()
    {
        var mockTransport = new MockTransport(CreateResponse("""{}"""));
        var builder = Host.CreateEmptyApplicationBuilder(null);
 
        builder.AddAzureAppConfiguration(
            "appConfig",
            settings =>
            {
                settings.ConnectionString = $"Endpoint={ConformanceTests.Endpoint};Id=xxxx;Secret=xxxx";
                settings.Endpoint = new Uri("https://unused.azconfig.io/");
                settings.Credential = new EmptyTokenCredential();
            },
            options => options.ConfigureClientOptions(clientOptions => clientOptions.Transport = mockTransport));
 
        Assert.NotEmpty(mockTransport.Requests);
        var request = mockTransport.Requests[0];
        Assert.StartsWith(ConformanceTests.Endpoint, request.Uri.ToString());
    }
 
    [Fact]
    public void AddsAppConfigurationToApplication()
    {
        var endpoint = new Uri("https://aspiretests.azconfig.io/");
        var mockTransport = new MockTransport(CreateResponse("""
            {
                "items": [
                    {
                        "key": "test-key-1",
                        "value": "test-value-1"
                    },
                    {
                        "key": "test-key-2",
                        "value": "test-value-2"
                    }
                ]
            }
            """));
 
        var builder = Host.CreateEmptyApplicationBuilder(null);
        builder.AddAzureAppConfiguration(
            "appConfig",
            settings =>
            {
                settings.Endpoint = endpoint;
                settings.Credential = new EmptyTokenCredential();
            },
            options => options.ConfigureClientOptions(clientOptions => clientOptions.Transport = mockTransport));
 
        Assert.Equal("test-value-1", builder.Configuration["test-key-1"]);
        Assert.Equal("test-value-2", builder.Configuration["test-key-2"]);
    }
 
    private static MockResponse CreateResponse(string content)
    {
        var buffer = Encoding.UTF8.GetBytes(content);
        var response = new MockResponse(200)
        {
            ClientRequestId = Guid.NewGuid().ToString(),
            ContentStream = new MemoryStream(buffer),
        };
 
        return response;
    }
 
    internal sealed class EmptyTokenCredential : TokenCredential
    {
        public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken)
        {
            return new AccessToken(string.Empty, DateTimeOffset.MaxValue);
        }
 
        public override ValueTask<AccessToken> GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken)
        {
            return new ValueTask<AccessToken>(new AccessToken(string.Empty, DateTimeOffset.MaxValue));
        }
    }
}