File: HostedAgentExtensionTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Foundry.Tests\Aspire.Hosting.Foundry.Tests.csproj (Aspire.Hosting.Foundry.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 ASPIRECOMPUTE003 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
 
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Utils;
using Microsoft.Extensions.DependencyInjection;
 
namespace Aspire.Hosting.Foundry.Tests;
 
public class HostedAgentExtensionTests
{
    [Fact]
    public void PublishAsHostedAgent_InRunMode_AddsHttpEndpoint()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Run);
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var app = builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent(project);
 
        builder.Build();
 
        // In run mode, the resource should have an HTTP endpoint annotation
        Assert.True(app.Resource.TryGetEndpoints(out var endpoints));
        Assert.Contains(endpoints, e => e.Name == "http");
    }
 
    [Fact]
    public void PublishAsHostedAgent_InRunMode_ConfiguresHealthCheck()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Run);
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent(project);
 
        builder.Build();
 
        // The resource should have a health check annotation from WithHttpHealthCheck
        var resource = builder.Resources.Single(r => r.Name == "agent");
        var healthAnnotation = resource.Annotations.OfType<HealthCheckAnnotation>().FirstOrDefault();
        Assert.NotNull(healthAnnotation);
    }
 
    [Fact]
    public void PublishAsHostedAgent_InPublishMode_DoesNotValidateRegion()
    {
        using var builder = TestDistributedApplicationBuilder.Create(
            DistributedApplicationOperation.Publish);
 
        builder.Configuration["Azure:Location"] = "invalidregion";
 
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var app = builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent(project);
 
        Assert.NotNull(app);
    }
 
    [Fact]
    public void PublishAsHostedAgent_InPublishMode_AcceptsValidRegion()
    {
        using var builder = TestDistributedApplicationBuilder.Create(
            DistributedApplicationOperation.Publish);
 
        builder.Configuration["Azure:Location"] = "eastus";
 
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var app = builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent(project);
 
        Assert.NotNull(app);
    }
 
    [Fact]
    public void PublishAsHostedAgent_NoRegionConfig_DoesNotThrow()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var app = builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent(project);
 
        Assert.NotNull(app);
    }
 
    [Fact]
    public void PublishAsHostedAgent_InPublishMode_CreatesHostedAgentResource()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent(project);
 
        builder.Build();
 
        var hostedAgent = builder.Resources.OfType<AzureHostedAgentResource>().SingleOrDefault();
        Assert.NotNull(hostedAgent);
        Assert.Equal("agent-ha", hostedAgent.Name);
    }
 
    [Fact]
    public void PublishAsHostedAgent_WithoutProject_CreatesDefaultProject()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        builder.AddPythonApp("agent", "./app.py", "main:app")
            .PublishAsHostedAgent();
 
        builder.Build();
 
        // A project should be auto-created
        var project = builder.Resources.OfType<AzureCognitiveServicesProjectResource>().SingleOrDefault();
        Assert.NotNull(project);
    }
 
    [Fact]
    public async Task FoundryProject_DefaultRegistryDoesNotAddGlobalRegistryTargets()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        var registry = builder.AddAzureContainerRegistry("global");
        builder.AddFoundry("account")
            .AddProject("my-project");
        var container = builder.AddContainer("redis", "redis:latest");
 
        using var app = builder.Build();
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
 
        await builder.Eventing.PublishAsync(new BeforeStartEvent(app.Services, model));
 
        var registryTargets = container.Resource.Annotations.OfType<RegistryTargetAnnotation>().ToList();
        var registryTarget = Assert.Single(registryTargets);
        Assert.Same(registry.Resource, registryTarget.Registry);
    }
}