File: DevTunnelCliVersionValidationTests.cs
Web Access
Project: src\tests\Aspire.Hosting.DevTunnels.Tests\Aspire.Hosting.DevTunnels.Tests.csproj (Aspire.Hosting.DevTunnels.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#pragma warning disable ASPIRECOMMAND001
 
using Aspire.Hosting.ApplicationModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
 
namespace Aspire.Hosting.DevTunnels.Tests;
 
public class DevTunnelCliVersionValidationTests
{
    [Theory]
    [InlineData("1.0.1435", true)]
    [InlineData("1.0.1436", true)]
    [InlineData("1.1.1234", true)]
    [InlineData("2.0.0", true)]
    [InlineData("10.0.0", true)]
    [InlineData("1.10.0", true)]
    [InlineData("1.0.1434", false)]
    [InlineData("1.0.0", false)]
    [InlineData("0.0.1", false)]
    [InlineData("1.1.999", true)]
    public async Task ValidateDevTunnelCliVersionAsync_ReturnsInvalidForUnsupportedVersion(string testVersion, bool expectedIsValid)
    {
        var testCliVersion = Version.Parse(testVersion);
        var devTunnelClient = new TestDevTunnelClient(testCliVersion);
 
        var services = new ServiceCollection()
            .AddSingleton<IDevTunnelClient>(devTunnelClient)
            .BuildServiceProvider();
 
        var context = new RequiredCommandValidationContext("thepath", services, CancellationToken.None);
        var result = await DevTunnelsResourceBuilderExtensions.ValidateDevTunnelCliVersionAsync(context);
 
        Assert.Equal(expectedIsValid, result.IsValid);
        if (expectedIsValid)
        {
            Assert.Null(result.ValidationMessage);
        }
        else
        {
            Assert.Contains(DevTunnelCli.MinimumSupportedVersion.ToString(), result.ValidationMessage);
            Assert.Contains(testVersion, result.ValidationMessage);
        }
    }
 
    private sealed class TestDevTunnelClient(Version cliVersion) : IDevTunnelClient
    {
        public Task<Version> GetVersionAsync(ILogger? logger = null, CancellationToken cancellationToken = default) => Task.FromResult(cliVersion);
 
        public Task<DevTunnelPortStatus> CreatePortAsync(string tunnelId, int portNumber, DevTunnelPortOptions options, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<DevTunnelStatus> CreateTunnelAsync(string tunnelId, DevTunnelOptions options, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<DevTunnelAccessStatus> GetAccessAsync(string tunnelId, int? portNumber = null, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<DevTunnelStatus> GetTunnelAsync(string tunnelId, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<UserLoginStatus> GetUserLoginStatusAsync(ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<UserLoginStatus> UserLoginAsync(LoginProvider provider, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<DevTunnelPortList> GetPortListAsync(string tunnelId, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
 
        public Task<DevTunnelPortDeleteResult> DeletePortAsync(string tunnelId, int portNumber, ILogger? logger = null, CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    }
}