| File: CloudProviders\WithAzureProviderTests.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.Radius.Annotations; using Aspire.Hosting.Radius.CloudProviders; namespace Aspire.Hosting.Radius.Tests.CloudProviders; public class WithAzureProviderTests { private const string ValidSubscriptionId = "11111111-1111-1111-1111-111111111111"; private const string ValidResourceGroup = "rg-test"; private const string ValidTenantId = "22222222-2222-2222-2222-222222222222"; private const string ValidClientId = "33333333-3333-3333-3333-333333333333"; [Fact] public void WithAzureProvider_HappyPath_ReturnsSameBuilder_AndPopulatesAnnotation() { var builder = DistributedApplication.CreateBuilder(); var secret = builder.AddParameter("azureClientSecret", "secret-XYZ", secret: true); var env = builder.AddRadiusEnvironment("radius"); var returned = env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, azure => azure.WithServicePrincipal(ValidTenantId, ValidClientId, secret)); Assert.Same(env, returned); var annotation = env.Resource.Annotations.OfType<RadiusCloudProvidersAnnotation>().Single(); Assert.NotNull(annotation.Azure); Assert.Equal(ValidSubscriptionId, annotation.Azure!.SubscriptionId); Assert.Equal(ValidResourceGroup, annotation.Azure.ResourceGroup); var sp = Assert.IsType<AzureRadiusCredential.ServicePrincipal>(annotation.Azure.Credential); Assert.Equal(ValidTenantId, sp.TenantId); Assert.Equal(ValidClientId, sp.ClientId); Assert.Same(secret, sp.ClientSecret); } [Fact] public void WithAzureProvider_NonGuidSubscription_Throws() { var builder = DistributedApplication.CreateBuilder(); var secret = builder.AddParameter("s", "v", secret: true); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAzureProvider( "not-a-guid", ValidResourceGroup, azure => azure.WithServicePrincipal(ValidTenantId, ValidClientId, secret))); Assert.Equal("subscriptionId", ex.ParamName); } [Fact] public void WithAzureProvider_EmptyResourceGroup_Throws() { var builder = DistributedApplication.CreateBuilder(); var secret = builder.AddParameter("s", "v", secret: true); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAzureProvider( ValidSubscriptionId, "", azure => azure.WithServicePrincipal(ValidTenantId, ValidClientId, secret))); Assert.Equal("resourceGroup", ex.ParamName); } [Fact] public void WithAzureProvider_NullConfigure_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); Assert.Throws<ArgumentNullException>(() => env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, null!)); } [Fact] public void WithAzureProvider_CallbackReturnsWithoutCredential_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<InvalidOperationException>(() => env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, _ => { })); Assert.Contains("ASPIRERADIUS010", ex.Message); } [Fact] public void WithServicePrincipal_NonGuidTenantId_Throws() { var builder = DistributedApplication.CreateBuilder(); var secret = builder.AddParameter("s", "v", secret: true); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, azure => azure.WithServicePrincipal("bad", ValidClientId, secret))); Assert.Equal("tenantId", ex.ParamName); } [Fact] public void WithServicePrincipal_EmptyClientId_Throws() { var builder = DistributedApplication.CreateBuilder(); var secret = builder.AddParameter("s", "v", secret: true); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, azure => azure.WithServicePrincipal(ValidTenantId, "", secret))); Assert.Equal("clientId", ex.ParamName); } [Fact] public void WithWorkloadIdentity_HappyPath_PopulatesAnnotation() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); env.WithAzureProvider(ValidSubscriptionId, ValidResourceGroup, azure => azure.WithWorkloadIdentity(ValidTenantId, ValidClientId)); var ann = env.Resource.Annotations.OfType<RadiusCloudProvidersAnnotation>().Single(); var wi = Assert.IsType<AzureRadiusCredential.WorkloadIdentity>(ann.Azure!.Credential); Assert.Equal(ValidClientId, wi.ClientId); Assert.Equal(ValidTenantId, wi.TenantId); } [Fact] public void WithWorkloadIdentity_NonGuidTenantId_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, azure => azure.WithWorkloadIdentity("bad", ValidClientId))); Assert.Equal("tenantId", ex.ParamName); } [Fact] public void WithWorkloadIdentity_EmptyClientId_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAzureProvider( ValidSubscriptionId, ValidResourceGroup, azure => azure.WithWorkloadIdentity(ValidTenantId, ""))); Assert.Equal("clientId", ex.ParamName); } }