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.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 AddFoundryProject_CreatesAccountAndProject()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundryProject("my-project");
 
        Assert.IsType<AzureCognitiveServicesProjectResource>(project.Resource);
        Assert.Equal("my-project", project.Resource.Name);
 
        // Should also create a parent account
        var account = builder.Resources.OfType<FoundryResource>().SingleOrDefault();
        Assert.NotNull(account);
        Assert.Same(account, project.Resource.Parent);
    }
 
    [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);
    }
 
    [Fact]
    public void AddFoundryProject_ResourceIsCreated()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
        var project = builder.AddFoundryProject("my-project");
 
        // If the resource was created, the basic infrastructure is functional
        Assert.NotNull(project.Resource);
        Assert.IsType<AzureCognitiveServicesProjectResource>(project.Resource);
    }
}