| File: DistributedApplicationModelExtensionsTests.cs | Web Access |
| Project: src\tests\Aspire.Hosting.Tests\Aspire.Hosting.Tests.csproj (Aspire.Hosting.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.Utils; using Microsoft.Extensions.DependencyInjection; namespace Aspire.Hosting.Tests; [Trait("Partition", "5")] public class DistributedApplicationModelExtensionsTests { [Fact] public void GetComputeResources_Returns_Containers_Emulators_And_Projects_Excludes_Ignored() { using var builder = TestDistributedApplicationBuilder.Create(); var container1 = builder.AddContainer("container1", "image"); var container2 = builder.AddContainer("container2", "image"); var project = builder.AddProject<Projects.ServiceA>("ServiceA"); var emulator = builder.AddResource(new CustomResource() { Annotations = { new EmulatorResourceAnnotation() } }); var ignored = builder.AddContainer("container3", "image") .ExcludeFromManifest(); var notACompute = builder.AddExecutable("notACompute", "path/to/executable", "."); using var app = builder.Build(); var appModel = app.Services.GetRequiredService<DistributedApplicationModel>(); var result = appModel.GetComputeResources().ToList(); Assert.Collection(result, item => Assert.Equal(container1.Resource, item), item => Assert.Equal(container2.Resource, item), item => Assert.Equal(project.Resource, item), item => Assert.Equal(emulator.Resource, item)); } [Fact] public void GetBuildAndPushResources_Returns_Projects_And_Resources_With_Dockerfiles_Excludes_BuildOnly_And_Ignored() { using var builder = TestDistributedApplicationBuilder.Create(); // Projects always require build and push var project = builder.AddProject<Projects.ServiceA>("ServiceA"); // Regular containers don't require build/push (they use existing images) var regularContainer = builder.AddContainer("regularContainer", "image"); // Containers with DockerfileBuildAnnotation require build and push var containerWithDockerfile = builder.AddContainer("containerWithDockerfile", "image"); containerWithDockerfile.Resource.Annotations.Add(new DockerfileBuildAnnotation("/context", "/Dockerfile", null)); // Build-only containers (no entrypoint) should be excluded var buildOnlyContainer = builder.AddContainer("buildOnlyContainer", "image"); buildOnlyContainer.Resource.Annotations.Add(new DockerfileBuildAnnotation("/context", "/Dockerfile", null) { HasEntrypoint = false }); // Excluded resources should not be returned var ignored = builder.AddProject<Projects.ServiceB>("ServiceB") .ExcludeFromManifest(); using var app = builder.Build(); var appModel = app.Services.GetRequiredService<DistributedApplicationModel>(); var result = appModel.GetBuildAndPushResources().ToList(); Assert.Collection(result, item => Assert.Equal(project.Resource, item), item => Assert.Equal(containerWithDockerfile.Resource, item)); } private sealed class CustomResource : IResource { public string Name { get; set; } = "CustomResource"; public ResourceAnnotationCollection Annotations { get; } = []; } }