| File: CloudProviders\WithAwsProviderTests.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 WithAwsProviderTests { private const string ValidAccount = "123456789012"; private const string ValidRegion = "us-west-2"; private const string ValidArn = "arn:aws:iam::123456789012:role/radius-irsa"; [Fact] public void WithAwsProvider_AccessKey_HappyPath_PopulatesAnnotation() { var builder = DistributedApplication.CreateBuilder(); var keyId = builder.AddParameter("awsKeyId", "AKIAEXAMPLE", secret: true); var keySecret = builder.AddParameter("awsKeySecret", "AKIA-XYZ-secret", secret: true); var env = builder.AddRadiusEnvironment("radius"); var returned = env.WithAwsProvider(ValidAccount, ValidRegion, aws => aws.WithAccessKey(keyId, keySecret)); Assert.Same(env, returned); var ann = env.Resource.Annotations.OfType<RadiusCloudProvidersAnnotation>().Single(); Assert.NotNull(ann.Aws); Assert.Equal(ValidAccount, ann.Aws!.AccountId); Assert.Equal(ValidRegion, ann.Aws.Region); var ak = Assert.IsType<AwsRadiusCredential.AccessKey>(ann.Aws.Credential); Assert.Same(keyId, ak.AccessKeyId); Assert.Same(keySecret, ak.SecretAccessKey); } [Fact] public void WithAwsProvider_Irsa_HappyPath_PopulatesAnnotation() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); env.WithAwsProvider(ValidAccount, ValidRegion, aws => aws.WithIrsa(ValidArn)); var ann = env.Resource.Annotations.OfType<RadiusCloudProvidersAnnotation>().Single(); var irsa = Assert.IsType<AwsRadiusCredential.Irsa>(ann.Aws!.Credential); Assert.Equal(ValidArn, irsa.IamRoleArn); } [Fact] public void WithAwsProvider_InvalidAccountId_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAwsProvider( "12345", ValidRegion, aws => aws.WithIrsa(ValidArn))); Assert.Equal("accountId", ex.ParamName); } [Fact] public void WithAwsProvider_EmptyRegion_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAwsProvider( ValidAccount, "", aws => aws.WithIrsa(ValidArn))); Assert.Equal("region", ex.ParamName); } [Fact] public void WithAwsProvider_NullConfigure_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); Assert.Throws<ArgumentNullException>(() => env.WithAwsProvider( ValidAccount, ValidRegion, null!)); } [Fact] public void WithAwsProvider_CallbackWithoutCredential_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<InvalidOperationException>(() => env.WithAwsProvider( ValidAccount, ValidRegion, _ => { })); Assert.Contains("ASPIRERADIUS010", ex.Message); } [Fact] public void WithAccessKey_NullKeyId_Throws() { var builder = DistributedApplication.CreateBuilder(); var keySecret = builder.AddParameter("k", "v", secret: true); var env = builder.AddRadiusEnvironment("radius"); Assert.Throws<ArgumentNullException>(() => env.WithAwsProvider( ValidAccount, ValidRegion, aws => aws.WithAccessKey(null!, keySecret))); } [Fact] public void WithAccessKey_NullSecret_Throws() { var builder = DistributedApplication.CreateBuilder(); var keyId = builder.AddParameter("k", "v", secret: true); var env = builder.AddRadiusEnvironment("radius"); Assert.Throws<ArgumentNullException>(() => env.WithAwsProvider( ValidAccount, ValidRegion, aws => aws.WithAccessKey(keyId, null!))); } [Fact] public void WithIrsa_MalformedArn_Throws() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); var ex = Assert.Throws<ArgumentException>(() => env.WithAwsProvider( ValidAccount, ValidRegion, aws => aws.WithIrsa("not-an-arn"))); Assert.Equal("iamRoleArn", ex.ParamName); } [Fact] public void WithIrsa_ArnWithRolePath_Accepted() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); const string ArnWithPath = "arn:aws:iam::123456789012:role/division/team/RDSAccess"; env.WithAwsProvider(ValidAccount, ValidRegion, aws => aws.WithIrsa(ArnWithPath)); var ann = env.Resource.Annotations.OfType<RadiusCloudProvidersAnnotation>().Single(); var irsa = Assert.IsType<AwsRadiusCredential.Irsa>(ann.Aws!.Credential); Assert.Equal(ArnWithPath, irsa.IamRoleArn); } [Fact] public void WithAwsProvider_UnknownRegionAccepted() { var builder = DistributedApplication.CreateBuilder(); var env = builder.AddRadiusEnvironment("radius"); env.WithAwsProvider(ValidAccount, "mars-central-1", aws => aws.WithIrsa(ValidArn)); var ann = env.Resource.Annotations.OfType<RadiusCloudProvidersAnnotation>().Single(); Assert.Equal("mars-central-1", ann.Aws!.Region); } }