File: IntegrationTests.cs
Web Access
Project: src\tests\Aspire.Hosting.NodeJs.Tests\Aspire.Hosting.NodeJs.Tests.csproj (Aspire.Hosting.NodeJs.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 Microsoft.Extensions.DependencyInjection;
 
namespace Aspire.Hosting.NodeJs.Tests;
 
/// <summary>
/// Integration test that demonstrates the new resource-based package installer architecture.
/// This shows how installer resources appear as separate resources in the application model.
/// </summary>
public class IntegrationTests
{
    [Fact]
    public void ResourceBasedPackageInstallersAppearInApplicationModel()
    {
        var builder = DistributedApplication.CreateBuilder();
 
        // Add a vite app with the npm package manager
        builder.AddViteApp("vite-app", "./frontend")
            .WithNpm(install: true);
 
        using var app = builder.Build();
        var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
 
        // Verify all Node.js app resources are present
        var nodeResources = appModel.Resources.OfType<NodeAppResource>().ToList();
        Assert.Single(nodeResources);
 
        // Verify all installer resources are present as separate resources
        var npmInstallers = appModel.Resources.OfType<NodeInstallerResource>().ToList();
 
        Assert.Single(npmInstallers);
 
        // Verify installer resources have expected names (would appear on dashboard)
        Assert.Equal("vite-app-installer", npmInstallers[0].Name);
 
        // Verify parent-child relationships
        foreach (var installer in npmInstallers.Cast<IResource>())
        {
            Assert.True(installer.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var relationships));
            Assert.Single(relationships);
            Assert.Equal("Parent", relationships.First().Type);
        }
 
        // Verify all Node.js apps wait for their installers
        foreach (var nodeApp in nodeResources)
        {
            Assert.True(nodeApp.TryGetAnnotationsOfType<WaitAnnotation>(out var waitAnnotations));
            Assert.Single(waitAnnotations);
 
            var waitedResource = waitAnnotations.First().Resource;
            Assert.True(waitedResource is NodeInstallerResource);
        }
    }
 
    [Fact]
    public void InstallerResourcesHaveCorrectExecutableConfiguration()
    {
        var builder = DistributedApplication.CreateBuilder();
 
        builder.AddNpmApp("test-app", "./test")
            .WithNpm(install: true);
 
        using var app = builder.Build();
        var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
 
        var installer = Assert.Single(appModel.Resources.OfType<NodeInstallerResource>());
 
        // Verify it's configured as an ExecutableResource
        Assert.IsAssignableFrom<ExecutableResource>(installer);
 
        // Verify working directory matches parent
        var parentApp = Assert.Single(appModel.Resources.OfType<NodeAppResource>());
        Assert.Equal(parentApp.WorkingDirectory, installer.WorkingDirectory);
 
        // Verify parent-child relationship exists
        Assert.True(installer.TryGetAnnotationsOfType<ResourceRelationshipAnnotation>(out var relationships));
        var relationship = Assert.Single(relationships);
        Assert.Same(parentApp, relationship.Resource);
        Assert.Equal("Parent", relationship.Type);
    }
}