|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Globalization;
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Tests.Utils;
using Aspire.Hosting.Utils;
using Xunit;
namespace Aspire.Hosting.Azure.Tests;
public class AzureResourceExtensionsTests
{
[Theory]
[InlineData(null)]
[InlineData(true)]
[InlineData(false)]
public void AzureStorageUseEmulatorCallbackWithWithDataBindMountResultsInBindMountAnnotationWithDefaultPath(bool? isReadOnly)
{
using var builder = TestDistributedApplicationBuilder.Create();
var storage = builder.AddAzureStorage("storage").RunAsEmulator(configureContainer: builder =>
{
if (isReadOnly.HasValue)
{
builder.WithDataBindMount(isReadOnly: isReadOnly.Value);
}
else
{
builder.WithDataBindMount();
}
});
var volumeAnnotation = storage.Resource.Annotations.OfType<ContainerMountAnnotation>().Single();
Assert.Equal(Path.Combine(builder.AppHostDirectory, ".azurite", "storage"), volumeAnnotation.Source);
Assert.Equal("/data", volumeAnnotation.Target);
Assert.Equal(ContainerMountType.BindMount, volumeAnnotation.Type);
Assert.Equal(isReadOnly ?? false, volumeAnnotation.IsReadOnly);
}
[Theory]
[InlineData(null)]
[InlineData(true)]
[InlineData(false)]
public void AzureStorageUseEmulatorCallbackWithWithDataBindMountResultsInBindMountAnnotation(bool? isReadOnly)
{
using var builder = TestDistributedApplicationBuilder.Create();
var storage = builder.AddAzureStorage("storage").RunAsEmulator(configureContainer: builder =>
{
if (isReadOnly.HasValue)
{
builder.WithDataBindMount("mydata", isReadOnly: isReadOnly.Value);
}
else
{
builder.WithDataBindMount("mydata");
}
});
var volumeAnnotation = storage.Resource.Annotations.OfType<ContainerMountAnnotation>().Single();
Assert.Equal(Path.Combine(builder.AppHostDirectory, "mydata"), volumeAnnotation.Source);
Assert.Equal("/data", volumeAnnotation.Target);
Assert.Equal(ContainerMountType.BindMount, volumeAnnotation.Type);
Assert.Equal(isReadOnly ?? false, volumeAnnotation.IsReadOnly);
}
[Theory]
[InlineData(null)]
[InlineData(true)]
[InlineData(false)]
public void AzureStorageUseEmulatorCallbackWithWithDataVolumeResultsInVolumeAnnotationWithDefaultName(bool? isReadOnly)
{
using var builder = TestDistributedApplicationBuilder.Create();
var storage = builder.AddAzureStorage("storage").RunAsEmulator(configureContainer: builder =>
{
if (isReadOnly.HasValue)
{
builder.WithDataVolume(isReadOnly: isReadOnly.Value);
}
else
{
builder.WithDataVolume();
}
});
var volumeAnnotation = storage.Resource.Annotations.OfType<ContainerMountAnnotation>().Single();
Assert.Equal($"{builder.GetVolumePrefix()}-storage-data", volumeAnnotation.Source);
Assert.Equal("/data", volumeAnnotation.Target);
Assert.Equal(ContainerMountType.Volume, volumeAnnotation.Type);
Assert.Equal(isReadOnly ?? false, volumeAnnotation.IsReadOnly);
}
[Theory]
[InlineData(null)]
[InlineData(true)]
[InlineData(false)]
public void AzureStorageUseEmulatorCallbackWithWithDataVolumeResultsInVolumeAnnotation(bool? isReadOnly)
{
using var builder = TestDistributedApplicationBuilder.Create();
var storage = builder.AddAzureStorage("storage").RunAsEmulator(configureContainer: builder =>
{
if (isReadOnly.HasValue)
{
builder.WithDataVolume("mydata", isReadOnly: isReadOnly.Value);
}
else
{
builder.WithDataVolume("mydata");
}
});
var volumeAnnotation = storage.Resource.Annotations.OfType<ContainerMountAnnotation>().Single();
Assert.Equal("mydata", volumeAnnotation.Source);
Assert.Equal("/data", volumeAnnotation.Target);
Assert.Equal(ContainerMountType.Volume, volumeAnnotation.Type);
Assert.Equal(isReadOnly ?? false, volumeAnnotation.IsReadOnly);
}
[Fact]
public void AzureStorageUserEmulatorUseBlobQueueTablePortMethodsMutateEndpoints()
{
using var builder = TestDistributedApplicationBuilder.Create();
var storage = builder.AddAzureStorage("storage").RunAsEmulator(configureContainer: builder =>
{
builder.WithBlobPort(9001);
builder.WithQueuePort(9002);
builder.WithTablePort(9003);
});
Assert.Collection(
storage.Resource.Annotations.OfType<EndpointAnnotation>(),
e => Assert.Equal(9001, e.Port),
e => Assert.Equal(9002, e.Port),
e => Assert.Equal(9003, e.Port));
}
[Theory]
[InlineData(null)]
[InlineData(8081)]
[InlineData(9007)]
public void AddAzureCosmosDBWithEmulatorGetsExpectedPort(int? port = null)
{
using var builder = TestDistributedApplicationBuilder.Create();
var cosmos = builder.AddAzureCosmosDB("cosmos");
cosmos.RunAsEmulator(container =>
{
container.WithGatewayPort(port);
});
var endpointAnnotation = cosmos.Resource.Annotations.OfType<EndpointAnnotation>().FirstOrDefault();
Assert.NotNull(endpointAnnotation);
var actualPort = endpointAnnotation.Port;
Assert.Equal(port, actualPort);
}
[Theory]
[InlineData("2.3.97-preview")]
[InlineData("1.0.7")]
public void AddAzureCosmosDBWithEmulatorGetsExpectedImageTag(string imageTag)
{
using var builder = TestDistributedApplicationBuilder.Create();
var cosmos = builder.AddAzureCosmosDB("cosmos");
cosmos.RunAsEmulator(container =>
{
container.WithImageTag(imageTag);
});
var containerImageAnnotation = cosmos.Resource.Annotations.OfType<ContainerImageAnnotation>().FirstOrDefault();
Assert.NotNull(containerImageAnnotation);
var actualTag = containerImageAnnotation.Tag;
Assert.Equal(imageTag ?? "latest", actualTag);
}
[Theory]
[InlineData(30)]
[InlineData(12)]
public async Task AddAzureCosmosDBWithPartitionCountCanOverrideNumberOfPartitions(int partitionCount)
{
using var builder = TestDistributedApplicationBuilder.Create();
var cosmos = builder.AddAzureCosmosDB("cosmos");
cosmos.RunAsEmulator(r => r.WithPartitionCount(partitionCount));
var config = await EnvironmentVariableEvaluator.GetEnvironmentVariablesAsync(cosmos.Resource, DistributedApplicationOperation.Run, TestServiceProvider.Instance);
Assert.Equal(partitionCount.ToString(CultureInfo.InvariantCulture), config["AZURE_COSMOS_EMULATOR_PARTITION_COUNT"]);
}
}
|