File: ProjectResourceTests.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.
 
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Azure;
using Aspire.Hosting.Utils;
 
namespace Aspire.Hosting.Foundry.Tests;
 
public class ProjectResourceTests
{
    [Fact]
    public void AddProject_CreatesProjectWithCorrectParent()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var account = builder.AddFoundry("account");
        var project = account.AddProject("my-project");
 
        Assert.IsType<AzureCognitiveServicesProjectResource>(project.Resource);
        Assert.Equal("my-project", project.Resource.Name);
        Assert.Same(account.Resource, project.Resource.Parent);
    }
 
    [Fact]
    public void AddProject_ReferencesDefaultContainerRegistryForProvisioningOrdering()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var registry = project.Resource.ContainerRegistry;
        Assert.NotNull(registry);
        Assert.Same(project.Resource.DefaultContainerRegistry, registry);
    }
 
    [Fact]
    public void AddProject_InRunMode_ModelsDefaultContainerRegistry()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Run);
 
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        Assert.Empty(builder.Resources.OfType<AzureContainerRegistryResource>());
        Assert.Same(project.Resource.DefaultContainerRegistry, project.Resource.ContainerRegistry);
    }
 
    [Fact]
    public void WithContainerRegistry_ReferencesExplicitContainerRegistryForProvisioningOrdering()
    {
        using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
 
        var registry = builder.AddAzureContainerRegistry("registry");
        var project = builder.AddFoundry("account")
            .AddProject("my-project")
            .WithContainerRegistry(registry);
 
        Assert.Same(registry.Resource, project.Resource.ContainerRegistry);
        Assert.True(project.Resource.TryGetLastAnnotation<ContainerRegistryReferenceAnnotation>(out var annotation));
        Assert.Same(registry.Resource, annotation.Registry);
    }
 
    [Fact]
    public void ConnectionStringExpression_HasCorrectFormat()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var expr = project.Resource.ConnectionStringExpression;
        Assert.Equal("Endpoint={my-project.outputs.endpoint}", expr.ValueExpression);
    }
 
    [Fact]
    public void UriExpression_ReferencesEndpointOutput()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var expr = project.Resource.UriExpression;
        Assert.Equal("{my-project.outputs.endpoint}", expr.ValueExpression);
    }
 
    [Fact]
    public void GetConnectionProperties_ReturnsUriAndConnectionString()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var properties = ((IResourceWithConnectionString)project.Resource)
            .GetConnectionProperties()
            .ToArray();
 
        Assert.Equal(3, properties.Length);
        Assert.Equal("Uri", properties[0].Key);
        Assert.Equal("{my-project.outputs.endpoint}", properties[0].Value.ValueExpression);
        Assert.Equal("ConnectionString", properties[1].Key);
        Assert.Equal("ApplicationInsightsConnectionString", properties[2].Key);
        Assert.Equal("{my-project.outputs.APPLICATION_INSIGHTS_CONNECTION_STRING}", properties[2].Value.ValueExpression);
    }
 
    [Fact]
    public void WithAppInsights_SetsAppInsightsResource()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var appInsights = builder.AddAzureApplicationInsights("ai");
        var project = builder.AddFoundry("account")
            .AddProject("my-project")
            .WithAppInsights(appInsights);
 
        Assert.Same(appInsights.Resource, project.Resource.AppInsights);
    }
 
    [Fact]
    public void AddModelDeployment_AddsDeploymentToParentFoundry()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var deployment = project.AddModelDeployment("chat", "gpt-4", "1.0", "OpenAI");
 
        Assert.NotNull(deployment);
        Assert.Equal("chat", deployment.Resource.Name);
        Assert.Equal("gpt-4", deployment.Resource.ModelName);
    }
 
    [Fact]
    public void AddModelDeployment_WithModel_AddsDeployment()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        var model = new FoundryModel { Name = "gpt-4", Version = "1.0", Format = "OpenAI" };
        var deployment = project.AddModelDeployment("chat", model);
 
        Assert.NotNull(deployment);
        Assert.Equal("chat", deployment.Resource.Name);
    }
 
    [Fact]
    public void AddCapabilityHost_SetsCapabilityHostConfiguration()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var cosmosDb = builder.AddAzureCosmosDB("cosmos");
        var storage = builder.AddAzureStorage("storage");
        var search = builder.AddAzureSearch("search");
 
        var project = builder.AddFoundry("account")
            .AddProject("my-project");
 
        project.AddCapabilityHost("cap-host")
            .WithCosmosDB(cosmosDb)
            .WithStorage(storage)
            .WithSearch(search);
 
        Assert.NotNull(project.Resource.CapabilityHostConfiguration);
        Assert.Equal("cap-host", project.Resource.CapabilityHostConfiguration.Name);
        Assert.Same(cosmosDb.Resource, project.Resource.CapabilityHostConfiguration.CosmosDB);
        Assert.Same(storage.Resource, project.Resource.CapabilityHostConfiguration.Storage);
        Assert.Same(search.Resource, project.Resource.CapabilityHostConfiguration.Search);
    }
 
    [Fact]
    public void AddCapabilityHost_WithOptionalOpenAI_SetsAzureOpenAI()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var cosmosDb = builder.AddAzureCosmosDB("cosmos");
        var storage = builder.AddAzureStorage("storage");
        var search = builder.AddAzureSearch("search");
        var foundry = builder.AddFoundry("account");
 
        var project = foundry.AddProject("my-project");
 
        project.AddCapabilityHost("cap-host")
            .WithCosmosDB(cosmosDb)
            .WithStorage(storage)
            .WithSearch(search)
            .WithAzureOpenAI(foundry);
 
        Assert.NotNull(project.Resource.CapabilityHostConfiguration);
        Assert.Same(foundry.Resource, project.Resource.CapabilityHostConfiguration.AzureOpenAI);
    }
 
}