File: AzureProvisioningResourceTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Azure.Tests\Aspire.Hosting.Azure.Tests.csproj (Aspire.Hosting.Azure.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Runtime.CompilerServices;
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Azure.AppContainers;
using Aspire.Hosting.Utils;
using Microsoft.Extensions.DependencyInjection;
 
namespace Aspire.Hosting.Azure.Tests;
 
public class AzureProvisioningResourceTests
{
    [Fact]
    public async Task PublishAsAzureContainerApp_CreatesAzureContainerAppResource()
    {
        var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        builder.AddAzureContainerAppEnvironment("env");
 
        var apiProject = builder.AddProject<Project>("api", launchProfileName: null);
        apiProject.PublishAsAzureContainerApp((infrastructure, containerApp) =>
        {
            // This callback should have access to the original resource
            // via the AzureContainerAppResource.TargetResource property
            Assert.IsType<AzureContainerAppResource>(infrastructure.AspireResource);
            var containerAppResource = (AzureContainerAppResource)infrastructure.AspireResource;
 
            Assert.Same(apiProject.Resource, containerAppResource.TargetResource);
        });
 
        using var app = builder.Build();
 
        await ExecuteBeforeStartHooksAsync(app, default);
 
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var project = Assert.Single(model.GetProjectResources());
 
        // Verify the deployment target was created
        project.TryGetLastAnnotation<DeploymentTargetAnnotation>(out var target);
        var provisioningResource = target?.DeploymentTarget as AzureContainerAppResource;
        Assert.NotNull(provisioningResource);
 
        // Verify the target resource is accessible
        Assert.Same(apiProject.Resource, provisioningResource.TargetResource);
    }
 
    [Fact]
    public async Task PublishAsAzureAppServiceWebsite_CreatesAzureWebSiteResource()
    {
        var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        builder.AddAzureAppServiceEnvironment("env");
 
        var apiProject = builder.AddProject<Project>("api", launchProfileName: null);
        apiProject.PublishAsAzureAppServiceWebsite((infrastructure, website) =>
        {
            // This callback should have access to the original resource
            // via the AzureAppServiceWebSiteResource.TargetResource property
            Assert.IsType<AzureAppServiceWebSiteResource>(infrastructure.AspireResource);
            var webSiteResource = (AzureAppServiceWebSiteResource)infrastructure.AspireResource;
 
            Assert.Same(apiProject.Resource, webSiteResource.TargetResource);
        });
 
        using var app = builder.Build();
 
        await ExecuteBeforeStartHooksAsync(app, default);
 
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var project = Assert.Single(model.GetProjectResources());
 
        // Verify the deployment target was created
        project.TryGetLastAnnotation<DeploymentTargetAnnotation>(out var target);
        var provisioningResource = target?.DeploymentTarget as AzureAppServiceWebSiteResource;
        Assert.NotNull(provisioningResource);
 
        // Verify the target resource is accessible
        Assert.Same(apiProject.Resource, provisioningResource.TargetResource);
    }
 
    [Fact]
    public async Task ContainerResource_WithPublishAsContainerApp_CreatesAzureContainerAppResource()
    {
        var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        builder.AddAzureContainerAppEnvironment("env");
 
        var container = builder.AddContainer("api", "myimage");
        container.PublishAsAzureContainerApp((infrastructure, containerApp) =>
        {
            // Verify we can access the original container resource
            Assert.IsType<AzureContainerAppResource>(infrastructure.AspireResource);
            var containerAppResource = (AzureContainerAppResource)infrastructure.AspireResource;
 
            Assert.Same(container.Resource, containerAppResource.TargetResource);
        });
 
        using var app = builder.Build();
 
        await ExecuteBeforeStartHooksAsync(app, default);
 
        var model = app.Services.GetRequiredService<DistributedApplicationModel>();
        var containerResource = Assert.Single(model.GetContainerResources());
 
        // Verify the deployment target was created with the correct type
        containerResource.TryGetLastAnnotation<DeploymentTargetAnnotation>(out var target);
        var provisioningResource = target?.DeploymentTarget as AzureContainerAppResource;
        Assert.NotNull(provisioningResource);
 
        Assert.Same(container.Resource, provisioningResource.TargetResource);
    }
 
    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "ExecuteBeforeStartHooksAsync")]
    private static extern Task ExecuteBeforeStartHooksAsync(DistributedApplication app, CancellationToken cancellationToken);
 
    private sealed class Project : IProjectMetadata
    {
        public string ProjectPath => "project";
    }
}