File: DotnetToolFunctionalTests.cs.cs
Web Access
Project: src\tests\Aspire.Hosting.DotnetTool.Tests\Aspire.Hosting.DotnetTool.Tests.csproj (Aspire.Hosting.DotnetTool.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.ApplicationModel;
using Aspire.Hosting.Utils;
 
namespace Aspire.Hosting.DotnetTool.Tests;
 
public class DotnetToolFunctionalTests(ITestOutputHelper testOutputHelper)
{
    [Fact]
    public async Task VerifyDotnetToolResource()
    {
        var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2));
        using var builder = TestDistributedApplicationBuilder.Create().WithTestAndResourceLogging(testOutputHelper);
        var resource = builder
            .AddDotnetTool("tool", "dotnet-ef")
            .WithArgs("--help");
 
        using var app = builder.Build();
        await app.StartAsync(cts.Token);
 
        await app.ResourceNotifications.WaitForResourceAsync(resource.Resource.Name, KnownResourceStates.Running, cts.Token);
        var terminalState = await app.ResourceNotifications.WaitForResourceAsync(resource.Resource.Name, KnownResourceStates.TerminalStates, cts.Token);
 
        Assert.Equal(KnownResourceStates.Finished, terminalState);
 
        Assert.True(app.ResourceNotifications.TryGetCurrentState(resource.Resource.Name, out var resourceState));
        Assert.Equal(resourceState.Snapshot.ExitCode, 0);
    }
 
    [Fact]
    public async Task VerifyNonExistentDotnetToolResource()
    {
        var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2));
        using var builder = TestDistributedApplicationBuilder.Create().WithTestAndResourceLogging(testOutputHelper);
        var resource = builder
            .AddDotnetTool("tool", "dotnet-ef")
            .WithArgs("--help")
            .WithToolSource("./fake-package-feed")
            .WithToolIgnoreExistingFeeds();
 
        using var app = builder.Build();
        await app.StartAsync(cts.Token);
 
        await app.ResourceNotifications.WaitForResourceAsync(resource.Resource.Name, KnownResourceStates.Running, cts.Token);
        var terminalState = await app.ResourceNotifications.WaitForResourceAsync(resource.Resource.Name, KnownResourceStates.TerminalStates, cts.Token);
        Assert.Equal(KnownResourceStates.Finished, terminalState);
 
        Assert.True(app.ResourceNotifications.TryGetCurrentState(resource.Resource.Name, out var resourceState));
        Assert.NotEqual(resourceState.Snapshot.ExitCode, 0);
    }
 
}