Skip to content

Commit e9c206e

Browse files
committed
Add tests and update snapshots
1 parent 365271e commit e9c206e

7 files changed

+338
-12
lines changed

tests/Aspire.Hosting.Azure.Tests/AzureContainerAppsTests.cs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
#pragma warning disable ASPIRECOMPUTE002 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
66
#pragma warning disable ASPIREAZURE002 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
77
#pragma warning disable ASPIREDOCKERFILEBUILDER001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
8+
#pragma warning disable ASPIREPIPELINES001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
89

910
using System.Text.Json.Nodes;
1011
using Aspire.Hosting.ApplicationModel;
1112
using Aspire.Hosting.Azure.AppContainers;
13+
using Aspire.Hosting.Pipelines;
1214
using Aspire.Hosting.Utils;
1315
using Azure.Provisioning;
1416
using Azure.Provisioning.AppContainers;
@@ -2051,4 +2053,89 @@ public async Task GetHostAddressExpression()
20512053
Assert.Equal(env.Resource, output.Resource);
20522054
Assert.Equal("AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN", output.Name);
20532055
}
2056+
2057+
[Fact]
2058+
public async Task ContainerAppProvisionDependsOnTargetPushStep()
2059+
{
2060+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
2061+
2062+
builder.AddAzureContainerAppEnvironment("env");
2063+
builder.AddProject<Project>("api", launchProfileName: null)
2064+
.WithHttpEndpoint();
2065+
2066+
using var app = builder.Build();
2067+
await ExecuteBeforeStartHooksAsync(app, default);
2068+
2069+
var model = app.Services.GetRequiredService<DistributedApplicationModel>();
2070+
var projectResource = Assert.Single(model.GetProjectResources());
2071+
2072+
projectResource.TryGetLastAnnotation<DeploymentTargetAnnotation>(out var target);
2073+
var containerAppResource = target?.DeploymentTarget as AzureContainerAppResource;
2074+
Assert.NotNull(containerAppResource);
2075+
2076+
var configAnnotations = containerAppResource.Annotations.OfType<PipelineConfigurationAnnotation>().ToList();
2077+
Assert.NotEmpty(configAnnotations);
2078+
}
2079+
2080+
[Fact]
2081+
public async Task EnvironmentCreatesDefaultAcrWhenNoExplicitRegistry()
2082+
{
2083+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
2084+
2085+
builder.AddAzureContainerAppEnvironment("env");
2086+
2087+
builder.AddProject<Project>("api", launchProfileName: null)
2088+
.WithHttpEndpoint();
2089+
2090+
using var app = builder.Build();
2091+
await ExecuteBeforeStartHooksAsync(app, default);
2092+
2093+
var model = app.Services.GetRequiredService<DistributedApplicationModel>();
2094+
2095+
var acrResources = model.Resources.OfType<AzureContainerRegistryResource>().ToList();
2096+
Assert.Single(acrResources);
2097+
2098+
var defaultAcr = acrResources[0];
2099+
Assert.Contains("acr", defaultAcr.Name);
2100+
}
2101+
2102+
[Fact]
2103+
public async Task DefaultAcrNotAddedToModelWhenExplicitRegistryExists()
2104+
{
2105+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
2106+
2107+
var customRegistry = builder.AddAzureContainerRegistry("customregistry");
2108+
builder.AddAzureContainerAppEnvironment("env")
2109+
.WithAzureContainerRegistry(customRegistry);
2110+
2111+
builder.AddProject<Project>("api", launchProfileName: null)
2112+
.WithHttpEndpoint();
2113+
2114+
using var app = builder.Build();
2115+
await ExecuteBeforeStartHooksAsync(app, default);
2116+
2117+
var model = app.Services.GetRequiredService<DistributedApplicationModel>();
2118+
2119+
var acrResources = model.Resources.OfType<AzureContainerRegistryResource>().ToList();
2120+
Assert.Single(acrResources);
2121+
Assert.Equal("customregistry", acrResources[0].Name);
2122+
}
2123+
2124+
[Fact]
2125+
public async Task EnvironmentDelegatesToAssociatedRegistry()
2126+
{
2127+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
2128+
2129+
var customRegistry = builder.AddAzureContainerRegistry("customregistry");
2130+
var env = builder.AddAzureContainerAppEnvironment("env")
2131+
.WithAzureContainerRegistry(customRegistry);
2132+
2133+
using var app = builder.Build();
2134+
await ExecuteBeforeStartHooksAsync(app, default);
2135+
2136+
var containerRegistryInterface = env.Resource as IContainerRegistry;
2137+
Assert.NotNull(containerRegistryInterface);
2138+
Assert.NotNull(containerRegistryInterface.Endpoint);
2139+
Assert.NotNull(containerRegistryInterface.Name);
2140+
}
20542141
}

tests/Aspire.Hosting.Azure.Tests/AzureContainerRegistryTests.cs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
#pragma warning disable ASPIREPIPELINES001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
5+
46
using Aspire.Hosting.ApplicationModel;
57
using Aspire.Hosting.Azure.AppContainers;
8+
using Aspire.Hosting.Pipelines;
69
using Aspire.Hosting.Utils;
710
using Azure.Provisioning.ContainerRegistry;
811
using Microsoft.Extensions.DependencyInjection;
@@ -127,6 +130,105 @@ await Verify(manifest.ToString(), "json")
127130
.AppendContentAsFile(bicep, "bicep");
128131
}
129132

133+
[Fact]
134+
public async Task AzureContainerRegistryHasLoginStep()
135+
{
136+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
137+
138+
var acr = builder.AddAzureContainerRegistry("acr");
139+
140+
using var app = builder.Build();
141+
await ExecuteBeforeStartHooksAsync(app, default);
142+
143+
var pipelineStepAnnotations = acr.Resource.Annotations.OfType<PipelineStepAnnotation>().ToList();
144+
Assert.True(pipelineStepAnnotations.Count >= 2);
145+
146+
var factoryContext = new PipelineStepFactoryContext
147+
{
148+
PipelineContext = null!,
149+
Resource = acr.Resource
150+
};
151+
152+
var allSteps = new List<PipelineStep>();
153+
foreach (var annotation in pipelineStepAnnotations)
154+
{
155+
allSteps.AddRange(await annotation.CreateStepsAsync(factoryContext));
156+
}
157+
158+
var loginStep = allSteps.FirstOrDefault(s => s.Name == "login-to-acr-acr");
159+
Assert.NotNull(loginStep);
160+
Assert.Contains("acr-login", loginStep.Tags);
161+
}
162+
163+
[Fact]
164+
public async Task LoginStepRequiredByPushPrereq()
165+
{
166+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
167+
168+
var acr = builder.AddAzureContainerRegistry("acr");
169+
170+
using var app = builder.Build();
171+
await ExecuteBeforeStartHooksAsync(app, default);
172+
173+
var pipelineStepAnnotations = acr.Resource.Annotations.OfType<PipelineStepAnnotation>().ToList();
174+
175+
var factoryContext = new PipelineStepFactoryContext
176+
{
177+
PipelineContext = null!,
178+
Resource = acr.Resource
179+
};
180+
181+
var allSteps = new List<PipelineStep>();
182+
foreach (var annotation in pipelineStepAnnotations)
183+
{
184+
allSteps.AddRange(await annotation.CreateStepsAsync(factoryContext));
185+
}
186+
187+
var loginStep = allSteps.FirstOrDefault(s => s.Name == "login-to-acr-acr");
188+
Assert.NotNull(loginStep);
189+
Assert.Contains(WellKnownPipelineSteps.PushPrereq, loginStep.RequiredBySteps);
190+
}
191+
192+
[Fact]
193+
public async Task AzureContainerRegistryHasProvisionStep()
194+
{
195+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
196+
197+
var acr = builder.AddAzureContainerRegistry("acr");
198+
199+
using var app = builder.Build();
200+
await ExecuteBeforeStartHooksAsync(app, default);
201+
202+
var pipelineStepAnnotations = acr.Resource.Annotations.OfType<PipelineStepAnnotation>().ToList();
203+
204+
var factoryContext = new PipelineStepFactoryContext
205+
{
206+
PipelineContext = null!,
207+
Resource = acr.Resource
208+
};
209+
210+
var allSteps = new List<PipelineStep>();
211+
foreach (var annotation in pipelineStepAnnotations)
212+
{
213+
allSteps.AddRange(await annotation.CreateStepsAsync(factoryContext));
214+
}
215+
216+
var provisionStep = allSteps.FirstOrDefault(s => s.Name == "provision-acr");
217+
Assert.NotNull(provisionStep);
218+
Assert.Contains(WellKnownPipelineTags.ProvisionInfrastructure, provisionStep.Tags);
219+
}
220+
221+
[Fact]
222+
public void LoginStepDependsOnProvisionStep()
223+
{
224+
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish);
225+
226+
var acr = builder.AddAzureContainerRegistry("acr");
227+
228+
var configAnnotations = acr.Resource.Annotations.OfType<PipelineConfigurationAnnotation>().ToList();
229+
Assert.True(configAnnotations.Count >= 2);
230+
}
231+
130232
private sealed class Project : IProjectMetadata
131233
{
132234
public string ProjectPath => "project";

tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.AzurePublishingContext_CapturesParametersAndOutputsCorrectly_WithSnapshot#00.verified.bicep

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,16 @@ module fe_roles_account 'fe-roles-account/fe-roles-account.bicep' = {
8787
}
8888
}
8989

90-
output acaEnv_acr_name string = acaEnv_acr.outputs.name
90+
output acaEnv_AZURE_CONTAINER_REGISTRY_NAME string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_NAME
9191

92-
output acaEnv_acr_loginServer string = acaEnv_acr.outputs.loginServer
92+
output acaEnv_AZURE_CONTAINER_REGISTRY_ENDPOINT string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT
9393

9494
output acaEnv_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID
9595

9696
output acaEnv_AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN string = acaEnv.outputs.AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN
9797

9898
output acaEnv_AZURE_CONTAINER_APPS_ENVIRONMENT_ID string = acaEnv.outputs.AZURE_CONTAINER_APPS_ENVIRONMENT_ID
9999

100-
output acaEnv_AZURE_CONTAINER_REGISTRY_ENDPOINT string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT
101-
102100
output fe_identity_id string = fe_identity.outputs.id
103101

104102
output storage_blobEndpoint string = storage.outputs.blobEndpoint

tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.PublishAsync_GeneratesMainBicep_WithSnapshots.verified.bicep

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ module fe_roles_storage 'fe-roles-storage/fe-roles-storage.bicep' = {
125125
}
126126
}
127127

128-
output acaEnv_acr_name string = acaEnv_acr.outputs.name
128+
output acaEnv_AZURE_CONTAINER_REGISTRY_NAME string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_NAME
129129

130-
output acaEnv_acr_loginServer string = acaEnv_acr.outputs.loginServer
130+
output acaEnv_AZURE_CONTAINER_REGISTRY_ENDPOINT string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT
131131

132132
output acaEnv_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID
133133

@@ -141,8 +141,6 @@ output account_connectionString string = account.outputs.connectionString
141141

142142
output myapp_identity_clientId string = myapp_identity.outputs.clientId
143143

144-
output acaEnv_AZURE_CONTAINER_REGISTRY_ENDPOINT string = acaEnv.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT
145-
146144
output fe_identity_id string = fe_identity.outputs.id
147145

148146
output storage_blobEndpoint string = storage.outputs.blobEndpoint

tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.WhenUsedWithAzureContainerAppsEnvironment_GeneratesProperBicep#00.verified.bicep

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ module env_acr 'env-acr/env-acr.bicep' = {
2929
}
3030
}
3131

32-
output env_acr_name string = env_acr.outputs.name
32+
output env_AZURE_CONTAINER_REGISTRY_NAME string = env.outputs.AZURE_CONTAINER_REGISTRY_NAME
3333

34-
output env_acr_loginServer string = env_acr.outputs.loginServer
34+
output env_AZURE_CONTAINER_REGISTRY_ENDPOINT string = env.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT
3535

3636
output env_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID string = env.outputs.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID
3737

tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.WhenUsedWithAzureContainerAppsEnvironment_RespectsStronglyTypedProperties.verified.bicep

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ module env_acr 'env-acr/env-acr.bicep' = {
2929
}
3030
}
3131

32-
output env_acr_name string = env_acr.outputs.name
32+
output env_AZURE_CONTAINER_REGISTRY_NAME string = env.outputs.AZURE_CONTAINER_REGISTRY_NAME
3333

34-
output env_acr_loginServer string = env_acr.outputs.loginServer
34+
output env_AZURE_CONTAINER_REGISTRY_ENDPOINT string = env.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT
3535

3636
output env_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID string = env.outputs.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID
3737

0 commit comments

Comments
 (0)