File: Utils\VolumeNameGeneratorTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Tests\Aspire.Hosting.Tests.csproj (Aspire.Hosting.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using static Aspire.Hosting.Utils.VolumeNameGenerator;
using Xunit;
 
namespace Aspire.Hosting.Tests.Utils;
 
public class VolumeNameGeneratorTests
{
    [Theory]
    [InlineData("ACustomButValidAppName")]
    [InlineData("0123ThisIsValidToo")]
    [InlineData("This_Is_Valid_Too")]
    [InlineData("This.Is.Valid.Too")]
    [InlineData("This-Is-Valid-Too")]
    [InlineData("This_Is.Valid-Too")]
    [InlineData("This_0Is.1Valid-2Too")]
    [InlineData("This_---.....---___Is_Valid_Too")]
    public void UsesApplicationNameAsPrefixIfCharsAreValid(string applicationName)
    {
        var builder = DistributedApplication.CreateBuilder();
        builder.Environment.ApplicationName = applicationName;
        var resource = builder.AddResource(new TestResource("myresource"));
 
        var volumeName = CreateVolumeName(resource, "data");
 
        Assert.Equal($"{builder.Environment.ApplicationName}-{resource.Resource.Name}-data", volumeName);
    }
 
    [Theory]
    [MemberData(nameof(InvalidNameParts))]
    public void UsesVolumeAsPrefixIfApplicationNameCharsAreInvalid(string applicationName)
    {
        var builder = DistributedApplication.CreateBuilder();
        builder.Environment.ApplicationName = applicationName;
        var resource = builder.AddResource(new TestResource("myresource"));
 
        var volumeName = CreateVolumeName(resource, "data");
 
        Assert.Equal($"volume-{resource.Resource.Name}-data", volumeName);
    }
 
    [Theory]
    [MemberData(nameof(InvalidNameParts))]
    public void ThrowsWhenSuffixContainsInvalidChars(string suffix)
    {
        var builder = DistributedApplication.CreateBuilder();
        var resource = builder.AddResource(new TestResource("myresource"));
 
        Assert.Throws<ArgumentException>(nameof(suffix), () => CreateVolumeName(resource, suffix));
    }
 
    public static object[][] InvalidNameParts => [
        ["This/is/invalid"],
        [@"This\is\invalid"],
        ["_ThisIsInvalidToo"],
        [".ThisIsInvalidToo"],
        ["-ThisIsInvalidToo"],
        ["This&IsInvalidToo"]
    ];
 
    private sealed class TestResource(string name) : IResource
    {
        public string Name { get; } = name;
 
        public ResourceAnnotationCollection Annotations { get; } = [];
    }
}